using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
using System.Windows.Forms;
namespace PlayPlane
{
class PlaneClass
{
Image zidan = Image.FromFile("bullet.png");//定义子弹图片
Image feiji = Image.FromFile("plane.png");//定义飞机图片
Image dj1 = Image.FromFile("enemy1.png");//定义敌机图片1
Image dj2 = Image.FromFile("enemy2.png");//定义敌机图片2
Image dj3 = Image.FromFile("enemy3.png");//定义敌机图片3
Image baozha = Image.FromFile("baozha.gif");//定义爆炸效果图片
bool pause = false;//表示是否暂停
//judge表示关卡数,score表示分数,宝箱表示拥有的特技数量
int judge = 0, score = 0, baoxian = 3;
int zidanshu = 1;//初始化子弹的数量
class Plane//飞机类
{
public int x;//飞机的X坐标
public int y;//飞机的Y坐标
public Image im;//飞机图片
public Plane(int x, int y, Image im)
{
this.x = x;//初始化飞机的X坐标
this.y = y;//初始化飞机的Y坐标
this.im = im;//初始化飞机图片
}
}
class Bullet//子弹类
{
public int x;//子弹的X坐标
public int y;//子弹的Y坐标
public Image im;//子弹图片
public Bullet(int x, int y, Image im)
{
this.x = x;//初始化子弹的X坐标
this.y = y;//初始化子弹的Y坐标
this.im = im;//初始化子弹图片
}
}
List<Bullet> bullet_lsit = new List<Bullet>();//子弹列表
class Enemy//敌机类
{
public int x;//敌机的X坐标
public int y;//敌机的Y坐标
public int speed;//敌机的纵向速度
public int xspeed;//敌机的横向速度
public Image im;//敌机图片
public Enemy(int x, int y, int speed, int xspeed, Image im)
{
this.x = x;//初始化敌机的X坐标
this.y = y;//初始化敌机的Y坐标
this.speed = speed;//初始化敌机的纵向速度
this.xspeed = xspeed;//初始化敌机的横向速度
this.im = im;//初始化敌机图片
}
}
List<Enemy> enemy_lsit = new List<Enemy>();//敌机列表
int x, y;
public void iniPlane(Form frm)
{
x = frm.Width / 2 - feiji.Width / 2;//设置飞机的初始X坐标
y = frm.Height - feiji.Height - 70;//设置飞机的初始Y坐标
}
//使用键盘控制飞机的上下左右移动及暂停、爆炸
public void keyControl(Form frm, KeyEventArgs e, Label lbl)
{
if (e.KeyCode == Keys.Up)//方向键↑
{
if (y >= 10)//如果Y坐标大于等于10,则将其减掉10
{
y -= 10;
}
}
if (e.KeyCode == Keys.Down)//方向键↓
{
//如果Y坐标小于等于窗体高度减去飞机高度减去30(标题栏+边框)
if (y <= frm.ClientSize.Height - feiji.Height - 30)
{
y += 10;//Y坐标加10
}
}
if (e.KeyCode == Keys.Left)//方向键←
{
if (x >= 10)//如果X坐标大于等于10,则将其减掉10
{
x -= 10;
}
}
if (e.KeyCode == Keys.Right)//方向键→
{
//如果X坐标小于等于窗体宽度减去飞机宽度减去30(标题栏+边框)
if (x <= frm.ClientSize.Width - feiji.Width - 30)
{
x += 10;//X坐标加10
}
}
if (e.KeyCode == Keys.Enter)//回车键——暂停
pause = !pause;
if (e.KeyCode == Keys.Space)//空格键——爆炸
{
if (baoxian > 0)//判断是否有宝箱(即爆炸特技)
{
baoxian--;//宝箱数量减一
//根据敌机速度,设置得分
for (int i = 0; i < enemy_lsit.Count; i++)
{
if (enemy_lsit[i].speed == 2)//如果速度为2,则分数加2000
score += 2000;
else if (enemy_lsit[i].speed == 4)//如果速度为4,则分数加1000
score += 1000;
else if (enemy_lsit[i].speed == 7)//如果速度为7,则分数加500
score += 500;
enemy_lsit.Remove(enemy_lsit[i]);//清除指定敌机
enemy_lsit.Clear();//清空敌机列表
lbl.Text = "得分:" + Convert.ToString(score);//显示得分
}
Graphics g = frm.CreateGraphics();//创建绘图对象
g.DrawImage(baozha, 0, 0, frm.Width, frm.Height);//绘制爆炸效果
}
}
}
//打飞机游戏的实现算法
public void execProgram(Graphics g, Form frm, Label lbl, Timer timer)
{
//判断是否暂停
if (pause)
{
//绘制暂停文字
g.DrawString("暂 停", new Font("微软雅黑", 22), Brushes.Red, new PointF(frm.Width / 2 - 50, frm.Height / 2 - 50));
return;
}
judge++;//关数加1
Plane plane = new Plane(x, y, feiji);//创建飞机对象
//击落敌机
for (int i = 0; i < enemy_lsit.Count; i++)//遍历敌机列表
{
for (int j = 0; j < bullet_lsit.Count; j++)//遍历子弹列表
{
if (Math.Abs(bullet_lsit[j].x - enemy_lsit[i].x) < (bullet_lsit[j].im.Width + enemy_lsit[i].im.Width) / 2 && Math.Abs(bullet_lsit[j].y - enemy_lsit[i].y) < (bullet_lsit[j].im.Height + enemy_lsit[i].im.Height) / 2)
{
if (enemy_lsit[i].speed == 2)//如果速度为2,则分数加2000
score += 2000;
else if (enemy_lsit[i].speed == 4)//如果速度为4,则分数加1000
score += 1000;
else if (enemy_lsit[i].speed == 7)//如果速度为7,则分数加500
score += 500;
enemy_lsit.Remove(enemy_lsit[i]);//清除指定敌机
lbl.Text = "得分:" + Convert.ToString(score);//显示得分
break;
}
}
}
//碰撞敌机
for (int i = 0; i < enemy_lsit.Count; i++)//遍历敌机列表
{
bool isCrashed = false;//判断游戏是否结束
//定义飞机坐标
int px = (x * 2 + plane.im.Width) / 2, py = (y * 2 + plane.im.Height) / 2;
//定义敌机坐标
int ex = (enemy_lsit[i].x * 2 + enemy_lsit[i].im.Width) / 2, ey = (enemy_lsit[i].y * 2 + enemy_lsit[i].im.Height) / 2;
//如果飞机坐标与敌机坐标重合度在一定范围
if (Math.Sqrt((px - ex) * (px - ex) + (py - ey) * (py - ey)) <= (enemy_lsit[i].im.Width / 2 + plane.im.Height / 2 - 20))
{
isCrashed = true;//指示游戏结束
}
if (isCrashed)
{
timer.Stop();//停止计时器
//提示游戏结束
g.DrawString("Game Over", new Font("微软雅黑",22), Brushes.Red, new PointF(frm.Width / 2 - 100, frm.Height / 2 - 50));
return;
}
}
if (judge == 100)//如果关数到达100,则重新开始
judge = 0;
g.DrawImage(Image.FromFile("bg.png"),0,0,302,501);//刷新
//实时绘制飞机位置
g.DrawImage(feiji, new Point(x, y));
//指定要加载的敌机类型