用java做坦克游戏

上传人:子 文档编号:42062029 上传时间:2018-05-31 格式:DOC 页数:16 大小:134.50KB
返回 下载 相关 举报
用java做坦克游戏_第1页
第1页 / 共16页
用java做坦克游戏_第2页
第2页 / 共16页
用java做坦克游戏_第3页
第3页 / 共16页
用java做坦克游戏_第4页
第4页 / 共16页
用java做坦克游戏_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《用java做坦克游戏》由会员分享,可在线阅读,更多相关《用java做坦克游戏(16页珍藏版)》请在金锄头文库上搜索。

1、第一次课一、要做的工作1、产生一个 800*600 的窗口,背景色为绿色。窗口可以被关闭,但不允许改变 大小2、在窗口里画出一个红色的圆代表坦克3、让坦克动起来改变坦克的位置就相当于坦克移动了,因此首先需要把坦克的位置描述改为 变量每重画一次坦克就动一次,让坦克不断的动就要不断的重画,我们用线程来 控制二、知识点1、使用 eclipse 建立项目,创建包和类的方法2、变量命名规则:所有命名要求见名知义;类名首字母大小,变量和方法首字 母小写;驼峰标识(比如类名:TankWar)3、事件机制事件包括三个方面:监听器类,注册事件,覆盖方法监听器类经常写成内部类(包括匿名内部类)或是类本身实现事件接

2、口事件接口包括 actionListener 接口、窗口事件接口、鼠标事件接口、键盘事 件接口等等使用事件接口要求把接口的所有方法都写出,但不一定都实现窗口事件和鼠标键盘事件接口还提供了较为简洁的适配器类3、匿名内部类类可以分为如下几种:主类:包含主方法的类内部类:在一个类内部定义的类为内部类实例内部类:在一个类内部独立存在,不属于类的成员变量和方法静态内部类:用 static 修饰的实例内部类局部内部类:在一个类的方法内定义的类匿名内部类:没有名字的局部内部类外部类:包含内部类的类,外部类也可能是其他类的内部类顶层类:不是任何类的内部类为顶层类设计内部类的主要目标是“封装” 。顶层类只能用

3、public 修饰或者不修饰(即默认修饰方式) ,内部类可以 用 public,protected,private,默认四种方式修饰,局部内部类只能用 默认修饰局部内部类和匿名内部类只在方法内可见,即该类只为该方法提供服务实例内部类只在一个类内可见,只为该类提供服务4、利用 eclipse 重写父类的方法在 eclipse 中单击右键,源代码,生成覆盖方法。此时会列出当前类的所有父类, 当前类可以直接继承父类的方法。5、图形的重画机制在 frame 上画出的图形每次刷新时会重画,重画的过程是:系统自动调用 repaint 方法,repaint 调用 update 方法,update 调用 pa

4、int 方法,从而完成重画。6、多线程见第 17 课详细讲解三、小注1、我们使用的 Frame 组件,没有使用 JFrame,因为 JFrame 在后续画图时不好 用,到时举例看第二次课一、要做的工作1、让坦克在键盘的控制下向四个方向移动2、我们已经写好一个坦克并且能够控制其移动,如果要求在加入一个坦克该如 何实现?把坦克做成一个独立的类,把和坦克自身相关的属性和方法都写到坦克类 中,然后在 tankclient 类中生成 tank 类的对象,然后用 tanke 类的对象调用 坦克类的方法类完成各种功能3、让坦克在键盘的控制下向八个方向移动1、如何做出八个方向?通过四个方向键组合出八个方向,比

5、如上、右同时 按下是一个方向。2、四个布尔变量代表四个方向键的按下情况,组合出八个方向,八个方向 用枚举类型表示。4、优化代码:把一些可能会改变的值定义成常量二、知识点1、键盘事件适配器键盘控制坦克移动就要使用键盘事件,事件三要素:监听器类(监听接口还是 适配器类?写成内部类还是匿名内部类?) ,注册事件,覆盖方法 (keypress,keytyped,keyreleased 用哪个方法)2、键盘代码如何获取键盘按键代码:e.getKeyCode()3、Switch 语句:格式,case 后能跟什么样的变量?没有 break 会怎样?4、加入键盘事件后可否去掉多线程?5、面向对象编程思想:一切

