battle city

 

对编写坦克游戏的认识

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

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 = new List();//用List存放坦克的类型
        private List myMissile = new List();           //实例化出我的

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

敌人的子弹的对象


将全部对象画出来
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;
            }
             //...
}

程序的核心:算法和思路

 


 

你可能感兴趣的:(module,游戏,算法,list,null,user)