battle city

邓夕
2023-12-01

 

对编写坦克游戏的认识

一.了解坦克游戏里面的图片元素。

1.1 坦克
 我方坦克(一人操作,两人操作) 只考虑一人操作。 有四个方向的图片。
 敌方坦克(不同种类的敌方坦克)。不同种类坦克的四个方向图片。

1.2 子弹
2.1 敌方子弹
2.2 我方子弹

1.3 钢板 (全块的与半块的)

1.4 草地

1.5 海洋

1.6 砖头(全,半)

1.7 爆炸(一系列爆炸图片)

1.8 指挥部

1.9 强化物品 ( 加攻击,加指挥部防御,隐身,爆炸,定,加生命)

二 了解各个元素的共性与特性

2.1这些元素都那些相同的性状和行为

相同的性质 :在整个地图上,它们都有自己的坐标。
相同的行为 :它们都可以在地图上画出来。

这是它们都有的性质和属性。

2.2 它们的个性。

 一个个的看:
(1)坦克:无论敌方坦克还是我方坦克。

它们具有的属性: 坐标,速度,方向,生命。

它们具有的行为: 

它们都可以动【 Move】
可以发子弹【Fire】。
可以被打爆炸【dead】


(2)子弹:无论敌方子弹还是我方子弹

它们具有的属性:坐标,速度,方向,生命,威力

它们具有的行为:

它们都可以动【 Move】
它们都会消失【dead】(不论是出界还是达到坦克)

(3)钢板,海洋

死物而已,不会消亡,只有坐标这个属性。

(4)草地

装饰品,只有坐标这个属性。

(5)砖头

砖头的处理有点复杂。 除了坐标这个基本属性外。
当被子弹打到的时候,外形会发生变化。

(6)强化物品

根据以上分析,显而易见,我们可以将上面的元素分为两大类。
会动的         坦克,子弹
不会动的      钢板,海洋,草地,砖头,强化物品,指挥部

三 将程序大体类结构归纳出来

由于坦克中含有玩家操作的角色,而子弹只是坦克的“附属品”,所以我们最好将坦克和子弹分为两

部分。
而坦克必须区分为我方和敌方。 所以我们可以确定最终类P1tank 和 Enemy类。
子弹也要区分我方和敌方,所以我们可以确定最终类MyMissle 和EnemyMissile。

我们也可以确定所以元素的基类:Element类。(只有坐标属性和画图方法)

然后根据会动和不会动的又分为 Member 类 和Module 类。Blast类(相当于静态元素)

Member类下又继承了 Roles类和 Missile 类。
Module 类下就是那些静态的元素。(暂时不管)。

Roles类下又继承了 Player 类和 Enemy 类。

我们在只考虑一个人游戏的时候。在Player 下又继承了 P1tank类。

 Missile 类下又继承了敌方子弹类和我方子弹类。

四 设计类的属性和方法。

Element : 所以成员最基础的类。
属性:二维坐标
方法:画图显示(抽象方法)

Member:可以动的成员的基础类。
属性:二维坐标(基础基类),生命,速度,方向,宽度和高度(就是图片的长高)。
方法:构造函数,继承基类。
         移动(由于没有实际对象,定义为抽象方法)
         获取矩形大小(用于判断是否碰撞)
         判断方向(更具dir 来改变坐标)

Roles:所有坦克的基础类
属性:继承Member
方法:重写了Move方法(调用基类的判断方向方法)。
          Fire方法(由于没有实际对象,定义为抽象方法)
          IsDead();(由于没有实际对象,定义为抽象方法)

Player:
属性 :除了继承Roles类外,还增添了图片,判断是否移动,以及四个方向的变量。
方法 :重写了移动方法。 给dir方向赋值。重写了move方法,在判断是否move然后调用move。
重写了Draw方法。【【【移动后】】】】 ,将图像画出来。
重写了Fire方法。

P1tank :继承Player类。
属性:添加了图像数组。
方法:构造函数()
          KeyDown事件,KeyUp事件。

Missle 继承自Member 类
属性: 添加的子弹的威力,子弹的敌我区分
方法:子弹的构造函数,重写子弹的移动函数。 由于子弹没有Move属性(只有方向和速度)。
只要调用判断方向的函数就可以了。

MyMissle:Missle类

方法:重写画子弹的方法(先移动,然后画出)

EnemyMissle:继承Missle类

与MyMillse类类似。

Blast类:继承Element
只具有坐标属性,由一系列的图片合成。

Born类:继承Element
只具有坐标属性,由一系列的图片合成。

其他静态的元素:

只有坐标属性。


五 元素及对象的管理

想象一下:

出场时,我方在原地闪烁出场。然后敌方几辆坦克同时闪烁出场,反正出场都要闪烁,就不管了。

然后User在键盘的上按下ASDW键。 坦克出动。按下J键。开始发出子弹。当子弹打到敌方时,敌

方爆炸消失。子弹也消失。

从实质看 ,其实是一个个的对象创建,行动,消失。
那么我们可以定义一个类来管理这些对象。

Singleton  类。
 
private static Singleton instance; 定义管理这些实例。

public static Singleton Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new Singleton();
                }
                return instance;
            }
}
方便的添加对象:
public void AddElement(Element e)
 {
            if (e is P1tank)
            {
                p1tank = e as P1tank;
            }
           //...
}
添加对象存放的位置
        private List<Enemy> enemy = new List<Enemy>();//用List存放坦克的类型
        private List<MyMissile> myMissile = new List<MyMissile>();           //实例化出我的

子弹的对象
        private List<EnemyMissile> enemyMissile = new List<EnemyMissile>();  //实例化

敌人的子弹的对象


将全部对象画出来
public void Draw(Graphics e)
        {
            p1tank.Draw(e);
            for (int i = 0; i < enemy.Count; i++)     //将敌人的坦克画出来
            {
                enemy[i].Draw(e);
            }
           //...
}
移除对象的方法
public void RemoveElement(Element e)
        {
            if (e is Blast)
            {
                blast.Remove(e as Blast);
                return;
            }
             //...
}

程序的核心:算法和思路

 


 

 类似资料:

相关阅读

相关文章

相关问答