打字母案例完整版(C#)

打字母案例最终篇

打字母案例思路

1,添加panel面板,进行界面的划分(划分为游戏区域还有控制区域)

 Panel pan1 = new Panel();//创建panel1区域,就是游戏区域,用于存放控件集合
        PictureBox pic1 = new PictureBox();//创建picturebox,导入飞机图片
        int num = 0;//定义一个整形num=0用于计时器t3爆炸效果图的开始
        SoundPlayer sound = new SoundPlayer("../../yingxiao/Bomb.wav");//导入爆炸时触发的音效
        int i = 0, j = 0;//定义两个整形,分别用于计算得分和失分
        Timer t1 = new Timer();//创建计时器t1
        Timer t2 = new Timer();//创建计时器t2
        private void Form1_Load(object sender, EventArgs e)
        {
            this.Text = "字母消消乐";//定义窗体名称
            //还有窗体的长宽还有窗体在屏幕中的位置
            this.Width = 1000;
            this.Height = 650;
            this.CenterToScreen();
            //定义panel1的大小还有背景颜色,边框样式,在窗体中的位置等
            pan1.Size = new Size(800, 600);
            pan1.BackColor = Color.Pink;
            pan1.BorderStyle = BorderStyle.Fixed3D;
            pan1.Left = 10;
            pan1.Top = 5;
            this.Controls.Add(pan1);//将panel1添加到窗体中

2,随机字母的创建和随机位置

计时器T1的事件

 Random ra = new Random();//定义随机变量ra
        private void T1_Tick(object sender, EventArgs e)
        {
            Label label1 = new Label();//创建label控件取名为label1
            label1.Text = ((char)ra.Next(65, 91)).ToString();//label1控件里面的内容为随机字母
            label1.AutoSize = true;//label1的大小为自适应
            label1.Tag = "zm";//label1的tag为zm
            //进行label1中字母的字体还颜色还有大小的随机
            string[] ziti = { "宋体", "楷体", "Arial", "Verdana", "Comic Sans MS", "Impact", "Haettenschweiler", "Lucida Sans Unicode", "Garamond" };
             label1.Font = new Font(ziti[ra.Next(9)], ra.Next(15, 30));
            label1.ForeColor = Color.FromArgb(ra.Next(0, 255), ra.Next(0, 255), ra.Next(0, 255));
            label1.Left = ra.Next(pan1.Width - label1.Width);//防止出现屏幕边缘只显示半个字母的问题
            label1.Top = -10;//使字母从屏幕顶端下落
            pan1.Controls.Add(label1);//将label1放在panel1中

        }
       
    }
}

3,飞机的生成

 pic1.Tag = "fj";//定义创建的picturebox的tag
            pic1.Image = Image.FromFile("../../sucai/plane1.png");//导入飞机图片
            pic1.SizeMode = PictureBoxSizeMode.AutoSize;//设置飞机图片的拉伸效果
            //定义飞机在panel1中的初始位置
            int x = (pan1.Width - pic1.Width) / 2;
            int y = pan1.Height - pic1.Height;
            pic1.Location = new Point(x, y - 5);
            pan1.Controls.Add(pic1);//将pic1添加到panel1中

计时器t2,t1的初始频率

 t1.Tick += T1_Tick;//创建计时器t1的事件
            t1.Interval = 1000;//计时器t1的频率
            t2.Tick += T2_Tick;//创建计时器t2的事件
            t2.Interval = 200;//计时器t2的频率

