C#纯代码实现打字游戏

 更新时间:2020年6月25日 10:34  点击:1793

 本文实例为大家分享了C#实现打字游戏的具体代码,供大家参考,具体内容如下

一、需求分析

1、界面设计 布局

  • 需要哪些内容控件
  • 容器的概念
  • 集合的概念

2、开始游戏

  • 字母的生成 26个字母 ASCII码值
  • 字母的载体 控件
  • 字母、位置、大小、颜色
  • 要求随机的
  • 计时器

3、字母从上往下运动

  • TOP变化
  • 注意:垃圾回收问题,未消除的字母进行销毁,释放资源
  • 计时器

4、需要产生对应的从下往上生成字母子弹,打掉字母

  • 处理与键盘之间的交互,键盘相关事件
  • 字母需要转换,ASCII码值
  • 知识点:事件参数:EventArgs e
  • 子弹从下往上运动
  • 子弹与字母相遇,两者消失

5、添加动画效果、音效等

二、代码实现

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
//导入媒体命名空间
using System.Media;

namespace PlaneTest_02
{
 public partial class Form1 : Form
 {
 public Form1()
 {
 InitializeComponent();
 }

 //初始化panel
 Panel game = new Panel();
 //初始化pictureBox
 PictureBox plane = new PictureBox();
 //初始化一个播放器
 SoundPlayer sound = new SoundPlayer();
 //创建爆炸效果图
 ImageList imageList = new ImageList();
 //初始化随机数对象
 Random ra = new Random();
 //添加timer1,控制字母生成
 Timer timer1 = new Timer();
 //添加timer2,控制字母、子弹运动
 Timer timer2 = new Timer();
 //添加timer3,控制爆炸效果图的播放
 Timer timer3 = new Timer();
 //设置游戏开始按钮
 Button beginBtn = new Button();
 //实现记录分数
 Label result = new Label();
 //记录分数
 int count = 0;
 //实现记录失误
 Label list = new Label();
 //记录失误
 int rex = 0;
 private void Form1_Load(object sender, EventArgs e)
 {
 //设置窗体属性
 this.Text = "天天打字母";
 this.Size = new Size(1000,700);
 this.CenterToScreen();
 //设置game属性
 game.Size = new Size(800,650);
 game.BackColor = Color.SkyBlue;
 game.BorderStyle = BorderStyle.Fixed3D;
 game.Location = new Point(5,5);
 this.Controls.Add(game);
 //设置plane属性
 plane.Image = Image.FromFile("../../images/plane/plane4.png");
 plane.SizeMode = PictureBoxSizeMode.AutoSize;
 plane.Location = new Point(game.Width/2-plane.Width/2,game.Height-plane.Height);
 plane.Tag = "plane";
 game.Controls.Add(plane);
 //设置timer1属性,此计时器控制字母生成
 timer1.Tick += Timer1_Tick;
 timer1.Interval = 1000;
 //设置timer2属性,此计时器控制字母运动
 timer2.Tick += Timer2_Tick;
 timer2.Interval = 200;
 //添加键盘按下事件
 this.KeyPress += Form1_KeyPress;
 //设置按钮属性
 beginBtn.Text = "开始游戏";
 beginBtn.Size = new Size(100,30);
 beginBtn.Location = new Point(game.Width+50, 20);
 this.Controls.Add(beginBtn);
 //生成按钮点击事件
 beginBtn.Click += BeginBtn_Click;
 //设置记录分数label的属性
 result.Size = new Size(50,50);
 result.BackColor = Color.White;
 result.Location = new Point(beginBtn.Left+ beginBtn.Width/2-result.Width/2, beginBtn.Top+ beginBtn.Height+10);
 result.TextAlign = ContentAlignment.MiddleCenter;
 result.Font = new Font("楷体", 22);
 result.ForeColor = Color.Green;
 this.Controls.Add(result);
 //设置记录失误label的属性
 list.Size = new Size(50, 50);
 list.BackColor = Color.White;
 list.Location = new Point(beginBtn.Left + beginBtn.Width / 2 - list.Width / 2, result.Top + result.Height + 10);
 list.TextAlign = ContentAlignment.MiddleCenter;
 list.Font = new Font("楷体", 22);
 list.ForeColor = Color.Red;
 this.Controls.Add(list);
 }
 /// <summary>
 /// 按钮点击事件
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void BeginBtn_Click(object sender, EventArgs e)
 {
 if (beginBtn.Text == "开始游戏")
 {
 //开启计时器
 timer1.Start();
 timer2.Start();
 timer3.Start();
 beginBtn.Text = "暂停游戏";
 //开启窗体获取键盘事件的焦点
 this.KeyPreview = true;
 }
 else
 {
 //关闭计时器
 timer1.Stop();
 timer2.Stop();
 timer3.Stop();
 beginBtn.Text = "开始游戏";
 //关闭窗体获取键盘事件的焦点
 this.KeyPreview = false;
 }
 
 }

