当前位置: 移动技术网 > IT编程>开发语言>c# > C#纯代码实现打字游戏

C#纯代码实现打字游戏

2020年06月23日  | 移动技术网IT编程  | 我要评论
本文实例为大家分享了c#实现打字游戏的具体代码,供大家参考,具体内容如下一、需求分析1、界面设计 布局 需要哪些内容控件 容器的概念 集合的概念 2、开始游戏 字母的生成 26个字母 asc

 本文实例为大家分享了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经典小游戏汇总

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网