4,子弹的生成以及键盘事件

 private void Form1_KeyPress(object sender, KeyPressEventArgs e)//键盘事件
        {
            foreach (Control item in pan1.Controls)//先进行遍历寻找panel1里面的所有控件
            {
                if (item.Text == e.KeyChar.ToString())//判断如果键盘上输入的按键字母在屏幕上有的话
                {
                    item.Tag = "bt";//将该字母的tag改为bt
                    pic1.Left = item.Left + item.Width / 2 - pic1.Width / 2;//然后将飞机移动到该字母正下方
                    PictureBox zd = new PictureBox(); //创建PictureBox,取名为zd
                    zd.Tag = "zidan";//设置zd的tag
                    zd.Image = Image.FromFile("../../sucai/PlayerBullet.png");//导入子弹图片放到zd里面
                    zd.SizeMode = PictureBoxSizeMode.StretchImage;//设置图片的自适应大小
                    zd.Size = new Size(15, 30);//设置zd控件的大小
                    zd.Left = pic1.Left + pic1.Width / 2 - zd.Width / 2;//然后让子弹从飞机的上方发出
                    zd.Top = pic1.Top - 10;
                    pan1.Controls.Add(zd);//将zd添加到panel1中
                    return;//表示每次只能在一个位置发射子弹


                }
            }
        }

5,字母的自动下落以及子弹和字母碰撞时,两者的释放还有爆炸效果和音效

private void T2_Tick(object sender, EventArgs e)
        {
            foreach (Control item in pan1.Controls)//遍历在panel1中的所有控件
            {
                if (item.Tag.ToString()=="zm"||item.Tag.ToString()=="bt")//如果字母控件的tag等于zm或者是等于bt
                {
                    item.Top += 20;//那么字母控件向下移动
                    if (item.Top + item.Height >= pic1.Top - 20)//如果字母控件的到达飞机顶部
                    {
                        //则直接释放
                        item.Dispose();
                    }
                }
                if (item.Tag.ToString()=="zidan")//如果子弹控件的tag等于zidan
                {
                    item.Top -= 20;//那么该控件向上移动
                    foreach (Control it in pan1.Controls)//在panel1中进行遍历所有控件
                    {
                        
                        if (it.Tag.ToString()=="bt")//如果字母控件的tag等于bt
                        {
                            //那么再次进行判断
                            if (it.Top+it.Height>=item.Top&&it.Left+it.Width/2==item.Left+item.Width/2)//如果子弹控件和字母控件碰撞到的话
                            {
                                //那么字母还有子弹控件都释放消失掉
                                item.Dispose();
                                it.Dispose();
                                //当子弹和字母碰撞到以后全部释放消失,
                                sound.Play();//开启爆炸时触发的音效
                                PictureBox bz = new PictureBox();//创建picturebox取名为bz
                                //设置bz的大小还有初始位置
                                bz.Size = new Size(50, 50);
                                bz.Location = new Point(it.Left+it.Width/2-bz.Width/2,it.Top+it.Height-bz.Height/2);
                                bz.Image = imageList1.Images[num];//bz的图像是imageList1里面num的图片,num=0.所以只是一张需要计时器开进行效果图的展示
                                bz.Tag = "bztag";//设置tag
                                pan1.Controls.Add(bz);//将bz放到panel1中
                                Timer bztimer = new Timer();//创建计时器bztimer
                                bztimer.Tick += Bztimer_Tick;//bztimer计时器事件
                                bztimer.Tag = bz;//把bz放到bztimer计时器tag里面
                                bztimer.Interval = 20;//bztimer计时器的频率
                            }
                        }
                    }
                }
            }
        }

计时器三(Bztimer)用于存放爆炸效果图的完整显示过程

private void Bztimer_Tick(object sender, EventArgs e)
        {
            Timer bzti = (Timer)sender;//事件发起者赋值给bzti
            PictureBox picture = (PictureBox)bzti.Tag;//将bzti.tag就是bz赋值给picture
            picture.Image = imageList1.Images[num];//picture的image为爆炸图像num计时器爆炸效果图的开始
            num++;//num开始为零mum++以后为一
            if (num>31)//如果num>31
            {
                num = 0;//则num归零
                //爆炸效果还有计时器释放消失
                bzti.Dispose();
                picture.Dispose();
            }
        }