6、皆为对象。对项目进行抽象,形成若干个类,然后 生成对象来实现程序功能 把坦克抽象成一个类,把坦克的属性描述为成员变量,把坦克的行为描述为 方法。这样就把坦克相关的属性和方法都封装到一个类中,属性一般设计为 私有,通过 set 和 get 方法访问,方法一般为 public,供对象调用,从而实现 各种功能。6、构造方法构造方法用来描述一个对象刚生成时的状态。调用构造方法才能生成对象。 一个类必须有构造方法,构造方法有三种情况super(xxx):第一句调用父类的构造方法this(xxx):第一句调用本类的其他构造方法super():第一句没有调用任何其他的构造方法,系统会自动加上 这句,去调用父

7、类的无参构造方法(如果父类没有无参构造方法,那么 子类会出错)任何一个构造方法必然属于上述三者之一。任何一个类都必须提供一个空 的构造方法7、枚举类型Tiger 中的一个重要新特性是枚举构造,它是一种新的类型,允许用常量来表 示特定的数据片断,而且全部都以类型安全的形式来表示。Java 代码的两个基本的构造块是类 和接口。现在 Tiger 又引入了枚举,一般 简称它为 enum。这个新类型允许您表示特定的数据点,这些数据点只接受分配 定义枚举定义枚举enum DirectionU,D,R,L,RU,RD,LU,LD,STOP; 在这里,我使用了新的关键字 enum,为 enum 提供了一个名称

8、,并指定了允许 的值。然后,Direction 就变成了一个枚举类型, 使用枚举类型使用枚举类型private Direction direction = Direction.STOP; 用以前定义过的类型(Direction)建立一个新的枚举(direction)之后,您 就可以像使用其他成员变量一样使用它了。当然,枚举只能分配枚举值中的一 个(例如,U,D,R 等)三、小注1、注意把坦克做成类后,程序的改变。第三次课一、要做的工作1、添加子弹类a)新建一个 Missile 类作为子弹类b)设计子弹类的属性和方法c)要求子弹能够根据某个方向移动d)在主类中画出一个子弹,进行测试2、要求按下

9、ctrl 键让坦克打出子弹,并且让子弹沿着坦克移动的方向运动a)在坦克的 keyPress 方法中加入 ctrl 键响应,产生一颗子弹。写一个 attack 方法,在此处生成一个 Missile 对象。在 ctrl 响应中调用该方法问题:上述方案无法打出子弹,因为没有画出子弹,两个地方可以调用 draw 方法画出子弹,tank 类里的 paint 方法,tankwar1 里的 paint 方法。 我们在 tanjwar1 里做,因为尽量把所有对象都定义到 tankwar1 里,这 样好管理。b)在 tankwar1 中定义一个子弹引用,在 tank 中生成子弹对象,那么如何 把 tank 中的

10、子弹对象传递到 tankwar1 中。让 tank 持有 tankwar1 的引用, 然后把 tankwar1 的对象传递给坦克里的 tankwar1 的引用。记住这种传递对象的方法。c)子弹从坦克中心打出坦克的位置是 x,y,又知道坦克和子弹的半径,由此求出子弹的位置。3、坦克停止时也能打出子弹子弹是根据坦克的方向飞行的,所以当坦克停止时子弹也就停止了。如何让 坦克停止时也能打出子弹呢,就是想办法记录坦克刚才的行动方向。我们用 一个炮筒方向来记录坦克的移动方向。a)给坦克增加一个属性 ptDir,代表炮筒方向b)炮筒用一条直线来表示,这条直线根据坦克的移动方向来画出。即坦克 向右走时就画一条

11、向右的线,向左走就画一条向左的线,停止时就保留 上一次的方向。c)子弹的发射方向跟据炮筒方向来定二、知识点1、枚举类型的用法a)枚举就是用 enum 定义一个新的数据类型,该类型的取值范围是几个常 量,用该类型可以定义变量,变量的取值就在限定在上述的常量中b)在 Tank 中我们定义了一个枚举类型 Direction,在 Missile 中我们用该类 型定义个变量 dir,该变量是一个枚举类型变量,可取 Direction 枚举类 型中列举的常量之一。2、A 类中定义的变量如何获得 B 类中生成的对象。在 A 中定义好要获取的对 象的引用,然后让 B 持有 A 的引用,在 B 中生成对象赋给

