这篇文章主要介绍了这篇文章主要为大家详细介绍了C#纯代码实现打字游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了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经典小游戏汇总
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持得得之家。
沃梦达教程
本文标题为:C#纯代码实现打字游戏
基础教程推荐
猜你喜欢
- C# windows语音识别与朗读实例 2023-04-27
- C# 调用WebService的方法 2023-03-09
- winform把Office转成PDF文件 2023-06-14
- linux – 如何在Debian Jessie中安装dotnet core sdk 2023-09-26
- C# List实现行转列的通用方案 2022-11-02
- C#类和结构详解 2023-05-30
- unity实现动态排行榜 2023-04-27
- 一个读写csv文件的C#类 2022-11-06
- C#控制台实现飞行棋小游戏 2023-04-22
- ZooKeeper的安装及部署教程 2023-01-22