版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 JISHOUUNIVERSITY本科生毕业设计题 目:基于java语言坦克大战游戏开发作 者:学 号:所属学院:信息科学与工程学院专业年级:指导教师:职 称:完成时间:吉首大学教务处制目录基于java语言坦克大战游戏开发1摘 要1Based on the development of Java language Tank Wars Game2第一章 游戏简要说明3第二章 开发环境介绍42.1 开发环境42.2 java语言特点简介42.3 Eclipse开发工具的简介5第三章 系统总体设计63.1程序功能的总和63.2主体模块63.3子弹模块63.4坦克模块73.5 墙模块73.6血液模块7
2、3.7爆炸模块8第四章 游戏详细设计过程94.1创建游戏窗口94.2改变游戏背景颜色。114.3创建坦克114.4 让坦克动起来124.5改变窗口的大小134.6让坦克受控制144.7创建一个Tank类154.8让坦克向8个方向移动164.9修改4.8中所设计的不足184.10添加子弹类194.11根据己方坦克的位置,打出子弹214.12修改坦克停下来不能打出子弹的问题214.13让坦克能够打出多发子弹234.14解决炮弹不消亡和坦克出界的问题234.15增加敌方坦克244.16击毙出现的敌方坦克254.17加入爆炸效果264.18添加多辆敌方坦克274.19让敌方坦克智能化294.20建立游
3、戏障碍物314.21阻止坦克互相穿越324.22为我方坦克添加大招和血条334.23添加血块344.24重新载入敌军或我军坦克354.25加入图片35第五章 游戏的可行性测试375.1游戏界面介绍375.2游戏运行测试40第六章 总结43参考文献44吉首大学毕业设计基于java语言坦克大战游戏开发摘 要随着网络科技的不断发展,我们的生活出现了日新月异的变化,特别是在游戏这一块,出现了前所未有的繁荣,各种各样的游戏进入我们的生活,而当初的“俄罗斯方块”、“坦克大战”、“贪吃蛇”等这些经典中的经典的游戏曾被多少人所知,更是多少80后甚至90后常聊的话题。基于java坦克大战游戏的设计采用了java
4、语言面向对象的思想,在设计的过程中,游戏的所有物体都赋予对象的概念和属性。本游戏的设计是在玩家进行游戏时,通过上下左右键来控制坦克,并且打出炮弹,以消灭所有敌人为游戏目的。在游戏过程中,敌方的坦克也会智能化的躲避玩家打出来的子弹。通过游戏的设计,是对java语言一个方便灵活运用的体现。关键字:网络科技 java 面向对象 智能化Based on the development of Java language Tank Wars GameAbstract With the continuous development of network technology, the emergence o
5、f our life changes, especially in the game this piece, there has been an unprecedented prosperity, all kinds of games to enter our life, and the original Tetris, Tank Wars, greedy eat snake and other classic games have been many people know, is how many 80 or even 90 after the talk.Based on the desi
6、gn of the Java Tank Wars game using java language for the object of thought, in the process of design, the game of all objects are given the concept of the object and attribute. The games design is in the game, the players, through the upper and lower keys to control the tank, and hit the shell, to
7、destroy all the enemies for the purpose of the game. In the course of the game, the enemys tanks will also be intelligent to escape the players to play out the bullet. Through the game design, is a convenient and flexible use of Java language.Keywords: network technology, Java, object-oriented, inte
8、lligent第一章 游戏简要说明坦克大战作为曾经风靡全球的一款FC游戏,可谓是曾经经典中的经典,其极为出色的游戏性令全球众多玩家为之疯狂,更是多少80后甚至90后津津乐道的游戏之一。坦克大战是一款以红白机为平台操作设计游戏。玩家通过控制自己的坦克进行射击,以击毁敌方坦克为目的,每个关卡中有着不同的地形和障碍物,玩家可以利用地形中的障碍物进行射击,障碍物可以阻挡敌方的坦克的子弹,同时,也可以阻挡玩家自身打出来的子弹。因此在游戏中,玩家要利用好地图中的障碍物,来保障自身的安全,以达到消灭敌军的目的。在游戏中,还设置了有各种各样的补给。游戏中坦克能向八个方向移动和开炮,并且坦克与坦克之间不可相互穿
9、越。坦克打出来的炮弹若击中对方,就会产生爆炸现象。玩家的坦克不仅有生命值,而且还有生命个数,当玩家坦克遭到敌方坦克子弹的击打之后,玩家坦克的生命值就会减少,当玩家坦克的生命值减到0时,玩家的坦克就爆炸,同时也会减少一辆坦克数量,玩家也可以通过地图上随机出现的血块来增加自己的血量。当玩家消灭所有的敌方坦克的时候,此时游戏结束;若玩家的坦克被打死,可以按F2键进行开始新的游戏。其操作简单且娱乐性强,是一款男女老少皆宜的游戏。游戏附带地图编辑器,玩家可自行编辑地图进行游戏。游戏中的众多经典关卡至今还让许多玩家记忆犹新,在80年代时曾经在无数家庭中带来了无尽的欢乐。第二章 开发环境介绍2.1 开发环境
10、操作系统:win8.1开发语言:java开发工具:Eclipse2.2 java语言特点简介(1)简单java语言的语法很简单,容易掌握,并且它是纯面向对象的语言。Java语言的简单性可以在下面几点体现出来:1.1语言的语法与C+很相似,从某种角度上说,java是C和C+转变来的,因此,学过C语言的人员可以很轻松的掌握java的语法。1.2 java对C+语言进行了提高和简化。如,java取消了指针,并且使用接口取代了多重继承,因指针和多重继承往往使程序变得复杂。1.3 java提供了很多类库,API文档和第三方开发包,此外,还有丰富的基于java的开发项目,JDK已经开放源代码,学者可通过分
11、析这些源代码,从而来提高自己的水平。(2)面向对象面向对象是java语言的最重要的部分,同时也是java语言的基础部分,java语言本身就是一种纯面向对象的语言。在Java语言中,提倡万物皆面向对象,语法中不能在类外面定义单独的数据和函数,简而言之,java语言最外部的函数类型是对象,所有的元素只能通过类和对象来访问。(3)分布性Java语言的分布性包括操作分布和数据分布,操作分布是指在多个不同的主机上布置相关操作。(4)可移植性Java语言程序具有与体系结构无关的特性,可以很方便的移植到不同型号的计算机中。此外,java的类库中也实现了多不同平台的接口,使得这些类库可以移植。(5)解释性Ja
12、va语言程序的运行需要解释器。任何移植了java解释器的计算机或者其他设备都可以用java字节码进行解释执行。字节码独立于平台,他本身携带了许多编译时的信息,使得连接过程更加简单,开发过程更加迅速,更加具有探索性。(6)安全性Java语言没有像C语言中的指针和内存释放等语法,可以有效避免非法操作内存,并且java代码要经过指针校验,代码校验等测试步骤才能运行,因此,可以很好的保护系统平台。(7)健壮性java程序是以编写多方面的、可靠性的运用为目标的。在编译运行时可以检查错误,消除错误。能更好的帮助用户检测早期出现的错误。(8)多线程多线程机制能够让程序在同一个时间点同时运行多个任务,同时相应
13、的同步机制可以保证不同线程能够正确的共享数据。(9)高性能java编译后的字节码是在解释器中运行的,因此它的速度比多数交互式运用程序提高了许多,此外,字节码可以在程序运行时被翻译成特定平台的机器指令,从而实现运行速度的提高。(10)动态java语言在很多方面比C或C+更能适应发展的环境,可以动态调整库中的方法和增加变量,而客户端却不需要任何更改。在java中进行动态调整是非常简单和直接的。2.3 Eclipse开发工具的简介Eclipse是由IBM公司投资4000万美元开发的集成开发工具。它是基于java语言编写,并且是开放源代码的、可扩展的,也是目前全球最流行、使用最多的java开发工具之一
14、。另外,IBM公司捐出Eclipse源代码,组建Eclipse联盟,它专门负责这种工具的后续开发。Eclipse为程序员提供了很好的java程序开发环境,它的平台系统结构是在插件概念的基础上构建起来的,插件是Eclipse平台最具有特色的特征,同时也是区别于其他开发工具的特征之一。第三章 系统总体设计3.1程序功能的总和表(1)程序表的功能程序名程序功能TankClient.java游戏的主窗口Tank.java坦克的数据和方法Missile.java炮弹的数据和方法Explore.java爆炸的数据和方法Wall.java墙的数据和方法Blood.java血块的数据和方法3.2主体模块主体是
15、由TankClient.java文件来实现的,主要负责各个类的调用和游戏窗口的创建。该类中的变量还有:1. 游戏的高度 int GAME_HEIGHT2. 游戏的宽度 int GAME_WIDTH此外,lauchFrame( )方法、paint( )方法和update( )方法也包括在该类中,其功能分别为实现显示坦克主窗口、重画时调用和使用双缓冲消除闪烁现象。3.3子弹模块子弹模块由Missile.java文件实现,可以实现子弹打坦克和判断子弹是否是活着的功能。该类的变量有如下:1. x方向上的速度 int XSPEED2. Y方向上的速度 int YSPEED3. 子弹的高度 int HEI
16、GHT除了这几个变量外,hitTank( )方法和Islive( )方法也包括在该类中,其功能分别为实现子弹撞坦克和判断子弹是否还活着。3.4坦克模块在坦克模块中可以实现很多功能,如:创建坦克,让坦克能打出子弹,处理坦克和墙相互穿越的问题,为玩家坦克加入血条以及让敌人的坦克智能化的问题。在Tank类中的变量有:1. x方向上的速度 int XSPEED2. Y方向上的速度 int YSPEED3. 坦克的高度 int HEIGHT 该类中还包括collidesWithWall( )方法和Eat( )方法,其功能分别为实现判断坦克和墙相撞的问题和坦克吃到血的问题。3.5 墙模块该模块由Wall.
17、java文件实现,在游戏添加两堵墙,处理坦克和墙相撞的问题。Wall类中成员变量有:1. 坦克在x方向上的速度 int XSPEED2. 坦克在y方向上的速度 int YSPEED3. 坦克的高度 int HEIGHT该类中还包括collidesWithWall( )方法,其功能为处理坦克和墙相撞的问题。3.6血液模块该模块由Blood.java文件实现,添加必要的方法,让血块按照一定轨迹运动,并在一定时间消失。该类中的变量有:1. 血块在X轴的坐标 int X2. 血块在X轴的坐标 int Y3. 血块的高度 int H该类中还包括Move()方法和islive()方法,其功能分别为处理血块
18、移动的问题和判断血块是否还活着的问题。3.7爆炸模块该模块由Explode.java文件实现,击毙一辆坦克后产生爆炸。该类中的变量有:1. 坦克生死的描述 boolean Live2. 主类的变量 TankClient Tc该类中还包括GetDefaultToolkit()方法Draw(Graphics)方法,其功能分别为拿到的工具包和画爆炸现象。第四章 游戏详细设计过程4.1创建游戏窗口在游戏设计的前期,要先创建游戏的界面,也就是要为所设计的游戏创建一个窗口,可通过如下代码实现:import java.awt.*;public class TankClient extends Framepu
19、blic void lauchFrame()this.setLocation(400,300);this.setSize(800,600); setVisible(true);public static void main(String args) TankClient tc = new TankClient();tc.lauchFrame();当运行代码是会发现,这样建立的窗口的大小是可以随意变化的,然而在实际中我们不希望窗口任意改变,这样不仅影响了用户体验,而且还会影响游戏的可行性,因此,我们需要对现有的窗口进行有必要的改进,把窗口的大小固定,改进的代码如下:import java.awt
20、.*;import java.awt.event.*;public class TankClient extends Framepublic void lauchFrame()this.setLocation(400,300);this.setSize(800,600);this.addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent e)System.exit(0););this.setResizable(false);setVisible(true);public static void main
21、(String args) TankClient tc = new TankClient();tc.lauchFrame();产生如下不可随意改动窗口:图(1)游戏窗口4.2改变游戏背景颜色。图(2)改变颜色的游戏窗口this.setBackground(color.GREEN);/*改变背景颜色,这里改为绿色,我们还可以改成其他的颜色*/4.3创建坦克我们用创建一个实心圆来表示游戏中的坦克,此坦克代表我方的坦克,通过重写paint方法来实现。图(3)我方坦克的创建public void paint(Graphics g) Color c = g.getColor();g.setColor(C
22、olor.RED);g.fillOval(50, 50, 30, 30);g.setColor(c);4.4 让坦克动起来上面我们所创建的坦克还不能动,显然不是我们要设计游戏的目的,因此。我们要给我们所设计的坦克赋予“生命”。 具体实现步骤为:(1) 将位置改变为变量;(2) 启动线程不断重画;(3) 每次重画改变坦克的位置。需要注意的是x,y值得含义指的是小方块左上角的点。图(4)单个坦克单个方向移动private class PaintThread implements Runnable public void run() while(true) repaint();try Thread.
23、sleep(100); catch (InterruptedException e) e.printStackTrace();4.5改变窗口的大小很多时候我们需要调节窗口的大小,在程序少的情况下我们可以通过直接改程序中的参数,但是,当我们的程序变得很多的时候,我们会发现当我们要改窗口的大小时,会觉得力不从心,不仅要改的地方很多,既费时又费力,而且还很容易出错,这时,我们可以给窗口的宽度和高度定义一个变量,通过代码重构实现,将以后可能需要多处改变的量定义为常量。如下: public static final int GAME_WIDTH=800; public static final int
24、GAME_HEIGHT=640;以后我们需要用到窗口尺寸的地方就可以用GAME_WIDTH、GAME_HEIGHT来代替,这样就可为我们的以后修改提供很多便捷。注意:常量一般是 public static final的。且常量名一般都用大写。4.6让坦克受控制在4.4中我们建立的坦克虽然可以移动,但移动方向为一直向下,且不受控制,因此我们要为TankClient建立一个键盘监听类,让坦克听从我们的控制。步骤:(1)添加键盘监听器类KeyMonitor; (2)TankClient添加键盘监听器; (3)针对不同的键改变坦克的位置,与重画线程结合产生不同方向运动。图(5)可向四个方向移动的坦克p
25、rivate class KeyMonitor extends KeyAdapterpublic void keyPressed(KeyEvent e)int key=e.getKeyCode();switch(key)case KeyEvent.VK_LEFT:x-=5;break;case KeyEvent.VK_UP:y-=5;break;case KeyEvent.VK_RIGHT:x+=5;break;case KeyEvent.VK_DOWN:y+=5;break; 4.7创建一个Tank类1.将坦克单独包装成类2.步骤:(1)建立坦克类; (2)为Tank类添加成员变量x,y;
26、(3)添加draw方法,使Tank类独立控制自己的画法; (4)添加Tank类的处理按键的方法; (5)根据Tank类修改TankClient类。import java.awt.*;import java.awt.event.*;public class Tank int x,y;public Tank(int x, int y) this.x = x;this.y = y;public void draw(Graphics g)Color c=g.getColor();g.setColor(Color.RED);/*坦克是颜色*/g.fillOval(x, y, 30, 30);g.setC
27、olor(c);public void keyPressed(KeyEvent e)int key=e.getKeyCode();switch(key)case KeyEvent.VK_LEFT:x-=5;break;case KeyEvent.VK_UP:y-=5;break;case KeyEvent.VK_RIGHT:x+=5;break;case KeyEvent.VK_DOWN:y+=5;break;4.8让坦克向8个方向移动前面所设计的坦克只能朝4个方向走,为了让游戏更加具有可玩性,我们为坦克再添加四个方向,让坦克能够朝8个方向移动。具体的步骤为:(1) 添加记录按键状态的布尔量;
28、(2) 添加代表方向的量(枚举);(3) 根据按键状态确定Tank的方向;(4) 根据方向进行下一步的移动(move)。void move()switch(dir)case L:x -= XSPEED;break;case LU:x -= XSPEED;y -= YSPEED;break;case U:y -= YSPEED;break;case RU:x += XSPEED;y -= YSPEED;break;case R:x += XSPEED;break;case RD:x += XSPEED;y += YSPEED;break;case D:y += YSPEED;break;case
29、 LD:x -= XSPEED;y += YSPEED;break;case STOP:break;public void keyPressed(KeyEvent e)int key=e.getKeyCode();switch(key)case KeyEvent.VK_LEFT:bL=true;break;case KeyEvent.VK_UP:bU=true;break;case KeyEvent.VK_RIGHT:bR=true;break;case KeyEvent.VK_DOWN:bD=true;break;locateDirection();void locateDirection(
30、)if(bL & !bU & !bR &!bD)dir=Direction.L;else if(bL & bU & !bR &!bD)dir=Direction.LU;else if(!bL & bU & !bR &!bD)dir=Direction.U;else if(!bL & bU & bR &!bD)dir=Direction.RU;else if(!bL & !bU & bR &!bD)dir=Direction.R;else if(!bL & !bU & bR &bD)dir=Direction.RD;else if(!bL & !bU & !bR &bD)dir=Directio
31、n.D;else if(bL & !bU & !bR &bD)dir=Direction.LD;else if(!bL & !bU & !bR &!bD)dir=Direction.STOP;4.9修改4.8中所设计的不足步骤:(1)处理键抬起的消息; (2)修改TankClient相关代码4.10添加子弹类通过前面的的操作,我们所设计的坦克已经能够听从我们的控制。在这一节中,我们要为坦克设计子弹。具体的操作为:1. 添加子弹Missile类;2. 添加x,y,dir等属性以及常量;1) 添加构造方法,draw方法等必要方法;2) 根据不同的方向进行不同的运动;3) 在TankClient中模
32、拟一颗子弹(new一颗子弹出来,画出子弹)。图(6)坦克打出的子弹import java.awt.*;public class Missile public static final int XSPEED=10;public static final int YSPEED=10;int x,y;Tank.Direction dir;public Missile(int x, int y,Tank. Direction dir) super();this.x = x;this.y = y;this.dir = dir;public void draw(Graphics g)Color c=g.g
33、etColor();g.setColor(Color.BLACK);g.fillOval(x, y, 10, 10);g.setColor(c);move();private void move()switch(dir)case L:x -= XSPEED;break;case LU:x -= XSPEED;y -= YSPEED;break;case U:y -= YSPEED;break;case RU:x += XSPEED;y -= YSPEED;break;case R:x += XSPEED;break;case RD:x += XSPEED;y += YSPEED;break;c
34、ase D:y += YSPEED;break;case LD:x -= XSPEED;y += YSPEED;break;4.11根据己方坦克的位置,打出子弹上一节设计的坦克的子弹在一开始时就自动打出,而且这颗子弹也是不听指挥的。这显然不是设计的目标和实际游戏的需要,为了解决这一的问题,我们需要进行下一步处理。步骤为:(1)增加对Ctrl键的按键处理;(2)根据坦克打出一颗子弹来确定Tank中的方法fire。返回值为Missle;(3)根据Tank方向和位置设定子弹的方向和位置,并new出来,然后返回。图(7)坦克向左下打出一发子弹4.12修改坦克停下来不能打出子弹的问题5.1中的坦克在运行
35、的时候会发现,坦克的子弹只有在移动的时候才能打出子弹,为了解决这个问题,可进行如下修改:(1) 在Tank类中加入新的ptDir属性;(2) 在每次move后根据Tank的方向确定炮筒的方向;(3) 炮筒可用直线表示出来。图(8)画出一根炮筒switch(ptDir)case L:g.drawLine(x + Tank.WIDTH/2,y+Tank.HEIGHT/2,x,y+Tank.HEIGHT/2);break;case LU:g.drawLine(x + Tank.WIDTH/2,y+Tank.HEIGHT/2,x,y);break;case U:g.drawLine(x + Tank.
36、WIDTH/2,y+Tank.HEIGHT/2,x+Tank.HEIGHT/2,y);break;case RU:g.drawLine(x + Tank.WIDTH/2,y+Tank.HEIGHT/2,x+Tank.HEIGHT,y);break;case R:g.drawLine(x + Tank.WIDTH/2,y+Tank.HEIGHT/2,x+Tank.HEIGHT,y+Tank.HEIGHT/2);break;case RD:g.drawLine(x + Tank.WIDTH/2,y+Tank.HEIGHT/2,y+Tank.HEIGHT,y+Tank.HEIGHT);break;c
37、ase D:g.drawLine(x + Tank.WIDTH/2,y+Tank.HEIGHT/2,x+Tank.HEIGHT/2,y+Tank.HEIGHT);break;case LD:g.drawLine(x + Tank.WIDTH/2,y+Tank.HEIGHT/2,x,y+Tank.HEIGHT);break;4.13让坦克能够打出多发子弹让所设计的坦克能打出多发子弹:(1) 使用容器把炮弹装起来;(2) 每当抬起Ctrl键时就往容器中加入新的炮弹;(3) 逐一画出坦克打出来的每一发炮弹; 注意:泛型的使用;将TankClient的实例传递到Tank中;this的运用,类 的初始化
38、过程。图(9)坦克打出多发子弹4.14解决炮弹不消亡和坦克出界的问题解决方法:(1)在程序中加入blive,又来控制炮弹的生死;(2) 当判断到炮弹已经死去的时候不再对炮弹重画;(3) 炮弹飞出边界就认为炮弹死亡;(4) 死亡的炮弹就从容器中移除。图(10)子弹消亡4.15增加敌方坦克在加入敌方坦克之前我们可能会考虑是否需要建立一个敌方坦克新的类,事实上这样做会很麻烦,我们只要在我们建好的Tank类中加入区分敌我的变量即可。可通过以下步骤来实现:(1) 加入能够区分敌人坦克和玩家坦克的量Good;(2) 把玩家的坦克和敌方的坦克设置不同的颜色;(3) 更新Tank类中的函数,加入Good;(4
39、) 在TankClient中new出敌方的坦克,并且把它画出来。图(11)加入的敌方坦克public Tank(int x, int y,boolean good) this.x = x;this.y = y;this.good=good;public Tank(int x,int y,boolean good,TankClient tc)this(x,y,good);this.tc=tc;/设置我放坦克4.16击毙出现的敌方坦克通过上面的设计,在游戏窗口中已经加入了敌方坦克,而在我们操作的过程中,当我们的坦克向敌方坦克开炮时,我们会发现,我们打出来的子弹不仅打不死敌方坦克,而且,我们打出来的
40、子弹还会穿过敌方继续向前飞去。为了解决这个问题,我们进行下一步优化:(1) 在Missile中加入hitTank(Tank)的方法,它的返回值为布尔类型;(2) 添加碰撞检测的Rectangle辅助类;(3) 把getRect方法加入到Tank和Missile中;(4) 当坦克打出来的子弹打中敌方坦克时,坦克死亡,并且子弹也消失;(5) 加入blive量,来控制坦克时死活;(6) 如果坦克被打死后,就不需要画。图(12)敌人坦克被击毙4.17加入爆炸效果为了使我们设计的游戏更加逼真,我们需要为游戏添加很多效果,为此,我们为我们设计的游戏添加爆炸的效果。具体的设计步骤如下:1. 添加爆炸类1)
41、用不同直径的园来模拟坦克爆炸的效果;2) 加入Live;3) 加入位置属性;4) 加入draw方法。2.爆炸应该存在于集合类中1)在TankClient加入集合;2)将集合中的爆炸一一画出,如果死去的就祛除;3.坦克被击毙后产生相应的爆炸1)hitTanke时应产生一个爆炸;2)不能直接访问爆炸集合;3)加入TankClient引用;4)当new Missile时应该指定在哪里画出;5)修改Tank类fire方法,当new Missile时将保存好的TankClient变量传递给Missile。爆炸效果如下图所示:图(13)爆炸效果import java.awt.*;public class
42、Explode int x,y;private boolean live=true;private TankClient tc;int diameter = 4,7,12,18,26,32,49,30,14,6;int step=0;public Explode(int x,int y ,TankClient tc)this.x=x;this.y=y;this.tc=tc;public void draw(Graphics g)if(!live) tc.explodes.remove(this);return;if(step=diameter.length)live=false;step=0;
43、return;Color c=g.getColor();g.setColor(Color.ORANGE);g.fillOval(x, y, diameterstep, diameterstep);g.setColor(c);step+;4.18添加多辆敌方坦克在上一步的基础上,我们向所设计的游戏里面加入多辆敌方坦克,此目标的实现,可通过用容器来装敌人的Tank;容器中装入多辆敌人Tank,画出来。当我们运行时会发现,此时的敌方坦克不能被己方打出来的子弹所打掉,因此,我们需要添加hitTank方法,打一系列Tank;TankClient里面每发子弹都打tanks。运行的结果如下图所示。图(14)
44、添加的多辆坦克图(15)添加并且可以打掉敌方坦克4.19让敌方坦克智能化在4.17中我们添加了多辆敌方坦克,并且当己方坦克开炮打中敌人时,敌方的坦克也同时消失,可是,游戏进行到这个程度还有很多的不足,敌方的坦克虽然已经出来了,但是都还不会动,换句话说就是,敌人就是傻乎乎在站在那里让你打,这样显然是没有一点游戏乐趣的,除此之外,敌方坦克还不能开炮,如果这样的游戏游戏起来,我们会有一种杀鸡焉用宰牛刀的感觉,毫无一点游戏的乐趣和可玩性。所以,我们要让敌方坦克动起来,并且还能向四周开炮,这样才能更好的添加游戏的乐趣和游戏的可玩性。具体实现的方法可通过下面方法实现。步骤和内容:1.让敌方坦克动起来1)在
45、造函数中可以指定方向;2)在new敌军坦克的时候指定敌军坦克的方向。 2.让敌军的坦克能够向四周移动1)(Tank)静态的,添加随机数产生器java.util.Random;2)move完成后,如果是敌军坦克的,随机产生一个数,来设定坦克下一个方向;3)Direction.values()。3.让敌军的坦克能够向四周移动的步骤1)添加变量,记录随机步骤;2)当=0时,改变方向,否则,随机步骤递减。4.让敌方坦克也能打出炮弹1)炮弹也添加好坏,根据颜色来区分;2)若本军坦克的子弹打到本军队友,将不产生作用;3)重新修改炮弹的构造方法;4)修改Tank和fire方法;5)修改hitTank方法,实
46、现友军坦克的子弹部对友军产生效果。图(15)多辆敌方坦克private static Random r = new Random();if(!good) Direction dirs = Direction.values();if(step = 0) step = r.nextInt(12) + 3;int rn = r.nextInt(dirs.length);dir = dirsrn;step -;if(r.nextInt(40) 38) this.fire();public Missile fire() if(!live) return null;int x = this.x + Tan
47、k.WIDTH/2 - Missile.WIDTH/2;int y = this.y + Tank.HEIGHT/2 - Missile.HEIGHT/2;Missile m = new Missile(x, y, good, ptDir, this.tc);tc.missiles.add(m);return m;4.20建立游戏障碍物添加游戏障碍物,也就是我们通常所说的“墙”。墙的功能主要是用来来阻挡敌方坦克的子弹,而且还有阻挡敌方坦克的功能。让我们在游戏时对自身的安全有一定的保障。游戏障碍物的添加,可以通过以下步骤实现:1. 建立新的类Wall,建立Wall的对象并把它画出来;2. 让每一
48、颗子弹打每一堵墙,用hitWall()方法实现;3. 坦克不能穿过墙。具体步骤为:1) 记录上一次的位置oldX,oldY;2) 重新修改构造函数;3) 每次move之前都记录上一次的位置;4) 添加stay方法;5) 记录移动前的位置;6) 当坦克在移动中撞到墙就回到原来的位置;7) 当坦克碰到墙是stay。图(15)坦克碰墙检测import java.awt.*;public class Wall int x, y, w, h;TankClient tc ;public Wall(int x, int y, int w, int h, TankClient tc) this.x = x;t
49、his.y = y;this.w = w;this.h = h;this.tc = tc;public void draw(Graphics g) g.fillRect(x, y, w, h);public Rectangle getRect() return new Rectangle(x, y, w, h);4.21阻止坦克互相穿越上版本中,在运行游戏时,我们会发现坦克之间是可以互相穿越的,这显然不符合游戏和现实的要求。为此,我们进行如下改进。当坦克撞到Tank是stay。public boolean collidesWithTanks(java.util.List tanks) for(
50、int i=0; itanks.size(); i+) Tank t = tanks.get(i);if(this != t) if(this.live & t.isLive() & this.getRect().intersects(t.getRect() this.stay();t.stay();return true;return false;4.22为我方坦克添加大招和血条在现在的很多游戏中,由于开发时为了给游戏增加难度,而玩家的水平不一定达到相应的水准,很多游戏都为玩家的角色增加了大招的功能,在大招开启的情况下,可以有助于玩家顺利通关。在这个游戏中也不另外,我们也要为我们的坦克增加大招的功能。游戏到这里的时候,以前我们玩时,开炮都是通关按“Ctrl”键来实现的,再此,我们增加处理按键“A”,当玩家在游戏时按下“A”时,就会触发大招功能,也就是我们的坦克回想八个方向发射子弹。图(16)向八个方向打出的子弹效果图此外,我们还要为主战坦克的添加生命值,通过加入life变量;在窗口显示生命值来实现。图形化表示主战坦克的生命值。根据不同的life值进行的不同的显示。图(17)血条效果4.23添加血块添加blood类;添加必要的方法;让blood对象固定轨迹运动, 并在一定时间后消失。图
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年安徽中烟工业有限责任公司高层次人才招聘(3人)笔试备考试题及答案解析
- 2026年平顶山工业职业技术学院单招职业技能考试题库附答案详细解析
- 2026中国劳动关系学院招聘7人笔试模拟试题及答案解析
- 2026年陕西省榆林市高职单招职业适应性测试考试题库附答案详细解析
- 2026湖北恩施州宣恩县事业单位第一次引进高层次、紧缺急需人才22人笔试参考题库及答案解析
- 2026年石家庄职业技术学院单招综合素质考试题库附答案详细解析
- 2026年潍坊临朐县公立医院校园招聘(30名)笔试模拟试题及答案解析
- 2026云南昆明海螺新材料科技有限公司社会招聘1人笔试备考题库及答案解析
- 2026届重庆市第四十二中学初三英语试题第一次联合调考3月联考试题含解析
- 浙江省温中实验学校2025-2026学年初三六校第二次联考语文试题试卷含解析
- 国家事业单位招聘2023中国地质调查局昆明自然资源综合调查中心第二批招聘拟聘用人员云笔试历年参考题库典型考点附带答案详解
- 代理记账内部交接制度
- 5.1人民代表大会制度 课件(23张幻灯片)+内嵌视频 道德与法治统编版八年级下册
- 动火作业与受限空间安全管理标准
- 2026年当辅警笔试题库及一套完整答案
- 北京市东城区2025-2026学年高二上学期期末考试化学试卷(含答案)
- 国家基层糖尿病防治管理指南(2025版)
- 牛肝菌介绍教学课件
- 2025至2030中国慢性偏头痛治疗行业市场深度研究与战略咨询分析报告
- 《安全生产违法行为行政处罚办法》(应急部18号令)解读
- GB/T 8175-2025设备及管道绝热设计导则
评论
0/150
提交评论