12、A 的引用3、画线的方法三、小注第四次课:一、要做的工作:1、打出多发子弹a)创建容器集合框架b)每次按下 ctrl 键都往容器中加入一个子弹c)逐一画出每发子弹2、删掉子弹:当子弹飞出窗口时要删掉,如果不删掉那么容器中的子弹会越来 越多,最后会导致内存崩溃。如何判断子弹飞出边界?a)找出四个边界b)从容器中 remove 一个子弹,此处又涉及到在 Missile 类中持有 TankWar 的对象问题。3、坦克的边界问题,让坦克不能走出边界注意上边界有标题栏,需要考虑。4、回顾以前的工作,适当加注释二、知识点1、集合框架见第 17 课2、范型:在生命集合变量和创建集合对象时,可以使用“”标记指

13、定集合 的范型,即指定集合中元素的类型。3、类的继承与接口的实现三、小注注意import不同包下同名类的引发的问题。例如我们程序中使用List类, 引入语句里有import java.awt.*;和import java.util.*,此时使用List就会出 现问题,因为上述两个包中都有List类,此时eclipse不知道该使用哪个, 所以出错。应该明确指明import java.util.List;就可以了。 迭代器的问题在创建迭代器之后,除非通过迭代器自身的 remove 或 add 方法从结 构上对列表进行修改,否则在任何时间以任何方式对列表进行修改,迭 代器都会抛出 Concurren

14、tModificationException第五次课一、要做的工作1、加入一个敌方坦克a)是否需要创建敌方坦克类?b)加入一个标记坦克好坏的变量,然后修改构造方法c)在主类中创建敌方坦克d)用颜色区分敌我坦克2、我方坦克发出炮弹击毁敌方坦克a)是谁击毁敌方坦克,我方坦克还是炮弹?b)如何检测炮弹是否击中坦克?炮弹和坦克都有一个外切矩形,如果这两个矩形相交则证明炮弹击 中坦克,否则没有击中。用Rectangle类可以获取外切矩形,分别获得子弹和坦克的外切矩形, 然后用该类的intersects方法判断矩形是否相交c)Missile类中加入hitTank方法,该方法有无参数?有无返回值?d)hit

15、Tank方法中击中坦克后应该有哪些反应?坦克消失:不再重画坦克就可以了,因此每次重画坦克之前先判断 坦克是否已经死了,死了则直接返回不再重画。所以坦克应该加入 一个标记生死的变量。子弹消失:不再重画子弹并且从容器中remove掉。与处理坦克方式 类似,需注意remove掉子弹时不能引发异常。小问题:击毙坦克后,向相同位置发射炮弹,炮弹仍然会消失,因 为我们虽然不再重画坦克,但是坦克仍然在原来位置上存在。e)什么时候有谁来调用hitTank方法二、知识点1、Rectangle类:Rectangle 指定了坐标空间中的一个区域,通过 Rectangle 对象的左上顶 点的坐标(x,y) 、宽度和高

16、度可以定义这个区域。构造方法:Rectangle(int x, int y, int width, int height) 构造一个新的 Rectangle,其左上角被指定为(x,y) ,而其宽度和 高度由同名称的参数指定其他方法:intersects(Rectangle r) 确定此 Rectangle 是否与指定 Rectangle 相交。2、Get,Set方法这两个方法提供了对一个类的私有变量访问的途径。一个类提供变量和 方法,方法一般是公有的,变量是私有的,即变量不允许外界擅自访问, 如要访问必须使用类自身的set,get方法。三、小注第六课:加入爆炸效果一、要做的工作1、 爆炸类:子弹击中坦克产生一个爆炸的效果,这个效果我们用一个逐 渐变大然后变小的圆来表示。我们把爆炸也抽象为一个类。该类所具有属性和方法有哪些?爆炸地点x,y;爆炸是有生命的live,画出爆炸的方法2、 写完爆炸类后先测试一下,在主类生成一个爆炸类对象,看能否画出 爆炸效果3、 可能同时会有多出发生爆炸,因此我们把爆炸对象放入一个容器中, 然后不断从容

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号