欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#纯代码实现打字游戏

程序员文章站 2024-01-24 08:34:10
本文实例为大家分享了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#纯代码实现打字游戏

C#纯代码实现打字游戏

C#纯代码实现打字游戏

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

c++经典小游戏汇总

python经典小游戏汇总

python俄罗斯方块游戏集合

javascript经典游戏 玩不停

java经典小游戏汇总

javascript经典小游戏汇总

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

相关标签: C# 打字