当前位置:文档之家› 坦克大战游戏设计与制作

坦克大战游戏设计与制作

目录1 需求分析 (1)1.1 用户简介 (1)1.2 项目目的和目标 (1)1.3 功能和环境 (1)2 系统设计 (2)3 系统实现 (3)3.1系统框架设计与实现 (3)3.1.1 系统框架功能概述 (3)3.1.2 系统框架实现过程 (3)3.2 地图模块设计与实现 (5)3.2.1 地图模块功能概述 (5)3.2.2 地图模块实现过程 (5)3.3坦克模型模块设计与实现 (6)3.3.1 坦克模块功能概述 (6)3.3.2 坦克模块实现过程 (7)3.4敌方坦克模块设计与实现 (8)3.5炮弹模块设计与实现 (8)3.5.1 炮弹模块实现过程 (8)3.6炮弹碰撞检测模块设计与实现 (9)3.6.1 炮弹碰撞检测模块功能概述 (9)3.6.2 炮弹碰撞检测模块实现过程 (9)3.7信息面板模块设计与实现 (10)3.7.1 信息面板模块功能概述 (10)3.7.2 信息面板模块实现过程 (11)4 实训总结 (13)附录 (14)1 需求分析1.1 用户简介近年来,手机游戏市场规模迅速增长,市场潜力巨大,同时,我国政府在大力扶持手机游戏行业,特别是对我国本土游戏企业的扶持,手机游戏已被列入国家863计划。

积极参与游戏开发的国内企业可享受政府税收优惠和资金支持,同时,政府也加紧了对外国游戏开发商的管理制度。

除此之外,我国政府各部门还采取了各种各样的形式来帮助发展国内手机游戏行业,手机游戏产业正高速发展。

用户角色大致分为:玩家1.2 项目目的和目标随着科技的发展,手机的功能越来越强大,手机已经成为大多数人生活的一部分,人们渐渐习惯于将手机作为新的娱乐工具,而游戏也已成为手机上不可缺少的功能。

如今手机游戏的规划越来越复杂,画而越来越精美,娱乐性和交互性也越来越强,已经可以和当年的“Gameboy”掌上游戏相媲。

因此,开发这样一个娱乐游戏成为很有必要的事情。

经过思考,我们设计了一块一款“坦克大战”的游戏以丰富人们的娱乐生活。

1.3 功能和环境功能:坦克大战共分为两个对象,分别是用户和电脑。

用户可以通过控制玩家的坦克来摧毁敌方的坦克保护自己的“家”,把所有的敌方坦克消灭完达到胜利。

敌方的坦克在初始的时候是默认三十个的(这可以自己设置),当然,如果玩家被敌方坦克的子弹打中,那就gameover。

运行环境:Java虚拟机。

坦克大战游戏是由系统框架、地图模块、坦克模型模块、敌方坦克模块、炮弹模块、炮弹碰撞检测、信息面板模块这七个功能模块组成。

分别是:➢系统框架:主界面设计➢地图模块:读取并显示地图➢坦克模型模块:设计坦克并在地图中显示➢敌方坦克模块:加入敌方坦克并使其移动➢炮弹模块:加入炮弹并使其移动➢炮弹碰撞检测:炮弹击中墙或坦克、炮弹之间的碰撞➢信息面板模块:显示战场信息并实时更新3.1系统框架设计与实现3.1.1 系统框架功能概述➢界面设计➢整体是一个JSplitPane,分为左右两部分。

➢左侧显示控制信息,右侧显示战场信息,都是JPanel的子类。

➢战场是24*24的方格,每个方格为25像素*25像素如下图所示:图1 系统运行界面3.1.2 系统框架实现过程先要把左右界面的大小给分布好,把现实面板在左边显示,战场面板在右边显示。

