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();
}
}
}
}
}
}