坦克大战游戏设计与制作

上传人:沈*** 文档编号:150746690 上传时间:2022-09-10 格式:DOC 页数:19 大小:175.50KB
返回 下载 相关 举报
坦克大战游戏设计与制作_第1页
第1页 / 共19页
坦克大战游戏设计与制作_第2页
第2页 / 共19页
坦克大战游戏设计与制作_第3页
第3页 / 共19页
点击查看更多>>
资源描述
目 录1 需求分析11.1 用户简介11.2 项目目的和目标11.3 功能和环境12 系统设计23 系统实现33.1系统框架设计与实现33.1.1 系统框架功能概述33.1.2 系统框架实现过程33.2 地图模块设计与实现53.2.1 地图模块功能概述53.2.2 地图模块实现过程53.3坦克模型模块设计与实现63.3.1 坦克模块功能概述63.3.2 坦克模块实现过程73.4敌方坦克模块设计与实现83.5炮弹模块设计与实现83.5.1 炮弹模块实现过程83.6炮弹碰撞检测模块设计与实现93.6.1 炮弹碰撞检测模块功能概述93.6.2 炮弹碰撞检测模块实现过程93.7信息面板模块设计与实现103.7.1 信息面板模块功能概述103.7.2 信息面板模块实现过程114 实训总结13附录141 需求分析1.1 用户简介近年来,手机游戏市场规模迅速增长,市场潜力巨大,同时,我国政府在大力扶持手机游戏行业,特别是对我国本土游戏企业的扶持,手机游戏已被列入国家863计划。积极参与游戏开发的国内企业可享受政府税收优惠和资金支持,同时,政府也加紧了对外国游戏开发商的管理制度。除此之外,我国政府各部门还采取了各种各样的形式来帮助发展国内手机游戏行业,手机游戏产业正高速发展。用户角色大致分为:玩家 1.2 项目目的和目标随着科技的发展,手机的功能越来越强大,手机已经成为大多数人生活的一部分,人们渐渐习惯于将手机作为新的娱乐工具,而游戏也已成为手机上不可缺少的功能。如今手机游戏的规划越来越复杂,画而越来越精美,娱乐性和交互性也越来越强,已经可以和当年的“Gameboy”掌上游戏相媲。因此,开发这样一个娱乐游戏成为很有必要的事情。经过思考,我们设计了一块一款“坦克大战”的游戏以丰富人们的娱乐生活。1.3 功能和环境功能:坦克大战共分为两个对象,分别是用户和电脑。用户可以通过控制玩家的坦克来摧毁敌方的坦克保护自己的“家”,把所有的敌方坦克消灭完达到胜利。敌方的坦克在初始的时候是默认三十个的(这可以自己设置),当然,如果玩家被敌方坦克的子弹打中,那就gameover。运行环境:Java虚拟机。2 系统设计坦克大战游戏是由系统框架、地图模块、坦克模型模块、敌方坦克模块、炮弹模块、炮弹碰撞检测、信息面板模块这七个功能模块组成。分别是: 系统框架:主界面设计 地图模块:读取并显示地图 坦克模型模块:设计坦克并在地图中显示 敌方坦克模块:加入敌方坦克并使其移动 炮弹模块:加入炮弹并使其移动 炮弹碰撞检测:炮弹击中墙或坦克、炮弹之间的碰撞 信息面板模块:显示战场信息并实时更新3 系统实现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 JFrameJSplitPane 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 IOExceptionmap = new byteMapWidthMapHeight;File file = new File(mapFileName);Scanner scanner = new Scanner(file);for(int i=0;iMapWidth;i+)for(int j=0;jMapHeight;j+)mapij = scanner.nextByte();/获取地图信息public byte getInfoAt(int row, int col)if(row=MapHeight | col=MapWidth) return UNEXPLORED;return maprowcol;/设置地图信息public void setInfoAt(int row, int col, byte value)if(row=MapHeight | col=MapWidth) return;maprowcol = 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.getPixelY()-6 & this.getPixelY()=shell.getPixelX()-6 & this.getPixelX()=shell.getPixelY()-3 & this.getPixelY()=shell.getPixelY()+6)return true;return result;3.7信息面板模块设计与实现3.7.1 信息面板模块功能概述信息面板包括: 关卡 生命值 炮弹数量 当前敌军 敌方援军3.7.2 信息面板模块实现过程public class InfoField extends JPanelJLabel 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实训,不仅让我怀念起了童年时玩的游戏坦克大战,并且能在娱乐中快乐的学习。之前总感觉编写游戏很难,但是通过这次的实训让我对编程充满了信心,再大的游戏都是一步一步通过小程序组合在一起的。在这次实践中,我深深的认识到自己的不足,并感到自己知识的匮乏,这也让我明白了学习高级语言类的知识的重点所在。在设计这个游戏的过程中,我经常不知道如何用代码实现一些功能,所以以后要多敲代码,多掌握一些课外的知识。 总而言之,这次实训对我受益匪浅,不仅对之前学过的知识进行了巩固,并且对自己的未来充满了信心。还有这次实训的顺利完成离不开老师的教导和同学的帮助,谢谢你们的帮助,我的成长离不开你们,我会继续努力的。附录package tank.view;import java.io.*;import java.util.ArrayList;import java.util.List;import java.util.Random;import java.util.Scanner;import tank.model.Direction;import tank.model.Position;import tank.model.Shell;import tank.model.Tank;public class GameMap byte map; /地图数组BattleField battle;/地图的宽和高public static final int MapWidth = 24;public static final int MapHeight = 24;/玩家的初始位置public static final int playerRow = MapHeight-1;public static final int playerCol = 0;/加载地图public void loadMap(String mapFileName) throws IOExceptionmap = new byteMapWidthMapHeight;File file = new File(mapFileName);Scanner scanner = new Scanner(file);for(int i=0;iMapWidth;i+)for(int j=0;jMapHeight;j+)mapij = scanner.nextByte();/获取地图信息public byte getInfoAt(int row, int col)if(row=MapHeight | col=MapWidth) return UNEXPLORED;return maprowcol;/设置地图信息public void setInfoAt(int row, int col, byte value)if(row=MapHeight | col=MapWidth) return;maprowcol = value;/获取地图大小(宽)public int getMapWidth()return MapWidth;/获取地图大小(高)public int getMapHeight()return MapHeight;/获取玩家初始位置public Position getPlayerInitPos()Position pos = new Position();pos.setRow(playerRow);pos.setCol(playerCol);return pos;/获取地方坦克初始位置public Position getEnemyPos()Position poses = new Position3;poses0 = new Position(0,0);poses1 = new Position(0,12);poses2 = new Position(0,23);return poses;/地形信息public static final byte WAY = 2; /可以行走的地形public static final byte WALL = 1; /能被破坏的墙public static final byte BASE = 3; /主基地public static final byte BASEPART = 0; /主基地的一部分public static final byte UNEXPLORED = 9; /超出地图的部分/*public static void main(String args) GameMap gameMap = new GameMap();trygameMap.loadMap(map.dat);catch(IOException e)System.out.println(文件读取失败!);for(int i=0;igameMap.getMapHeight();i+)for(int j=0;jgameMap.getMapWidth();j+)System.out.print(gameMap.getInfoAt(i, j)+ );System.out.println();*/public void tankUp(Tank tank) tank.setDirection(Direction.up); /设置坦克方向tank.setImage(tank.getImageUp(); /设置图片方向Position pos = tank.getPosition();int row = pos.getRow();int col = pos.getCol();if(getInfoAt(row-1,col)=WAY)pos.setRow(row-1);tank.setPosition(pos);public void tankDown(Tank tank) tank.setDirection(Direction.down); /设置坦克方向tank.setImage(tank.getImageDown(); /设置图片方向Position pos = tank.getPosition();int row = pos.getRow();int col = pos.getCol();if(getInfoAt(row+1,col)=WAY)pos.setRow(row+1);tank.setPosition(pos);public void tankLeft(Tank tank) tank.setDirection(Direction.left); /设置坦克方向tank.setImage(tank.getImageLeft(); /设置图片方向Position pos = tank.getPosition();int row = pos.getRow();int col = pos.getCol();if(getInfoAt(row,col-1)=WAY)pos.setCol(col-1);tank.setPosition(pos);public void tankRight(Tank tank) tank.setDirection(Direction.right); /设置坦克方向tank.setImage(tank.getImageRight(); /设置图片方向Position pos = tank.getPosition();int row = pos.getRow();int col = pos.getCol();if(getInfoAt(row,col+1)=WAY)pos.setCol(col+1);tank.setPosition(pos);public Shell tankFire(Tank tank)return tank.fire();public void setBattle(BattleField battle) this.battle = battle;public Direction getNextDir(Tank tank)List dirList = new ArrayList();Position pos = tank.getPosition();int row = pos.getRow();int col = pos.getCol();/向上是可行的if(getInfoAt(row-1,col)=WAY)dirList.add(Direction.up);/向下是可行的if(getInfoAt(row+1,col)=WAY)dirList.add(Direction.down);/向左是可行的if(getInfoAt(row,col-1)=WAY)dirList.add(Direction.left); /向右是可行的if(getInfoAt(row,col+1)=WAY)dirList.add(Direction.right);Random random = new Random();int choice = random.nextInt(dirList.size();/System.out.println(choice + in + dirList.size();return dirList.get(choice);18
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!