C#飞机大战(开始,结束,清屏)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Media;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 飞机大战
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //飞机大战项目整体划分
        /*1、界面UI(背景图、战机信息、游戏信息)
         * 2、战机控制
         * 3、战机生成器
         * 4、游戏逻辑控制
         * 5、首先打字游戏
         * (1)设置背景
         * (2)字母生成
         * <1>每秒生成1.5个
         */
        Panel YX = new Panel();//控件盒子的集合,游戏主页面
                           
    //随机字母,可以用数字转换成字母形式
    Random sj = new Random();

    //pictureBox装图片的盒子(装F飞机图片的盒子)
    PictureBox tupianplsyer = new PictureBox();


    //游戏开始控制区Panel
    Panel kaishi = new Panel();


    Timer zimuTime = new Timer();

    Timer flyziti = new Timer();

    Label defen = new Label();


    ProgressBar HS = new ProgressBar();
    // lab进度条背景
    Label HSback = new Label();
    // lab进度条
    Label HSjindu = new Label();
    // 记录血量
    int xt = 100;
    //飞机自动
    //Timer fjzd = new Timer();

    //尾气图片
    //PictureBox wqtu = new PictureBox();

    //开始按钮
    Label kanniu = new Label();

    //音乐
    SoundPlayer yinyue = new SoundPlayer();
    SoundPlayer yinyue2 = new SoundPlayer();
    private void Form1_Load(object sender, EventArgs e)
    {
        yinyue.SoundLocation = @"../../yin/bz.wav";
        yinyue2.SoundLocation = @"../../yin/bjyl.wav";
       ///yinyue2.Play();
        this.Size = new Size(1920, 1000);
        this.BackColor = Color.Green;
        //this.FormBorderStyle = FormBorderStyle.None;//去掉框架
        //this.BackgroundImage = Image.FromFile(@"../../img/bg.jpg");
        //FromFile()从指定的文件创建
        //@转义字符
        //路径问题:(BackgroundImage要注意相对路径和绝对路径)
        //1.绝对路径
        //不用考虑其位置所在文件夹,只需要根据这个路径就能够直接找到目标
        //2.相对路径
        //以当前运行的文件为起始点,根据相对的路径去寻找目标,跳出使用“../”,进入使用“文件夹名/”

        //把页面放在最中间
        this.Left = Screen.PrimaryScreen.Bounds.Width / 2 - this.Width / 2;
        this.Top = Screen.PrimaryScreen.Bounds.Height / 2 - this.Height / 2;

        //创建游戏区
        //Panel YX = new Panel();
        YX.Width = 1000;
        YX.Height = 600;
        //YX.BackgroundImage = Image.FromFile(@"../../img/bg.jpg");
        YX.BackColor = Color.White;
        YX.BackgroundImageLayout = ImageLayout.Stretch;//沿工作区拉伸
        this.Controls.Add(YX);//表示获取包含在this当前所指的控件里,将add里的控件全部添加到this中的所有控件
        //图片放进去后,让图片放在框架中间
        YX.Location = new Point(0, 30);//表示图片显示的位置

        //字母生成器(zimuTime名字),给这个字母生成器添加一个计时器事件,创建计时器
        //Timer zimuTime = new Timer();
        zimuTime.Interval = 1500;//调用的事件时间
        zimuTime.Tick += ZimuTime_Tick;
        //zimuTime.Start();


        //字体下落的计时器//创建计时器
        //Timer flyziti = new Timer();
        flyziti.Interval = 10;
        flyziti.Tick += Flyziti_Tick;
        //flyziti.Start();

        //飞机图片
        //飞机图片大小
        //pictureBox装图片的盒子(装F飞机图片的盒子)
        //PictureBox tupianplsyer = new PictureBox();
        tupianplsyer.Size= new Size(100, 130);
        //tupianplsyer.BackColor = Color.Pink;
        //飞机位置
        tupianplsyer.Top = YX.Height- tupianplsyer.Height;//飞机图片的位置
        tupianplsyer.Left = YX.Width / 2 - tupianplsyer.Width / 2;
        tupianplsyer.Image = Image.FromFile(@"../../img/RP03.png");
        tupianplsyer.Tag = 0;
        //tupianplsyer.SizeMode = PictureBoxSizeMode.StretchImage;//自适应图片大小
        tupianplsyer.Tag = "feiji";
        YX.Controls.Add(tupianplsyer);

        //飞机自动
       /* //Timer fjzd = new Timer();
        fjzd.Interval = 50;
        fjzd.Tick += Fjzd_Tick;
        fjzd.Tag = tupianplsyer;*/
        this.KeyDown += Form1_KeyDown;
        

        //添加键盘事件
        //Keydown和KeyPress区别
        //Keydown一直按着会一直触发
        //KeyPress点击一下出现一下
        this.KeyPress += Form1_KeyPress;

        //飞机尾气图1
        PictureBox wqtu = new PictureBox();
        wqtu.Size = new Size(20,25);
        wqtu.Tag = 0;
        wqtu.SizeMode = PictureBoxSizeMode.StretchImage;//图自我拉伸
        wqtu.Location = new Point(tupianplsyer.Width/3-wqtu.Width,100);
        tupianplsyer.Controls.Add(wqtu);

        //飞机尾气动画1
        Timer wq = new Timer();
        wq.Interval = 170;
        wq.Tag = wqtu;
        wq.Start();
        wq.Tick += Wq_Tick;

        //飞机尾气图2
        PictureBox wqtu2 = new PictureBox();
        wqtu2.Size = new Size(20, 25);
        wqtu2.Tag = 0;
        wqtu2.SizeMode = PictureBoxSizeMode.StretchImage;//图自我拉伸
        wqtu2.Location = new Point(tupianplsyer.Width / 3 - wqtu.Width+30, 100);
        tupianplsyer.Controls.Add(wqtu2);
        //飞机尾气动画2
        Timer wq2 = new Timer();
        wq2.Interval = 170;
        wq2.Tag = wqtu2;
        wq2.Start();
        wq2.Tick += Wq2_Tick;

        //游戏开始区
        kaishi.Size = new Size(200, 600);
        kaishi.BackColor = Color.Pink;
        kaishi.Location = new Point(1050, 30);
        this.Controls.Add(kaishi);

        //开始按钮
       // Label kanniu = new Label();
        kanniu.Font = new Font("", 20);
        kanniu.Text = "开始游戏";
        kanniu.BackColor = Color.Transparent;
        kanniu.AutoSize = true;
        kanniu.Location = new Point(20, 50);
        kaishi.Controls.Add(kanniu);
        kanniu.Click += Kanniu_Click;

        //得分版
        //Label defen = new Label();
        defen.BackColor = Color.Transparent;
        defen.AutoSize = true;
        defen.Location = new Point(20,100);
        defen.Font = new Font("", 20);
        defen.Text =0+ "得分";
        kaishi.Controls.Add(defen);

       
        //Label ji = new Label();
        ji.Location = new Point(20, 150);
        ji.Font = new Font("", 20);
        ji.BackColor = Color.Transparent;//透明背景色
        ji.AutoSize = true;//字体大小自适应
        ji.Text = "记录分数为"+0;
        kaishi.Controls.Add(ji);



        // 系统自带进度条血条实现
        Label laa = new Label();
        laa.Font = new Font("", 10);
        laa.AutoSize = true;
        //laa.ForeColor = Color.Red;
        laa.Text = "血量";
        laa.Location = new Point(10, 230);
        kaishi.Controls.Add(laa);
        HS.Location = new Point(10, 260);
        HS.Size = new Size(100, 20);
        HS.Value = xt;//血量位置
        kaishi.Controls.Add(HS);
        // 自定义血条实现
        HSjindu.Size = new Size(100, 20);
        HSjindu.Location = new Point(10, 290);
        HSjindu.BackColor = Color.Red;
        HSback.Size = new Size(xt, 20);
        HSback.Location = new Point(10, 320);
        HSback.BackColor = Color.Black;
        //kaishi.Controls.Add(HSjindu);
        //kaishi.Controls.Add(HSback);


        //游戏从新开始
        PictureBox xin = new PictureBox();
        xin.Size = new Size(200,50);
        xin.BackColor = Color.White;
        xin.SizeMode = PictureBoxSizeMode.StretchImage;
        xin.Tag = kanniu;
        xin.Location = new Point(0,300);
        kaishi.Controls.Add(xin);
        
        Label zixin = new Label();
        zixin.Text = "游戏重置";
        zixin.AutoSize = true;//字体自适应大小
        zixin.Font = new Font("", 30, FontStyle.Bold);
        zixin.Tag = xin;
        zixin.Click += Zixin_Click;
        xin.Controls.Add(zixin);

        //List chongzhhidj = new List();


    }

    private void Zixin_Click(object sender, EventArgs e)
    {
        defen.Text = 0 + "得分";
        ji.Text = "记录分数为" + 0;
        kanniu.Text = "开始游戏";
        yinyue2.Stop();
        //yinyue2.Play();
        cz();
        zimuTime.Dispose();
    }

    List congzhhidj = new List();




    private void Wq2_Tick(object sender, EventArgs e)
    {
        Timer ee1 = sender as Timer;
        PictureBox ee2 = ee1.Tag as PictureBox;
        ee2.Image = imageList3.Images[(int)ee2.Tag];
        ee2.Tag = (int)ee2.Tag + 1;
        if ((int)ee2.Tag > imageList3.Images.Count-1)
        {
            ee2.Tag = 0;
        }
    }

    private void Wq_Tick(object sender, EventArgs e)
    {
        Timer e1=sender as Timer;
        PictureBox e2 = e1.Tag as PictureBox;
        e2.Image = imageList2.Images[(int)e2.Tag];
        e2.Tag = (int)e2.Tag + 1;
        if ((int)e2.Tag>=imageList2.Images.Count)
        {
            e2.Tag = 0;
        }
    }

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Left)
        {
            tupianplsyer.Left -= 3;

        }
        else if (e.KeyCode == Keys.Right)
        {
            tupianplsyer.Left += 3;

        } else if (e.KeyCode==Keys.Up)
        { 
            tupianplsyer.Top -= 3;

        }
        else if (e.KeyCode==Keys.Down)
        {

            tupianplsyer.Top += 3;
        }
       
    }
    //int m = 0;
    /*private void Fjzd_Tick(object sender, EventArgs e)
    {
        Timer s1 = sender as Timer;
        PictureBox s2 = s1.Tag as PictureBox;
        //s2.Tag = (int)s2.Tag + 1;

       *//* tupianplsyer.Left += 3;
        tupianplsyer.Left -= 3;
        tupianplsyer.Top += 3;
        tupianplsyer.Top -= 3;
*//*
        }*/

    Label ji = new Label();
    int d = 0;
    
    private void Kanniu_Click(object sender, EventArgs e)
    {
        Label f = (Label)sender;
        yinyue2.SoundLocation = @"../../yin/bjyl.wav";
        if (f.Text=="开始游戏")
        {
            yinyue2.Play();
            zimuTime.Start();
            flyziti.Start();
            f.Text = "暂停";

        }
        else if (f.Text=="暂停")
        {
            yinyue2.Stop();
            zimuTime.Stop();
            flyziti.Stop();
            f.Text = "开始游戏";
        }


    }


    /*PictureBox diji敌机 = new PictureBox();
    PictureBox diji敌机2 = new PictureBox();*/





    //用计时器每700调用一次文字
    private void ZimuTime_Tick(object sender, EventArgs e)
    {
        /* //生成字母,使用生成label字母
         Label lazm = new Label();
         lazm.Tag = "zm";
         lazm.Text = ((char)sj.Next(97, 123)).ToString();//先强转为字符(字母),然后转成字符串,因为左右数据类型要一致,右面服从左面
         lazm.Font = new Font("", sj.Next(20,39), FontStyle.Bold);
         lazm.ForeColor = Color.FromArgb(sj.Next(226), sj.Next(226), sj.Next(226));
         lazm.Top = 0;
         lazm.Left = sj.Next(0, YX.Width - lazm.Width);//表示随机的位置,所以要把游戏主页面提到全局变量
         lazm.AutoSize = true;///字体大小自适应
         //有背景图片时,可以添加一个tarnsparent表示字体背景颜色透明/字体颜色透明色
         lazm.BackColor = Color.Transparent;

         YX.Controls.Add(lazm);//把所以显示字体添加/装在YX中,然后就显示*/

        PictureBox diji敌机 = new PictureBox();
        diji敌机.Size = new Size(100,100);
        diji敌机.SizeMode = PictureBoxSizeMode.StretchImage;
        diji敌机.Image = Image.FromFile(@"../../img/Enemy3_3.png");
        //diji敌机.Location=new Point();
        diji敌机.Top=0;
        diji敌机.Left = sj.Next(0, YX.Width - diji敌机.Width);//表示随机的位置,所以要把游戏主页面提到全diji敌机.Left=sj.
        diji敌机.Tag = "dj";
        YX.Controls.Add(diji敌机);

        PictureBox diji敌机2 = new PictureBox();
        diji敌机2.Size = new Size(100, 100);
        diji敌机2.SizeMode = PictureBoxSizeMode.StretchImage;
        diji敌机2.Image = Image.FromFile(@"../../img/Enemy1.png");
        //diji敌机2.Location=new Point();
        diji敌机2.Top = 0;
        diji敌机2.Left = sj.Next(0, YX.Width - diji敌机.Width);//表示随机的位置,所以要把游戏主页面提到全diji敌机.Left=sj.
        diji敌机2.Tag = "dj2";
        YX.Controls.Add(diji敌机2);
        congzhhidj.Add(diji敌机);
        congzhhidj.Add(diji敌机2);

    }
    private void cz() 
    {
        foreach (PictureBox item in congzhhidj)
        {
            item.Dispose();
        }
    }
    //int x = 0;
    //字体下落
    private void Flyziti_Tick(object sender, EventArgs e)
    {
        
        foreach (Control item in YX.Controls)
        {
            //飞机不下落的二种方法


            /* //法一:
             //用GetType获取当前实例类型,获取item这个里面,名字为Lable
             //GetType每个属性都有
             if (item.GetType().Name== "Label")//获取当前进入的类型
             {
                 item.Top += 3;
             }*/

            
            //法二:
            //if (item.Tag.ToString()=="zm"||item.Tag.ToString()== "zmbiaoji")
            if (item.Tag.ToString() == "dj"|| item.Tag.ToString() == "dj2" || item.Tag.ToString() == "zmbiaoji")
                {
                //item里面的属性都因该有tag来判断,如果有一个没赋tag,会显示空指针错了,表示未将对象引用设置到对象的实例,eg:两个事物比较,先要他们比较类型一样,否则还没比较就报错,一个人和猴子比尾巴,还么开始比就错误了(不能保证每一个元素有Tag,才不会报错,先保证循环元素存在)
                item.Top += 4;
                int x = 0;
                if (item.Top>=YX.Height)//大于边界后就释放
                {
                    //int x = 0;
                    x++;
                    ji.Text = "记录分数为" + x;
                    xt -= 20;
                    HS.Value = xt;//每次减20
                    HSjindu.Width = xt;//宽每次减20
                    if (xt==0)//100每次减20最后减到0,进入这个条件
                    {
                        zimuTime.Stop();
                        flyziti.Stop();
                        MessageBox.Show("以掉落5个,游戏结束");//弹框
                      /*  Label ji = new Label();
                        ji.Location = new Point(50,150);
                        ji.Text = "记录分数为"+x;
                        kaishi.Controls.Add(ji);*/

                    }
                    item.Dispose(); //大于边界后就释放
                    //Dispose释放多余
                }
               /* if (b1 == true)
                {
                    zimuTime.Dispose();
                    flyziti.Dispose();
                    b1 = false;
                }
                else if (b1 == false)
                {
                    zimuTime.Start();
                    flyziti.Start();
                }*/
            } 

            //item.Top += 3;

            //item的tag是zd则,这个item为子弹
            if (item.Tag.ToString()=="zd")
            {
                item.Top -= 1;
                if (item.Top<-item.Height)
                {
                    item.Dispose();//大于边界后就释放
                }
                foreach (Control yigezd in YX.Controls)//循环便利每一个子弹,比较距离清除子弹和字母
                {
                    if (yigezd.Tag.ToString()== "zmbiaoji")//子弹一个一个发出
                    {
                        if (item.Top<=yigezd.Top+yigezd.Height&&item.Left+item.Width/2==yigezd.Left+yigezd.Width/2)//表示字母和子弹在同一位置,
                        {
                            d++;
                            defen.Text = d + "分";
                            item.Dispose();
                            yigezd.Dispose();


                            //子弹碰到字母爆炸,创建一个盒子用来放图片
                            PictureBox baozhapicture = new PictureBox();
                            baozhapicture.Size = new Size(50, 50);
                            baozhapicture.Tag = 0;
                            //设置子弹&字母接触位置
                            baozhapicture.Location = new Point(yigezd.Left+yigezd.Width/2-baozhapicture.Width/2,yigezd.Top+yigezd.Height/2-baozhapicture.Height/2);
                            yinyue.Play();
                            YX.Controls.Add(baozhapicture);

                            //创建一个计时器用来,把所有图片调出来
                            Timer tu = new Timer();
                            tu.Tag = baozhapicture;
                            tu.Interval = 70;
                            tu.Tick += Tu_Tick;
                            tu.Start();

                        }
                    }
                }
                
            }
        }
    }
   

    //按下对应的字母,键盘事件
    private void Form1_KeyPress(object sender, KeyPressEventArgs e)
    {
        //sender事件发起者
        //e参数,代表指定的键/代表事件对象/代表第三方/事件触发对象(谁触发代表谁)
        // e.KeyChar//设置或获取与按下键对应的字符

        //因为是多个键,所以循环便利,YX的所有东西
        foreach (Control item in YX.Controls)//每一个字母和飞机循环出来
        {
            //if (item.Text==e.KeyChar.ToString()&&item.Tag.ToString()=="zm")//item.Tag.ToString()=="zm"字母时对应产生一个子弹,不会同时产生多个
            if (e.KeyChar.ToString()=="w"&& item.Tag.ToString() == "dj"|| item.Tag.ToString() == "dj2")
                {
                item.Tag = "zmbiaoji";//该标记,就不会产生多余子弹,键盘字母
                //设置的位置
                tupianplsyer.Left = item.Left + item.Width / 2 - tupianplsyer.Width / 2;//使按键字母和飞机对应
                //同样的中轴线,字母的距离left的距离加上,字母宽的一半,减上飞机图片的一半就是,飞机left的距离

                //创建子弹
                PictureBox zidan = new PictureBox();
                zidan.Tag = "zd";
                zidan.Size = new Size(8, 18);
                zidan.SizeMode = PictureBoxSizeMode.StretchImage;
                zidan.Image = Image.FromFile(@"../../img/Ammo1.png");
                zidan.Left = tupianplsyer.Left + tupianplsyer.Width / 2 - zidan.Width / 2;

                zidan.Top = tupianplsyer.Top -zidan.Height;
                YX.Controls.Add(zidan);
                //跳出当前事件
                return;//跳出整个事件,如果给return下面写则全部跳出//判断只出现一个

            }

        } 

    }

    
    //爆炸
    private void Tu_Tick(object sender, EventArgs e)
    {
        Timer p = (Timer)sender;
        PictureBox pp = (PictureBox)p.Tag;
        pp.Image = imageList1.Images[(int)pp.Tag];//把图像放在imageList1
        pp.Tag = (int)pp.Tag + 1;
        if ((int)pp.Tag >= 31)
        {
            // pp.Tag = 0;
            p.Dispose();
            pp.Dispose();
            //yinyue.Play();
        }
       // yinyue.Play();

    }
    private void timer1_Tick(object sender, EventArgs e)
    {
        if (xt == 0)
        {
            zimuTime.Stop();
            flyziti.Stop();
           
            foreach (Control lab in YX.Controls)
            {
                if (lab.GetType().Name == "Label")
                {
                    lab.Dispose();
                }
            }
        }
    }
} 
}

你可能感兴趣的:(C#飞机大战(开始,结束,清屏))