package tank.view;import javax.swing.JFrame;import javax.swing.JSplitPane;public class TankGame extends JFrame{JSplitPane splitPane;InfoField info; //左部信息BattleField battle; //右部战场public TankGame(){setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setSize(750+8*2,600+30+8);//分隔面板splitPane = new JSplitPane();splitPane.setSize(750,600);splitPane.setDividerLocation(150);splitPane.setDividerSize(1);//初始化右部面板battle = new BattleField();splitPane.setRightComponent(battle);//初始化左部面板info = new InfoField();splitPane.setLeftComponent(info);info.setBattleField(battle);battle.setInfo(info);info.showInfo();setContentPane(splitPane);addKeyListener(battle);setVisible(true);}}3.2 地图模块设计与实现3.2.1 地图模块功能概述游戏中的地图共有三种:➢地面(坦克可以在上面移动)➢墙(坦克不能通过,但墙能被炮弹击毁)➢主基地图2 地图的设计3.2.2 地图模块实现过程byte[][] map; //地图数组BattleField battle;//地图的宽和高public static final int MapWidth = 24;public static final int MapHeight = 24;//加载地图public void loadMap(String mapFileName) throws IOException{ map = new byte[MapWidth][MapHeight];File file = new File(mapFileName);Scanner scanner = new Scanner(file);for(int i=0;i<MapWidth;i++){for(int j=0;j<MapHeight;j++){map[i][j] = scanner.nextByte();}}}//获取地图信息public byte getInfoAt(int row, int col){if(row<0 || row>=MapHeight || col<0 ||col>=MapWidth) return UNEXPLORED;return map[row][col];}//设置地图信息public void setInfoAt(int row, int col, byte value){if(row<0 || row>=MapHeight || col<0 ||col>=MapWidth) return;map[row][col] = value;}//获取地图大小(宽)public int getMapWidth(){return MapWidth;}//获取地图大小(高)public int getMapHeight(){return MapHeight;}3.3坦克模型模块设计与实现3.3.1 坦克模块功能概述坦克的功能有:➢发射炮弹:按下空格键,玩家坦克可以发射炮弹➢移动速度:根据炮弹的类型,速度有不同的值➢结实程度:根据炮弹的类型,坦克的结实程度不同图3 坦克的功能3.3.2 坦克模块实现过程//发射炮弹public Shell fire(){int tankX = 25*position.getCol();int tankY = 25*position.getRow();int x = 0;int y = 0;if(direction==Direction.up){x = tankX +11;y = tankY - 6;}else if(direction==Direction.down){x = tankX + 11;y = tankY +25;} else if(direction==Direction.left){x = tankX - 6;y = tankY + 11;} else if(direction==Direction.right){x = tankX + 25;y = tankY + 11;}Shell shell = new Shell(this,shellSpeed,direction,x,y);shell.setMap(map);shell.setBattle(battle);return shell;}// 移动速度(移动间隔时间)public static final int speedNormal = 500;public static final int speedFast = 200;public static final int speedSlow = 800;// 结实程度public static final int hpNormal = 1;public static final int hpHard = 2;public static final int hpExtremeHard = 3;3.4敌方坦克模块设计与实现3. 4. 1 坦克的类别FastTank, //侦察坦克。

移动速度快,炮弹速度正常,生命值普通NormalTank, //普通坦克。

移动速度一般,炮弹速度正常,生命值较高HardTank, //肉盾坦克。

移动速度慢,炮弹速度正常,生命值非常高AttackTank, //攻击坦克。

移动速度一般,炮弹速度非常快,生命值普通PlayerDefault //初始的用户坦克。

移动速度一般,炮弹速度正常,生命值普通出现的概率:➢15%可能是侦查坦克,➢35%是普通坦克,➢25%是肉盾坦克,➢25%是攻击坦克3.5炮弹模块设计与实现3.5.1 炮弹模块实现过程首先要获取炮弹的图片,然后在设置炮弹的速度,大小。

// 移动一次。

炮弹大小是3*6像素,每次移动6像素public void move() {if (dir == Direction.up) {pixelY -= 6;} else if (dir == Direction.down) {pixelY += 6;} else if (dir == Direction.left) {pixelX -= 6;} else if (dir == Direction.right) {pixelX += 6;}}// 炮弹速度(移动间隔时间)public static final int shellSpeedNormal = 100;public static final int shellSpeedFast = 70;public static final int shellSpeedExtremeFast = 35;3.6炮弹碰撞检测模块设计与实现3.6.1 炮弹碰撞检测模块功能概述炮弹碰撞检测有两种:➢炮弹是否有效是否超出地图检测地形遇到墙是否碰到坦克是否遇到其他炮弹➢炮弹是否和shell发生碰撞两个炮弹都水平两个炮弹都垂直一个水平一个垂直3.6.2 炮弹碰撞检测模块实现过程//是否和shell发生碰撞public boolean isConflict(Shell shell){boolean result = false;//两个炮弹都水平if((this.getDir()==Direction.left || this.getDir()==Direction.right)&& (shell.getDir()==Direction.left || shell.getDir()==Direction.right)){//在同一水平位置if(this.getPixelY()==shell.getPixelY()){if(this.getPixelX()>=shell.getPixelX()-6 && this.getPixelX()<=shell.getPixelX()+6){return true;}}}//两个炮弹都垂直if((this.getDir()==Direction.up || this.getDir()==Direction.down)&& (shell.getDir()==Direction.up || shell.getDir()==Direction.down)){//在同一条竖线上if(this.getPixelX()==shell.getPixelX()){if(this.getPixelY()>=shell.getPixelY()-6 && this.getPixelY()<=shell.getPixelY()+6){return true;}}}//一个水平一个垂直if((this.getDir()==Direction.left || this.getDir()==Direction.right)&& (shell.getDir()==Direction.up || shell.getDir()==Direction.down)){ if(this.getPixelX()>=shell.getPixelX()-6 && this.getPixelX()<=shell.getPixelX()+3){if(this.getPixelY()>=shell.getPixelY()-3 && this.getPixelY()<=shell.getPixelY()+6){return true;}}}return result;}3.7信息面板模块设计与实现3.7.1 信息面板模块功能概述信息面板包括:➢关卡➢生命值➢炮弹数量➢当前敌军➢敌方援军3.7.2 信息面板模块实现过程public class InfoField extends JPanel{JLabel level_lb,level_n; //关卡JLabel hp_lb,hp_n; //生命值JLabel shells_lb,shells_n; //炮弹数JLabel curEnemies_lb,curEnemies_n; //当前敌军JLabel remEnemies_lb,remEnemies_n; //敌方援军BattleField battleField;public InfoField() {setLayout(null);setSize(150,600);//设置文字level_lb = new JLabel("关卡");hp_lb = new JLabel("生命值");shells_lb = new JLabel("炮弹数量");curEnemies_lb = new JLabel("当前敌军");remEnemies_lb = new JLabel("敌方援军");//设置位置和大小level_lb.setBounds(5, 10, 100, 30);hp_lb.setBounds(5, 40, 100, 30);shells_lb.setBounds(5, 70, 100, 30);curEnemies_lb.setBounds(5, 100, 100, 30);remEnemies_lb.setBounds(5, 130, 100, 30);//创建出组件,方便后续对其进行设置level_n = new JLabel("1");hp_n = new JLabel();shells_n = new JLabel();curEnemies_n = new JLabel();remEnemies_n = new JLabel();//设置位置和大小level_n.setBounds(105, 10, 50, 30);hp_n.setBounds(105, 40, 50, 30);shells_n.setBounds(105, 70, 50, 30);curEnemies_n.setBounds(105, 100, 50, 30);remEnemies_n.setBounds(105, 130, 50, 30);}public void setBattleField(BattleField battleField) {this.battleField = battleField;}public void showInfo(){add(level_lb);add(level_n);add(hp_lb);add(hp_n);add(shells_lb);add(shells_n);add(curEnemies_lb);add(curEnemies_n);add(remEnemies_lb);add(remEnemies_n);}public void setInfo(){hp_n.setText(battleField.getPlayerHp()+"");shells_n.setText(battleField.getShellCount()+"");curEnemies_n.setText(battleField.getCurEnemyCount()+"");remEnemies_n.setText(battleField.getRemEnemyCount()+"");}}4 实训总结通过这次JAVA实训,不仅让我怀念起了童年时玩的游戏—《坦克大战》,并且能在娱乐中快乐的学习。

相关主题