C#打字游戏
程序员文章站
2022-07-16 19:47:11
...
效果图
需求分析
1、界面设计 布局
需要哪些内容控件???
容器概念
集合的概念
2、开始游戏
字母的生成 26个字母 ASCII 码值 -》键盘上任何键都对应一个ASCII码值
回忆:ASCII中 A-Z ??? a-z 97-122
字母载体 控件
字母、位置、大小、颜色
要求随机的
计时器
3、字母从上往下运动
TOP变化
注意:垃圾回收问题-》未消除的字母进行销毁-》释放资源
计时器
4、需要对应的从下往上生成字母子弹-》打掉字母
问题:怎么接受键盘输入的字母???
a、处理怎么和键盘交互-》键盘相关事件
b、字母需要转换-》ASCII
c、知识点:事件参数:EventArgs e
d、子弹从下往上运动
5、添加动画效果、音效等
代码如下
//添加panel控件,也就是游戏界面
Panel panel1 = new Panel();
//创建随机
Random sj = new Random();
//设置飞机
PictureBox plane = new PictureBox();
//添加爆炸音效
SoundPlayer sound1 = new SoundPlayer("../../sounds/Bomb.wav");
//创建开始按钮与暂停 继续
Button anniu1 = new Button();
//字母出现 设置计时器1
Timer timer1 = new Timer();
//字母下落 设置计时器2
Timer timer2 = new Timer();
int num = 0;
Label lab1 = new Label();
private void Form1_Load(object sender, EventArgs e)
{
//设置窗体大小
this.Width = 1000;
this.Height = 700;
//设置窗体居中显示
int x = Screen.PrimaryScreen.WorkingArea.Width / 2 - this.Width / 2;
int y = Screen.PrimaryScreen.WorkingArea.Height / 2 - this.Height / 2;
this.Location = new Point(x,y);
//设置游戏窗口属性
panel1.Width = 750;
panel1.Height = 650;
panel1.Left = 5;
panel1.Top = 10;
//设置边框样式
panel1.BorderStyle = BorderStyle.Fixed3D;
Controls.Add(panel1);
//选择飞机图片路径
plane.Image = Image.FromFile("../../img/plane1.png");
//设置控件与图片自适应大小
plane.SizeMode = PictureBoxSizeMode.AutoSize;
//设置飞机位置
plane.Location = new Point(panel1.Width/2-plane.Width/2,panel1.Height-plane.Height);
//设置飞机标签
plane.Tag = "feiji";
panel1.Controls.Add(plane);
timer1.Tick += Timer1_Tick;
//设置计时器的频率,也就是字母出现的频率
timer1.Interval = 1000;
//timer1.Start();
timer2.Tick += Timer2_Tick;
//设置字母下落的速度
timer2.Interval = 50;
//timer2.Start();
//设置按钮
anniu1.Location = new Point(830, 100);
anniu1.Text = "开始游戏";
//设置三维边框
anniu1.FlatStyle = FlatStyle.Popup;
//设置按钮的大小
anniu1.Size = new Size(100, 50);
anniu1.Click += Anniu1_Click;
this.Controls.Add(anniu1);
Label lab2 = new Label();
lab2.Size = new Size(300, 100);
lab2.Location = new Point(800, 300);
lab2.Text = "您的分数";
lab2.Font = new Font("黑体", 24);
this.Controls.Add(lab2);
lab1.Size = new Size(100, 100);
lab1.Location = new Point(850, 400);
lab1.Font = new Font("黑体", 24);
lab1.ForeColor = Color.Red;
this.Controls.Add(lab1);
//添加键盘事件
this.KeyPress += Form1_KeyPress;
KeyPreview = true;
}
private void Anniu1_Click(object sender, EventArgs e)
{
//点击暂停游戏按钮-》游戏暂停 按钮文本游戏开始
if (anniu1.Text == "开始游戏")
{
anniu1.Text = "暂停游戏";
//进行字母生成
timer1.Start();
//字母运动
timer2.Start();
}
else if (anniu1.Text == "暂停游戏")
{
anniu1.Text = "开始游戏";
timer1.Stop();
timer2.Stop();
}
}
private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
foreach (Control item in panel1.Controls)
{
if (item.Text==e.KeyChar.ToString())
{
item.Tag = "bb";
//飞机出现在字母的正下方
plane.Left = item.Left + item.Width / 2 - plane.Width / 2;
//设置子弹
PictureBox zidan = new PictureBox();
//子弹文件的路径
zidan.Image = Image.FromFile("../../img/Ammo4.png");
//子弹根据控件自动拉伸
zidan.SizeMode = PictureBoxSizeMode.StretchImage;
//设置子弹大小
zidan.Size = new Size(10, 20);
//子弹的位置由飞机中间发射
zidan.Left = plane.Left + plane.Width / 2 - zidan.Width / 2;
zidan.Top = panel1.Height - plane.Height-30;
//设置子弹的标签
zidan.Tag = "zidan";
panel1.Controls.Add(zidan);
// 解决一个子弹打掉多处的相同字母
return;
}
}
}
private void Timer2_Tick(object sender, EventArgs e)
{
foreach (Control item in panel1.Controls)
{
if (item.Tag.ToString()=="zimu"||item.Tag.ToString()=="bb")
{
lab1.Text = num.ToString();
//子弹向下掉落
item.Top +=5;
//如果字母掉出区域,则释放字母,防止出现子弹消除看不到的字母
if (item.Top>=panel1.Height)
{
item.Dispose();
num--;
}
}
//子弹向上发出
if (item.Tag.ToString()=="zidan")
{
item.Top-= 10;
foreach (Control it in panel1.Controls)
{
if (it.Tag.ToString()=="bb")
{
//如果子弹顶端碰撞到字母底端
if (item.Top<=it.Top+it.Height&&it.Left+it.Width/2==item.Left+item.Width/2)
{
//音频开启
sound1.Play();
//释放字母与子弹
item.Dispose();
it.Dispose();
num++;
//爆炸画面
PictureBox bomBox = new PictureBox();
bomBox.Size = new Size(50,50);
bomBox.Tag = 0;
bomBox.Location = new Point(it.Left + it.Width / 2 - bomBox.Width / 2, it.Top + it.Height / 2 - bomBox.Height / 2) ;
bomBox.Image = imageList1.Images[0];
panel1.Controls.Add(bomBox);
Timer bomTimer = new Timer();
bomTimer.Tick += BomTimer_Tick;
bomTimer.Tag = bomBox;
bomTimer.Interval = 50;
bomTimer.Start();
}
}
}
}
}
}
private void BomTimer_Tick(object sender, EventArgs e)
{
Timer bomtimer = (Timer)sender;
// 是从 bomtimer中获取 tag的属性值(而这个属性值是在上面 将bomBox 赋值给其tag的)
PictureBox picture = (PictureBox)bomtimer.Tag;
picture.Image = imageList1.Images[(int)picture.Tag];
picture.Tag = (int)picture.Tag + 1;
if ((int)picture.Tag > 31)
{
bomtimer.Dispose();
picture.Dispose();
}
}
private void Timer1_Tick(object sender, EventArgs e)
{
Label zimu = new Label();
//出现随机字母
zimu.Text = ((char)sj.Next(97,122)).ToString();
//字母随机颜色
zimu.ForeColor = Color.FromArgb(sj.Next(255), sj.Next(255), sj.Next(255));
//字母随机大小
zimu.Font = new Font("宋体", sj.Next(24, 36));
//字母随机位置
zimu.Left = sj.Next(panel1.Width - zimu.Width);
zimu.Top = -10;
//自动调整字母控件的大小而显示完整
zimu.AutoSize = true;
//设置字母的标签
zimu.Tag = "zimu";
panel1.Controls.Add(zimu);
}
}
上一篇: 7 数据预处理-数据标准化