成品展示
编程思路
1.创建windows窗体,在窗体中添加panel空间用作游戏的游戏界面.
2.在游戏界面添加相应的游戏背景(BackgroundImage),飞机(picturebox)等控件.
3.用timer控件,每隔1秒创建随机的字母(label控件装字母),并确保字母产生的位置在游戏界面中.
4.再次新建timer控件,用来控制字母的下降.
5.创建键盘事件,再点击键盘按键与落下的字母一致时,将飞机移动到落下的字母下方.
6.飞机移动后,创建新的picturebox控件,用来充当飞机发射的子弹,并向上发射子弹.
7.用foreach,if等语句来判断子弹是否碰撞到字母,若击中字母,则释放子弹(picturebox)和字母(label).
8.在窗体的右上角(游戏界面以外)添加label控件,用来记录所得分数和失败次数.
编程代码
设置窗体属性
this.Size = new Size(1020,800); //设置窗体大小
this.Left = Screen.PrimaryScreen.Bounds.Width / 2 - this.Width / 2; //设置窗体的位置在屏幕中央
this.Top = Screen.PrimaryScreen.Bounds.Height / 2 - this.Height / 2;
创建panel控件并设置属性
Panel game= new Panel(); //创建panel对象 应在全局创建
game.Size = new Size(800,800); //设置panel的大小
game.BackColor = Color.White; //设置panel的背景颜色
game.BackgroundImage = Image.FromFile("../../images/背景图片.png");
game.BorderStyle = BorderStyle.Fixed3D; //设置panel的边框样式为3D
this.Controls.Add(game); //将panel加入到窗体中去
创建picture控件并设置属性
picturebox feiji=new picturebox(); //在全局创建picturebox控件
feiji.Tag = "fj";
feiji.BackgroundImage = Image.FromFile("../../images/飞机.png"); //添加飞机的图片
feiji.SizeMode = PictureBoxSizeMode.StretchImage; //设置飞机的大小
feiji.Size = new Size(100,120);
feiji.Left = game.Width / 2 - feiji.Width / 2; //设置飞机的位置
feiji.Top = game.Height - feiji.Height-30;
game.Controls.Add(feiji);
添加timer,设置频率并打开
timer1.Interval = 1000;
timer2.Interval = 100;
timer1.Start();
timer2.Start();
在timer1中创建字母
Random sj = new Random(); //在全局创建随机的对象
Label zimu = new Label(); //创建label用来装字母
zimu.Tag = "zm";
zimu.AutoSize = true; //空间大小随字母大小变化
zimu.Text = ((char)sj.Next(97,123)).ToString(); //随机字母
zimu.Left = sj.Next(game.Width); //使字母随机出现在panel中
zimu.Top = game.Top- 10;
zimu.Font = new Font("楷体",sj.Next(25,35)); //随机字母的大小
zimu.ForeColor = Color.FromArgb(sj.Next(0,255), sj.Next(0, 255), sj.Next(0, 255)); //随机字母的颜色
game.Controls.Add(zimu);
在timer2中控制字母下落
foreach (Control item in game.Controls)
{
if (item.Tag.ToString()=="zm")
{
item.Top += 10;
}
}
创建键盘事件
this.KeyPress += Form1_KeyPress;
设置飞机移动及子弹发射
foreach (Control item in game.Controls)
{
if (item.Text==e.KeyChar.ToString())
{
item.Tag = "djzm"; //用来区别同时下落两个相同的字母
feiji.Left = item.Left + item.Width / 2 - feiji.Width / 2;
PictureBox zidan = new PictureBox();
zidan.Tag = "zd";
zidan.BackgroundImage = Image.FromFile("../../images/子弹.png");
zidan.Size = new Size(8, 20);
zidan.BackgroundImageLayout = ImageLayout.Stretch;
zidan.Left = feiji.Left + feiji.Width / 2 - zidan.Width / 2;
zidan.Top = feiji.Top - zidan.Height;
game.Controls.Add(zidan);
return;
}
判断是否击中了字母(在tiemr中)将timer2补充完整
foreach (Control item in game.Controls)
{
if (item.Tag.ToString()=="zm" | item.Tag.ToString()=="djzm")
{
item.Top += 10;
}
if (item.Tag.ToString()=="zd")
{
item.Top -= 30;
foreach (Control it in game.Controls)
{
if (it.Tag.ToString()=="djzm")
{
if (item.Top<=it.Top)
{
it.Dispose();
item.Dispose();
}
}
}
}
在窗体添加计分板
Label defen = new Label();
Label shengming = new Label();
defen.Text = "您的得分为:";
shengming.Text = "您的剩余生命值为:";
defen.Location = new Point(game.Width+10,defen.Height);
shengming.Location = new Point(game.Width+10,defen.Height*3+20);
defen.Font = new Font("楷体",16F);
shengming.Font = new Font("楷体",16F);
defen.AutoSize = true;
shengming.AutoSize = true;
this.Controls.Add(defen);
this.Controls.Add(shengming);
lab1.Location = new Point(game.Width + 10, defen.Height * 2+10);
lab2.Location = new Point(game.Width + 10, defen.Height * 4+30);
lab1.AutoSize = true;
lab2.AutoSize = true;
lab1.Font= new Font("楷体",16F);
lab2.Font= new Font("楷体",16F);
lab1.Text = df.ToString();
lab2.Text = sm.ToString();
this.Controls.Add(lab1);
this.Controls.Add(lab2);
得分的计算方式为:
int df = 0; //在全局创建
int sm = 10;
Label lab1 = new Label();
Label lab2 = new Label();
每当子弹击中字母并释放字母和子弹时加分
df += 1;
lab1.Text = df.ToString()+"分";
每当字母下落超过飞机时减分(扣除生命值)
if (sm>=1)
{
sm -= 1;
lab2.Text = sm.ToString() + "点";
}
else
{
timer1.Stop();
timer2.Stop();
MessageBox.Show("你的飞艇已被击败!!"); //提示你已被击败
}
启动调试