C#应用案例之打字母游戏

成品展示

在这里插入图片描述

编程思路

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("你的飞艇已被击败!!");  //提示你已被击败
           }

启动调试

猜你喜欢

转载自blog.csdn.net/Layfolk_XK/article/details/105994914