 /// <summary>
 /// 字母生成
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void Timer1_Tick(object sender, EventArgs e)
 {
 //初始化label
 Label zimu = new Label();
 zimu.Text = ((char)ra.Next(97, 123)).ToString();
 zimu.ForeColor = Color.FromArgb(ra.Next(255), ra.Next(255), ra.Next(255));
 zimu.Font = new Font("楷体",ra.Next(30, 41));
 zimu.Location = new Point(ra.Next(game.Width - zimu.Width),0);
 zimu.AutoSize = true;
 zimu.TextAlign = ContentAlignment.MiddleCenter;
 zimu.Tag = "zimu";
 game.Controls.Add(zimu);
 }
 /// <summary>
 /// 字母运动
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void Timer2_Tick(object sender, EventArgs e)
 {
 result.Text = count.ToString();
 list.Text = rex.ToString();
 //遍历panel中的控件
 foreach (Control item in game.Controls)
 {
 //判断控制为label
 if (item.GetType().Name == "Label")
 {
  //判断其tag为字母的tag
  if (item.Tag.ToString() == "zimu" || item.Tag.ToString() == "change")
  {
  item.Top += 10;
  //释放资源
  if (item.Top > plane.Top - 40)
  {
  rex++;
  item.Dispose();
  }
  }
 }
 //判断为PictureBox
 if (item.GetType().Name == "PictureBox")
 {
  //判断其tag为子弹的tag
  if (item.Tag.ToString() == "zidan")
  {
  item.Top -= 40;
  //判断字母与子弹相遇
  //遍历panel中的所有控件
  foreach (Control it in game.Controls)
  {
  //判断控件类型
  if (it.GetType().Name == "Label")
  {
  //判断tag
  if (it.Tag.ToString() == "change")
  {
   //判断相遇
   if (it.Top + it.Height >= item.Top)
   {
   count++;
   //销毁
   item.Dispose();
   it.Dispose();
   //添加爆炸音效
   //设置路径
   sound.SoundLocation = "../../sound/Bomb.wav";
   //播放
   sound.Play();
   //设置爆炸效果图大小
   imageList.ImageSize = new Size(50, 50);
   //创建爆炸图片
   PictureBox Bomb = new PictureBox();
   Bomb.Size = new Size(50, 50);
   Bomb.Tag = 0;
   Bomb.Location = new Point(it.Left+it.Width/2-Bomb.Width/2,it.Top+it.Height/2-Bomb.Height/2);
   game.Controls.Add(Bomb);
   //创建字符串表示路径
   string path;
   for (int i = 0; i < 32; i++)
   {
   if (i<10)
   {
   path = String.Concat("../../images/Bomb/1000", i.ToString(), ".png");
   }
   else
   {
   path = String.Concat("../../images/Bomb/100", i.ToString(), ".png");
   }
   imageList.Images.Add(Image.FromFile(path));
   Bomb.Image = imageList.Images[Convert.ToInt32(Bomb.Tag)];
   }
   //设置控制爆炸图播放效果计时器(timer3)的属性
   timer3.Tick += Timer3_Tick;
   timer3.Tag = Bomb;
   timer3.Interval = 30;
   timer3.Start();
   }
  }
  }
  }
  }
 }
 }
 }
 /// <summary>
 /// 控制爆炸图片
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void Timer3_Tick(object sender, EventArgs e)
 {
 //通过事件发起者(sender),获取计时器的tag
 Timer timerBox = sender as Timer;
 //通过计时器的tag,找到Bomb的tag
 PictureBox pictureBox = timerBox.Tag as PictureBox;
 //pictureBox的image与imageList的images相关联
 pictureBox.Image = imageList.Images[Convert.ToInt32(pictureBox.Tag)];
 //给pictureBox的tag+1
 pictureBox.Tag = Convert.ToInt32(pictureBox.Tag) + 1;
 if (Convert.ToInt32(pictureBox.Tag) >= 31)
 {
 timerBox.Dispose();
 pictureBox.Dispose();
 }

 }
 /// <summary>
 /// 键盘事件
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void Form1_KeyPress(object sender, KeyPressEventArgs e)
 {
 //遍历panel中的控件
 foreach (Control item in game.Controls)
 {
 //判断是控件
 if (item.GetType().Name == "Label")
 {
  //判断其tag是字母
  if (item.Tag.ToString() == "zimu")
  {
  if (item.Text == e.KeyChar.ToString())
  {
  //改变字母的tag
  item.Tag = "change";
  //改变plane坐标
  plane.Location = new Point(item.Left + item.Width / 2 - plane.Width / 2, game.Height - plane.Height);
  //生成子弹
  PictureBox zidan = new PictureBox();
  zidan.Image = Image.FromFile("../../images/Bullet/Ammo_enemy3.png");
  zidan.SizeMode = PictureBoxSizeMode.AutoSize;
  zidan.Tag = "zidan";
  zidan.Location = new Point(item.Left + item.Width / 2 - zidan.Width / 2, game.Height - plane.Height);
  game.Controls.Add(zidan);
  //字母与子弹对应,则跳出当前循环
  return;
  }
  }
 }
 }
 }
 }
}

三、运行结果

更多有趣的经典小游戏实现专题,也分享给大家:

C++经典小游戏汇总

python经典小游戏汇总

python俄罗斯方块游戏集合

JavaScript经典游戏 玩不停

java经典小游戏汇总

javascript经典小游戏汇总

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。

[!--infotagslink--]

相关文章

  • C#实现简单的登录界面

    我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
  • 浅谈C# 字段和属性

    这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • C#实现简单的Http请求实例

    这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • C#中new的几种用法详解

    本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
  • 使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)

    这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • C#和JavaScript实现交互的方法

    最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • 轻松学习C#的基础入门

    轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • C#绘制曲线图的方法

    这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • c#自带缓存使用方法 c#移除清理缓存

    这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
  • c#中(&&,||)与(&,|)的区别详解

    这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • 经典实例讲解C#递归算法

    这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#中list用法实例

    这篇文章主要介绍了C#中list用法,结合实例形式分析了C#中list排序、运算、转换等常见操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25