6,得分还有失分的计算

label1.Text = i.ToString();
            label1.Font = new Font("楷体", 24F);
            label1.AutoSize = true;
            //失分的初始分数还有字体样式和自适应大小
            label2.Text = j.ToString();
            label2.Font = new Font("楷体", 24F);
            label2.AutoSize = true;
 i += 1;//爆炸一次得分加一
                                label1.Text = i.ToString();//显示在label1中为得分
j += 1;//释放一次失分加一
                        label2.Text = j.ToString();//显示在label2中为失分

7,暂停还有开始按钮的设置

//按钮的初始文本内容还有按钮的大小还有文本内容的字体样式和大小
            button1.Text = "开始";
            button1.Size = new Size(100, 50);
            button1.Font = new Font("楷体", 24F);
            button1.Click += Button1_Click;//按钮的点击事件
 this.KeyPreview = true;
            //下拉列表框的tag还有大小
 private void Button1_Click(object sender, EventArgs e)
        {
            if (button1.Text=="开始")//如果button里面的文本内容是开始
            {
                //则开启计时器一和二,并将里面的文本改为暂停
                t1.Start();
                t2.Start();
                button1.Text = "暂停";
            }
            else//如果button里面的文本不是开始的话
            {
                //那就改为开始并且将计时器一和二暂停
                button1.Text = "开始";
                t1.Stop();
                t2.Stop();
            }
        }

8,关卡难度还有模式的改变

 comboBox1.Tag = "xxk";
            comboBox1.Size = new Size(130, 20);
            comboBox1.ForeColor = Color.Red;//下拉选项的字体颜色
            comboBox1.Font = new Font("楷体", 25F,FontStyle.Bold);//下拉选项的字体还有大小
            comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;//定义组合框的外观和功能
            string[] nd = { "第一关", "第二关", "第三关", "第四关" };//创建一个数组用于关卡难度的选择
            for (int i = 0; i < nd.Length; i++)//用for循环取出数组中的值
            {
                comboBox1.Items.Add(nd[i]);//取出数组中nd的所有的值
                comboBox1.SelectedIndex = 0;//设置下拉列表框中的默认值为第一关

            }
            comboBox1.SelectedIndexChanged += ComboBox1_SelectedIndexChanged;
            //combobox的点击事件,SelectedIndexChanged表示,属性更改以后才会发生
private void ComboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBox1.Text == "第一关") //如果combobox中文本内容是第一关
            {
                //那么就改变窗体的背景图片还有字母的创建还有下降的频率
                this.BackgroundImage = new Bitmap("../../sucai/005ec6b668c44673f45dc9d29efbda8f.jpg");
                //Bitmap可以自动裁剪图片
                this.BackgroundImageLayout = ImageLayout.Stretch;
                t1.Interval = 900;
                t2.Interval = 160;
            }
            if (comboBox1.Text == "第二关")
            {
                this.BackgroundImage = new Bitmap("../../sucai/7c5748885c3d2329142d390b9643af62.jpg");
                this.BackgroundImageLayout = ImageLayout.Stretch;
                t1.Interval = 800;
                t2.Interval = 160;
            }
            if (comboBox1.Text == "第三关")
            {
                this.BackgroundImage = new Bitmap("../../sucai/7f9ce0f256511ab8589cc27f8f88c089.jpg");
                this.BackgroundImageLayout = ImageLayout.Stretch;
                t1.Interval = 700;
                t2.Interval = 120;
            }
            if (comboBox1.Text == "第四关")
            {
                this.BackgroundImage = new Bitmap("../../sucai/8e50e8b4053f56c3d4613ffdc596d03c.jpg");
                this.BackgroundImageLayout = ImageLayout.Stretch;
                t1.Interval = 600;
                t2.Interval = 80;
            }
        }

猜你喜欢

转载自blog.csdn.net/XVJINHUA954/article/details/106161943