坦克项目总结
坦克撞汽车一、需求分析:
要实现一个坦克大战游戏。游戏中包括我方坦克、对方坦克、障碍物(可摧毁的墙、不可摧毁的墙、草地、水面)、我方的基地。双方坦克都不能穿越除草地以外的障碍物;游戏的玩家通过键盘控制我方坦克的前进、后退、向左、向右移动;对方坦克可以在窗体内自主移动,撞墙或边界后自动改变方向;我方坦克与对方坦克都可以发射子弹,双方坦克被敌对方的子弹打中都会有火花产生,被子弹打中后我方坦克生命值减1并且回到初始位置,对方坦克被移除;双方子弹打到墙上都有火花产生,打中后子弹被移除,可摧毁的墙被子弹打中后也会被移除;双方子弹移出窗体后被移除;当我方坦克生命值减为0或我方基地被摧毁,玩家输,游戏结束;当对方坦克全部被子弹打中,玩家赢,游戏结束。
二、游戏的设计图
游戏中的类及类的关系
三、游戏效果图:
游戏主体图
游戏结束提示1 游戏结束提示2
游戏结束提示3
四、游戏设计中的问题:
1、我方坦克的绘制及移动问题
问题描述:
创建我方坦克,使其在主窗口中显示出来;按下不同的
键,画出不同方向的我方坦克,然后我方坦克向不同方
向移动。
解决方法:
我方坦克的属性继承于坦克,所以我们现在父类Tanke中
完成坦克的属性(高度,宽度,速度和位置);
在My Tanke类中添加一个构造函数,在构造函数中添加
我方坦克的位置;
public MyTanke()
{
_Location = new Point(300, 600);
}
在主程序中添加一个paint的刷新窗体的事件,在paint方
法中绘制我方坦克;
void GameManager_Paint(object sender, PaintEventArgs e)                    {
_MyTankeObj.Draw(e.Graphics);
}
在Tank抽象类中,定义Direction,然后在我方坦克的属性
中定义坦克的四个方位,当我们按下不同的键时,改变我
方坦克的方向;
在MyTanke的Draw方法中,根据传过来的方向,画出不
同方向的我方坦克;
同样,在MyTanke的Draw方法中,根据传过来的方向,
解决我方坦克的移动问题。
2、敌方坦克的绘制、自动移动及自动转向问题
问题描述:
创建对方坦克,使对方坦克自行移动,并能够自
行随机转换方向
解决方法:
在主线程中创建一个线程来创建对方坦克,X坐标取0—                    950之间的随机数,Y坐标取0—60之间的随机数,然后
创建一个泛型集合,把创建的坦克加入其中;
在主程序的Draw方法中,绘制对方坦克,用for循环;
for (int i = 0; i < _ListOtherTanke.Count; i++)                      {
_ListOtherTanke[i].Draw(e.Graphics);
}
我们所创建的对方坦克只有一类,因为有不同方向需插入
不同图片,只需在对方坦克的Draw方法中,根据
Direction的不同Draw出不同图片;
创建一个线程来让对方坦克在移动过程中可以随机转换
方向;
Random random = new Random();
int tankeNum = random.Next(1, 5);
OtherTanke otherTanke = null;
int _direction = random.Next(1, 5);
对方坦克Move的方向各不相同,所以需要在它们各自的                    Move方法中进行相应的设置;
在主线程中添加一个MoveTanke的线程。
void MoveOtherTanke()
{
while (1 == 1)
{
OtherTanke otherTanke = null;
for(int i = 0; i < _ListOtherTanke.Count; i++)                          {
otherTanke = _ListOtherTanke[i];
if (otherTanke != null)
{
otherTanke.Move();
}
}
Thread.Sleep(50);
this.Refresh();
}
}
3、基地、障碍物的绘制问题
问题描述:
创建我方基地,并在窗体中绘制出来,根据基地位置,在
其周围绘制保护基地的障碍物(RuinedWall),设计不同障
碍物在窗体中的位置并绘制出来。
解决方法:
在Base类中定义基地的属性,并添加一个构造函数,在构
造函数中添加我方基地的位置;
public Base()
{
_width = 30;
_height = 30;
_Location = new Point(450, 620);
}
在主程序的Paint事件中绘制我方基地;
在父类Wall中定义障碍物的属性,在构造函数中定义障碍
物的长和宽,在Draw方法中绘制障碍物;
在Bankground类中定义障碍物的泛型集合,并在          Bankground的带参构造函数中,用多个for循环创建障碍
物,然后将其加入泛型集合中。
4、我方子弹的创建及移动问题
问题描述:
创建我方子弹,在按下F键的时候,根据我方坦克方向
的不同,我方坦克向不同方向发射子弹,子弹被发射后
能够自行移动。
解决方法:
在Bullet抽象类中创建子弹的属性(宽度,高度,位置,
速度,方向)及方法(绘制、移动);
在子弹的默认构造函数中定义它的宽度和高度;
public Bullet()
{
_height = 9;
_width = 9;
_speed = 15;
}
在带参(位置)的构造函数中定义它的位置,在绘制方
法中把子弹绘制出来;
在Move方法中(因为移动方法继承于抽象类所以void