09 C++课程设计_坦克大战
- 格式:doc
- 大小:971.50 KB
- 文档页数:32
坦克大战游戏的设计与实现
坦克大战是一款经典的战争射击游戏,其设计与实现主要包含以下几个方面:
1. 游戏场景设计:坦克大战的游戏场景一般为一个二维平面,可以包含不同的地形和障碍物。
玩家需要在场景中行驶,躲避障碍物并与敌人战斗。
2. 角色设计:游戏中的角色主要包括玩家操控的坦克和敌方坦克。
每种坦克可以有不同的属性和武器,玩家需要根据场景和敌人的不同来选择合适的坦克。
3. 操作设计:玩家需要通过键盘或手柄等设备来控制坦克的移动和攻击。
游戏可以设置多种不同的按键布局和操作方式,方便玩家更好的体验游戏。
4. 武器系统设计:坦克大战中的武器系统包括主炮和副武器。
玩家可以根据需要选择不同的武器来攻击敌人。
每种武器有不同的攻击范围和伤害值,玩家需要掌握好使用的时机。
5. AI设计:敌方坦克的行动需要基于一定的 AI 算法,使其能够智能地移动和攻击。
可以根据不同的地形和玩家的行动来调整AI 的行为规则,提高游戏的难度和可玩性。
6. 特效设计:坦克大战的游戏画面需要包含丰富的特效元素,如爆炸、火焰等等,能够增强游戏的视觉体验。
综上所述,坦克大战游戏的设计与实现需要综合考虑多个方面的因素,包括场景、角色、操作、武器系统、AI 等等。
只有这些要
素都得到了妥善的设计和实现,才能够制作出一款经典的坦克射击游戏。
坦克大战游戏策划书3篇篇一《坦克大战游戏策划书》一、游戏概述1. 游戏名称:坦克大战2. 游戏类型:射击游戏3. 游戏背景:设定在一个虚构的战争世界,玩家将扮演坦克驾驶员,参与各种战斗任务。
4. 游戏目标:通过消灭敌人、摧毁敌方基地或完成特定目标来获得胜利。
二、游戏玩法1. 操作方式玩家使用键盘或手柄控制坦克的移动和射击。
方向键控制坦克的前后左右移动,射击键进行攻击。
2. 游戏地图地图设计多样化,包括平原、城市、森林等地形。
地图上分布着各种障碍物、敌方坦克和资源点。
3. 游戏模式单人模式:玩家独自对抗电脑控制的敌人。
多人模式:支持玩家之间进行对战或合作。
4. 游戏元素坦克种类:设计多种不同类型的坦克,具有不同的属性和技能。
武器系统:坦克配备多种武器,如主炮、副炮、导弹等,可升级和切换。
道具系统:地图上散布着各种道具,如补血包、加速道具、护盾等,可增强玩家的能力。
升级系统:通过消灭敌人或完成任务获得经验值,升级坦克的属性和解锁新技能。
三、游戏特色1. 丰富的游戏内容多种游戏模式,满足不同玩家的需求。
精心设计的地图和关卡,增加游戏的挑战性和趣味性。
2. 策略与技巧并重玩家需要根据地形和敌人的位置,选择合适的战术和武器。
合理运用道具和升级系统,提升坦克的战斗力。
3. 精美的画面与音效采用高品质的图形和音效,营造出紧张刺激的游戏氛围。
支持多种分辨率和画面特效,适应不同设备的需求。
4. 在线排行榜与成就系统设立在线排行榜,让玩家可以与其他玩家竞争。
设计丰富的成就系统,增加游戏的可玩性和重复性。
四、游戏开发计划1. 团队组建确定游戏开发团队的成员,包括策划、美术、程序等。
2. 开发进度制定详细的开发进度表,明确各个阶段的任务和完成时间。
3. 测试与修复进行内部测试和玩家测试,收集反馈意见,修复发现的问题。
4. 发布与推广确定游戏的发布平台和时间,制定相应的推广策略。
五、游戏盈利模式1. 游戏内购出售虚拟道具,如坦克、武器、皮肤等。
实训项目报告书项目名称局域网坦克大战年级班级2010级计101-4班项目完成人实训时间:2011 年12月12日至2011 年12月31 日填表说明一、本表由项目完成人填写,一式一份;二、实训结束前将填好的文稿打印后交实训指导教师进行鉴定和评定成绩,确认后的文档交院校存档保存;三、此表电子文档及学生项目实训的作品须打包存档,压缩文件包以学生学号命名,以班为单位收集,刻录光盘交院校存档;一、项目背景、目的及可行性分析引言随着时代的进步、社会的发展,网络已成为人们生活中不可或缺的一部分,工作学习之余,利用游戏等放松娱乐一下…….1、课题背景随着游戏产业的迅速发展,新游戏一个接一个的不断出现,游戏的类型也是多种多样,如竞技类、对战类、合作类、角色扮演类等等。
如果读者是学生的话也许会注意到,宿舍里玩的合作类小型游戏大多是两个人在一台机器上,如果想不在一台机器上,则可能需要上网寻求第三方服务器的支持。
2、局域网坦克大战的目的随着计算机的普及以及对电子游戏的认识,电子游戏已被越来越多的人选作放松、娱乐的休闲方式;电子游戏既不需要专门购买游戏器材,也不需要宽阔的游戏场地,只需要一台能独立完成任务的计算机即可,它可以是人们工作、学习时用的计算机,并不需要另行配置,这比起传统休闲游戏即省钱又省事。
局域网游戏更是可以将现实空间中零散的计算机,组织起来,使其在逻辑空间中集中起来,使游戏的组织、开展变得轻松。
如此轻松而又安逸的休闲方式,使得越来越多的人尝试,甚至已经将电子游戏作为主要休闲方式,既然有如此多的人使用,那其中必然存在巨大的商机,即使人们不愿意为一个小小的休闲游戏花费金钱,但在游戏中添加广告、游戏相关服务也包藏了巨大的财富;当然电子游戏的制作如今已是空前的火爆,大大小小的游戏公司横空出世,都想在电子游戏制作这个行业里占据一席之地,而一款成功的电子游戏需要精心的策划、分析、设计,只有这样才能获得游戏中包藏的财富,以及做出一款真正能够让玩家娱乐、放松的游戏,而不是骗取玩家钱财的工具。
C程序设计上机课程设计运用C语言来描述一种算法是非常方便的,因为C语言提供了非常丰富的运算符。
此外,由于C语言的快速、高效这一特点,因此在许多研究领域,许多算法的实现和验证是采用C语言来进行的。
本上机课程设计将实现最佳攻击目标选择的坦克游戏设计,来源于游戏设计项目。
2.1 准备工作这章的程序编写与前面几章的有所不同,它是根据某一个具体研究的算法来进行编程,因此具有一定的科研价值或实用价值。
程序须达到该算法的某些特殊要求,如实时性、可扩展性等,在这些方面需要注意体现。
另外,根据算法的当前应用领域,程序须设计一种与之相关的动画来进行演示。
2.1.1 实现规划一个算法思想一般都会以一种具体的描述形式来表达,并且都提供了算法的具体步骤或流程,而算法的验证则有待编程来实现。
这一方面限制了编程者的发挥(因为必须按照算法的步骤来严格执行),而另一方面也相应地对编程者提出了更高的要求。
因此,先要全面了解算法的思想以及它的作用。
本程序主要实现一种多目标熵权决策分析算法。
多目标决策分析是指在有多个不同目标时,如何根据各种条件来选出一个最优目标进行锁定。
熵权决策分析算法就是针对这一问题提出来的,具体的算法内容将在下一节来详细介绍。
程序实现的预期规划如下:1.设计适当的数据结构2.逐步实现算法的各个步骤,并进行验证3.设计一种动画演示形式4.在动画中调用算法来演示结果。
另外,在程序中还计划加入辅助文档,以显示算法的各个中间步骤。
现在,根据以上,可以将程序分为以下几个模块:●算法模块:用于实现算法,包括算法各个步骤及相关函数。
●主模块:用于显示动画,在动画中调用算法并演示算法结果。
●辅助模块:用于显示算法中间过程的数据。
2.1.2 将程序代码分割为几类源文件先抛开程序的具体内容设计,而来解决一个程序文件分割的问题。
这也可以说是本上机课程设计要讲到的第一个新的知识点。
当一个程序代码过长时,往往很难进行维护和修改。
而且过长的代码会弄得读程序的人头晕脑涨。
Java课程设计任务书简单电子游戏坦克大战的设计1、主要内容:设计一个简单的坦克大战电子游戏,可以允许多位玩家在局域网中同时对战2、系统要求:游戏具有图形游戏界面,能让用户看到游戏所给出的反馈。
有人机交互功能,使用户操作指定的游戏元素,并且坦克具有生命值,能攻击敌方,无法攻击友方,而且坦克的攻击具有视觉效果!3、具体要求(包括技术要求等):1.需要有图形游戏界面,让用户能看到游戏给出的反馈2.有人机交互功能,使用户能操作指定的游戏元素3.不同队伍的坦克,须显示不同外观,已分辨敌我4.坦克能够开火,攻击敌方,但不能攻击队友5需要有不可被子弹穿透的墙6.坦克有生命值,并非被击中一次就会爆炸7游戏结束后可重新开始学习并掌握以下技术:Java、JavaBean 等熟练使用以下开发工具:Myeclipse 等实现系统上述的功能。
4、进度安排:12月28日~ 12月29日:课程设计选题,查找参考资料12月30日~ 1月1日:完成系统设计和数据库设计1月2日~ 1月4日:完成程序代码的编写1月4日~ 1月5日:系统测试与完善1月5日~ 1月6日:完成课程设计报告,准备答辩分工:随着计算机的普及以及对电子游戏的认识,电子游戏已被越来越多的人选作放松、娱乐的休闲方式;电子游戏既不需要专门购买游戏器材,也不需要宽阔的游戏场地,只需要一台能独立完成任务的计算机即可,它可以是人们工作、学习时用的计算机,并不需要另行配置,这比起传统休闲游戏即省钱又省事。
局域网游戏更是可以将现实空间中零散的计算机,组织起来,使其在逻辑空间中集中起来,使游戏的组织、开展变得轻松。
如此轻松而又安逸的休闲方式,使得越来越多的人尝试,甚至已经将电子游戏作为主要休闲方式,既然有如此多的人使用,那其中必然存在巨大的商机,即使人们不愿意为一个小小的休闲游戏花费金钱,但在游戏中添加广告、游戏相关服务也包藏了巨大的财富;当然电子游戏的制作如今已是空前的火爆,大大小小的游戏公司横空出世,都想在电子游戏制作这个行业里占据一席之地,而一款成功的电子游戏需要精心的策划、分析、设计,只有这样才能获得游戏中包藏的财富,以及做出一款真正能够让玩家娱乐、放松的游戏,而不是骗取玩家钱财的工具。
《Java语言程序设计》课程设计报告题目:坦克大战专业:学号:姓名:指导教师:成绩:2010年 12 月28日1.课程设计研究背景及意义开发一个基于J2SE的游戏,坦克大战2.课程设计题目描述和要求坦克游戏要求:i.需要有图形游戏界面,让用户能看到游戏给出的反馈ii.有人机交互功能,使用户能操作指定的游戏元素iii.不同队伍的坦克,须显示不同外观,已分辨敌我iv.坦克能够开火,攻击敌方,但不能攻击队友v.需要有不可被子弹穿透的墙,且墙有可摧毁和不可摧毁两种vi.坦克有生命值,并非被击中一次就会爆炸vii.坦克爆炸后将产生道具,拾到道具的坦克可加满生命值3.课程设计报告内容3.1 题目求解的理论依据及算法解题原理:1)游戏基本元素:坦克,炮管,子弹,墙壁,地雷2)按住w,s,a,d或上,下,左,右箭头键,坦克向上下左右移动3)按鼠标左键,坦克开火,产生子弹,子弹与另一个坦克相碰,子弹3.2 数据结构:窗口:主窗口TankClient游戏元素:子弹 shot,坦克tank,墙壁wall,血条HitPoint,炸弹Bomb,涨炸弹的道具ShotsItem,涨血的道具 HitPointItem3.3 主要事件处理:1、按下鼠标左键发射普通子弹。
2、按下鼠标右键发射散弹。
3、子弹爆炸的效果,普通子弹和散弹的效果。
3.4 简要的设计流程:键盘监听器3.5、源代码:package cn.hnist.Joshua; import java.awt.*; /*** 抽象子弹类* @author bebebird@ */abstract class Shot { int shotSpeed; //子弹移动速度 int shotRadius; //子弹大小(半径) int shotPower; //子弹威力int ox, oy, sx, sy; //o 表示Tank 的中心坐标,s 表示炮弹坐标(初始时为炮筒端点) int lengthX, lengthY; //子弹每次移动的步长 boolean isLive;boolean isBomb; //死时是否产生爆炸 TankClient tc=null; Tank tk=null;ShotBomb shotBomb=null;public static final Toolkit TLK=Toolkit.getDefaultToolkit();public Shot(int ox,int oy,int sx,int sy,Tank tk){this.ox=ox;this.oy=oy;this.sx=sx;this.sy=sy;this.tc=tk.tc;=tk;this.isLive=true;}public Shot(Tank tk){this.ox=tk.x;this.oy=tk.y;this.sx=tk.turretDirx;this.sy=tk.turretDiry;this.tc=tk.tc;=tk;this.isLive=true;}abstract void draw(Graphics g);abstract void move();abstract void dead();public boolean isOutOfWindow() //检查子弹是否跃出边界{if(sx>TankClient.WIN_WIDTH||sx<0||sy>TankClient.WIN_HEIGHT||sy<0) {this.isBomb=false;return true;}else { return false; }}public Rectangle getRect() //碰撞检测时用于判断{return newRectangle(sx-shotRadius,sy-shotRadius,shotRadius*2,shotRadius*2;}}/*** 散弹类* @author bebebird@*/class HydraShot extends Shot{static final Image HYDRASHOT=TLK.getImage(Shot.class.getClassLoader().getResource("Image/Sh ot/SUPER.png"));public HydraShot(int ox,int oy,int sx,int sy,Tank tk){super(ox,oy,sx,sy,tk);this.shotPower=1;//子弹大小(半径)设置为6this.shotRadius=6;//炸弹速度设置为3this.shotSpeed=13;this.lengthX=shotSpeed*(sx-ox)/(int)Math.hypot(sx-ox,sy-oy);this.lengthY=shotSpeed*(sy-oy)/(int)Math.hypot(sx-ox,sy-oy);}public void draw(Graphics g){if(isLive){g.drawImage(HYDRASHOT,sx-shotRadius,sy-shotRadius,null);}else{if(isBomb&&shotBomb!=null) { shotBomb.draw(g); } }}public boolean isHitWall(){Wall w=null;for(int i=0;i<tc.wallList.size();i++){w=tc.wallList.get(i);if(w.isHits(this)){this.isBomb=true;return true; //散弹不可穿墙}}return false;}public boolean isHitTank() //检查炮弹是否击中对方Tank{Tank tempTk=null;for(int i=0;i<tc.tanksList.size();i++){tempTk=tc.tanksList.get(i);if(tempTk.isLive&&getRect().intersects(tempTk.getRect())&&tempTk .camp!=tk.camp){tempTk.tankHitPoint.cutsHitPoint(shotPower,this); //减少一些血this.isBomb=true;return true;}}return false; //未打中任何Tank}public void dead(){if(isLive){this.isLive=false;if(isBomb){ shotBomb=new ShotBomb(sx-32,sy-32,this); } //当撞到墙或Tank时子弹才爆炸else{tc.shotsList.remove(this);}}}public void move(){if(isLive){sx+=lengthX;sy+=lengthY;if(isOutOfWindow()||isHitWall()||isHitTank()){this.dead();}}}}/*** 普通炮弹类* @author bebebird@*/class NormalShot extends Shot //普通炮弹{static final Image[] NORSHOT={T LK.getImage(Shot.class.getClassLoader().getResource("Image/Shot/ NOR1.png")),TLK.getImage(Shot.class.getClassLoader().getResource("Image/Sh ot/NOR2.png"))};public NormalShot(Tank tk){super(tk);this.shotPower=1;this.shotRadius=6;this.shotSpeed=12;this.lengthX=shotSpeed*(sx-ox)/(int)Math.hypot(sx-ox,sy-oy);this.lengthY=shotSpeed*(sy-oy)/(int)Math.hypot(sx-ox,sy-oy); }public void draw(Graphics g){if(isLive){if(tk.camp){ g.drawImage(NORSHOT[0],sx-shotRadius,sy-shotRadius,null); } else{ g.drawImage(NORSHOT[1],sx-shotRadius,sy-shotRadius,null); } }else{if(isBomb&&shotBomb!=null) { shotBomb.draw(g); } }}public boolean isHitWall(){Wall w=null;for(int i=0;i<tc.wallList.size();i++){w=tc.wallList.get(i);if(w.isHits(this)){this.isBomb=true;return true; //普通子弹不可穿墙}}return false;}public boolean isHitTank() //检查炮弹是否击中对方Tank{Tank tempTk=null;for(int i=0;i<tc.tanksList.size();i++){tempTk=tc.tanksList.get(i);i f(tempTk.isLive&&getRect().intersects(tempTk.getRect())&&temp Tk.camp!=tk.camp){tempTk.tankHitPoint.cutsHitPoint(shotPower,this); //减少一些血this.isBomb=true;return true;}}return false; //未打中任何Tank}public void dead(){if(isLive){this.isLive=false;tk.shotsCount--; //将Tank已发射的子弹数减1if(isBomb){ shotBomb=new ShotBomb(sx-32,sy-32,this); } //当撞到墙或Tank时子弹才爆炸else{tc.shotsList.remove(this);}}}public void move(){if(isLive){sx+=lengthX;sy+=lengthY;if(isOutOfWindow()||isHitWall()||isHitTank()){this.dead();}}}}/*** 增强的炮弹* @author bebebird@*/class SpecialShot extends Shot{int hitCount; //子弹可以攻击的次数static final Image SPESHOT=TLK.getImage(Shot.class.getClassLoader().getResource("Image/Shot/SPE.png"));public SpecialShot(Tank tk){super(tk);this.hitCount=2;this.shotPower=2;this.shotRadius=6;this.shotSpeed=10;this.lengthX=shotSpeed*(sx-ox)/(int)Math.hypot(sx-ox,sy-oy);this.lengthY=shotSpeed*(sy-oy)/(int)Math.hypot(sx-ox,sy-oy); }public boolean isHitTank() //检查炮弹是否击中Tank{Tank tempTk=null;for(int i=0;i<tc.tanksList.size();i++){tempTk=tc.tanksList.get(i);if(getRect().intersects(tempTk.getRect())&tempTk.camp!=tk.camp)/ /自己发射的子弹不打自己人{if(tempTk.isLive){tempTk.tankHitPoint.cutsHitPoint(shotPower,this); //减少一些血this.hitCount--;if(0==hitCount) { this.isBomb=true; return true; } }}}return false; //未打中任何Tank}public void dead(){if(isLive){this.isLive=false;if(isBomb){ shotBomb=new ShotBomb(sx-32,sy-32,this); } //当撞到墙或Tank时子弹才爆炸else{this.tc.shotsList.remove(this); //将子弹从List中移除}}}void move(){if(isLive){sx+=lengthX;sy+=lengthY;if(isOutOfWindow()||isHitTank()){this.dead();}}}void draw(Graphics g){if(isLive){g.drawImage(SPESHOT,sx-shotRadius,sy-shotRadius,null);}else{if(isBomb&&shotBomb!=null) { shotBomb.draw(g); } }}}class SuperShot extends Shot //超级炮弹{int oldx,oldy; //起始坐标static final int MOVERANGE=150; //发射后移动此距离后爆炸static final ImageSUPERSHOT=TLK.getImage(Shot.class.getClassLoader().getResource("Image/Shot/SUPER.png"));public SuperShot(Tank tk){super(tk);this.shotPower=5;this.shotRadius=4;this.shotSpeed=8;this.oldx=sx;this.oldy=sy;this.lengthX=shotSpeed*(sx-ox)/(int)Math.hypot(sx-ox,sy-oy);this.lengthY=shotSpeed*(sy-oy)/(int)Math.hypot(sx-ox,sy-oy);}public void dead(){if(isLive){this.isLive=false;if(isBomb) { shotBomb=new SuperShotBomb(sx,sy,this); }else { this.tc.shotsList.remove(this); }}}void move(){if(isLive){sx+=lengthX;sy+=lengthY;if(isOutOfWindow()) { this.dead(); }if((int)Math.hypot(sx-oldx,sy-oldy)>MOVERANGE) //移动一定距离后爆炸{this.isBomb=true;this.dead();}}}/*** 画发射炮弹*/void draw(Graphics g){if(isLive){g.drawImage(SUPERSHOT,sx-shotRadius,sy-shotRadius,null);}else{if(isBomb&&shotBomb!=null) { shotBomb.draw(g); } }}}3.6 程序调试出错信息及解决方法程序在调试过程中碰到很多的错误,譬如说事件监听器与事件源没有关联、除数为零、数组下标越界等等。
坦克大战游戏策划书3篇篇一《坦克大战游戏策划书》一、游戏概述1. 游戏名称:坦克大战2. 游戏类型:射击类游戏3. 游戏平台:PC 端4. 游戏简介:《坦克大战》是一款经典的射击游戏,玩家将扮演一名坦克驾驶员,在战场上与敌方坦克进行激烈的战斗。
游戏中有多种坦克可供选择,每种坦克都有独特的性能和武器,玩家需要根据战场情况选择合适的坦克进行战斗。
二、游戏玩法1. 游戏模式(1)单人模式:玩家将独自面对敌方坦克的攻击,通过消灭敌方坦克来获得胜利。
(2)多人模式:玩家可以与其他玩家组成团队,共同对抗敌方团队。
2. 操作方式(1)使用键盘方向键控制坦克的移动。
(2)使用鼠标控制坦克的炮塔方向和射击。
3. 游戏规则(1)玩家需要在规定的时间内消灭所有敌方坦克才能获得胜利。
(2)玩家可以通过收集道具来提升自己的坦克性能。
(3)玩家的坦克被敌方坦克击中后会减少生命值,当生命值为零时游戏结束。
三、游戏关卡1. 游戏共有多个关卡,每个关卡都有不同的地形和敌方坦克分布。
2. 关卡难度会逐渐增加,玩家需要不断提升自己的坦克性能和操作技巧才能通过关卡。
四、游戏道具1. 游戏中有多种道具可供玩家收集,包括生命值恢复道具、弹药补充道具、坦克性能提升道具等。
2. 道具会随机出现在战场上,玩家需要及时收集道具来提升自己的战斗力。
五、游戏角色1. 玩家角色:玩家将扮演一名坦克驾驶员,通过操作坦克来进行战斗。
2. 敌方角色:敌方坦克是玩家的主要敌人,它们会不断攻击玩家的坦克。
3. 盟友角色:在多人模式中,玩家可以与其他玩家组成团队,共同对抗敌方团队。
六、游戏界面1. 游戏主界面:游戏主界面包括游戏开始、游戏设置、游戏帮助等选项。
2. 游戏战场界面:游戏战场界面是玩家进行游戏的主要界面,包括玩家坦克、敌方坦克、道具等元素。
3. 游戏结束界面:游戏结束界面会显示玩家的游戏成绩和排名。
七、游戏音效1. 游戏中有多种音效,包括坦克射击音效、道具收集音效、游戏背景音乐等。
Java程序课程设计任务书项目名称:坦克大战游戏的设计与开发英文名:Tank Battle1、主要内容:1、基于java的游戏开发与设计的分析;2、坦克大战游戏的架构搭建与设计实现;3、游戏可以通过用户可以注册新用户,修改自己的密码、个人资料。
2、具体要求1、系统的功能要求:(一)实现玩家试玩游戏功能,屏蔽用户注册和登陆功能(空功能)(二)玩家具备一个或者两个备选坦克战车(三)玩家可以选择一个到两个关卡进行作战(四)玩家可以选择两个敌对阵营中的一个加入,与其他AI战车坦克并肩作战(五)胜利判定条件为:时间制、全杀制(可选)(六)至少提供两个可以自由切换的视角(七)至少提供一种炮弹类型(八)假定项目:如果用户注册,登陆功能能够顺利做好,则提供一个玩家分数上传和排行榜功能。
2、学习并掌握以下技术:数据库的JDBC连接,JA V A编程语言,MySQL数据库的应用;JSP的开发与运用3、熟练使用以下开发工具:JCreator,Myeclipse ,MySQL ,PowerDesigner 等3、进度安排:12月28日~ 12 月29 日:查阅资料,完成文献综述,任务书;12月29 日~ 12月31日:进行系统的需求分析与设计;1月1日~ 1月3日:根据分析进行各个模块程序的设计与创建;1月4日~ 1 月6日:完成各个模块的程序编写;1月7 日~ 1 月8 日:完成全部程序的编写及系统测试;1月9日~ 1 月10日:完成课程设计报告的编写,答辩;摘要随着Java语言的不断发展和壮大,现在的Java已经广泛的应用于各个领域,包括医药,汽车工业,手机行业,游戏,等等地方。
Java游戏的开发为满足人们娱乐所需而设计。
本游戏为坦克大战游戏,是基于Java的图形用户界面而开发的,可以放松心情的小游戏。
游戏从系统操作简便、界面友好、灵活、上手即会的基本要求出发,完成整款游戏的开发。
游戏更设置了暂停、计分、音乐、速度,用户信息保存等功能,可以根据自己的爱好,挑战更高难度,为用户带来愉悦的体验。
程序设计实训报告坦克大战专业班级:装控1401 实习时间:2015年7月10日至7月14日实习地点:微401 成员 1:赵振华成员 2:许晨欢成员 3:蒋绪涛一、作品概述1.1 创新点:1、自定义并命名树林和钢板精灵,设置树林属性为不接受碰撞可以自由穿梭,钢板为接受任何碰撞但不做任何处理(即子弹和坦克均不能摧毁钢板)。
2、添加坦克发炮、击中目标和坦克移动的特殊声效。
1.2 概述:这款游戏是我们QWER小组以经典90版坦克大战为背景制作的坦克大战的改编款,玩家通过控制坦克摧毁敌方坦克来保卫主基地不被摧毁。
当敌我双方坦克相碰或己方基地被子弹摧毁时游戏结束(敌我双方子弹均可摧毁基地),每隔3秒钟出现一辆敌方坦克,游戏最大时长为100秒。
此款游戏与经典90版坦克大战较为相似,操作简单,能唤起我们对童年的回忆。
二、功能设计玩家坦克与敌方坦克在街道中进行巷战,玩家坦克被击中或与敌方坦克相撞、玩家指挥部被击中或游戏时间到,一局游戏结束。
按下空格键后游戏开始,“空格开始”消失,载入地图,100秒倒计时开始,并把玩家坦克设置在指挥部左侧。
游戏时间到,玩家坦克被敌方坦克摧毁,与敌方坦克相撞,或者玩家指挥部被摧毁,一局游戏结束,游戏回到初始界面,并显示上一局的分数。
玩家用W、A、S、D键控制坦克上、下、左、右运行,按J键开炮。
坦克行进过程中有特殊声效,坦克发射或击中目标都有相应的声效。
玩家坦克碰到墙和钢板就停下来,需要调转方向才能继续前进。
玩家坦克开炮,一炮就能摧毁一块墙或者一辆敌方坦克,但不能摧毁钢板,玩家可穿梭于树林中。
玩家每摧毁一辆敌方坦克,加1分。
玩家指挥部被坦克或者炮弹(不管玩家还是敌方)碰上,都会被摧毁。
每隔3秒钟,就会产生一辆敌方坦克。
敌方坦克每隔一段时间,就自动开炮。
敌方坦克遇到墙就会停下来。
停下来的坦克,前方的墙如果被摧毁了,又能继续前进。
每隔几秒钟,敌方坦克就会顺时针变换一个方向前进。
每局最大时长为100秒。
#include "tank.h"#include "ConOperator.h"#include <time.h>#include <windows.h>#include <conio.h>#include <iostream>using namespace std;TankGame::TankGame(int w, int h){// 设定当前关数no = 1;// 设定游戏整体高宽wide = w;high = h;HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);COORD sizePos = {2 * wide, high};SetConsoleScreenBufferSize(hStdOut, sizePos);// 分配游戏空间状态表gameSpace = new GameSpace*[high];for (int i = 0; i != high; i++)gameSpace[i] = new GameSpace[wide];// 添加围墙wall = new Wall(gameSpace, wide, high);wall->draw();}void TankGame::load_init(){// 初始化游戏空间for (int y = 1; y != high-1; y++) {for (int x = 1; x != wide-1; x++) {gameSpace[y][x].have = false;gameSpace[y][x].kind = 0;gameSpace[y][x].no = 0;}}// 添加地图map.load(gameSpace, no);// 初始化自己坦克me.init_xy();me.trans_direction(1);me.set_no(0);me.init_move(gameSpace, wide / 2 - 2, high - 5);// 按顺序诞生敌人坦克creatPlace = 0;for (int i = 0; i != 3; i++) {freezeTime[i] = REBIRTHTIME;enemy[i].init_xy();enemy[i].set_kind(2);enemy[i].set_no(i+1);reset(enemy[i]);}// 数目初始化leftCount = 17;existCount = 3;// 显示图片me.draw_tank();for (int i = 0; i != 3; i++)enemy[i].draw_tank();map.draw();}TankGame::~TankGame(){if (wall)delete wall;if (gameSpace) {for (int i = 0; i != high; i++)delete[] gameSpace[i];delete[] gameSpace;}}void TankGame::reset(Tank& tank){bool success = false;int t = 3;while (t && !success) {creatPlace++;if (creatPlace == 4)creatPlace = 1;// 诞生地点选择switch (creatPlace) {case 1:tank.trans_direction(3); //朝下if (tank.reset(gameSpace,1,1))success = true;break;case 2:tank.trans_direction(3);if (tank.reset(gameSpace,wide / 2 - 2, 1))success = true;break;case 3:tank.trans_direction(3);if (tank.reset(gameSpace,wide - 4, 1))success = true;break;}if (!success)t--;}}void TankGame::start(){char command;enter_picture(command);if (command != ENTER)return;while (me.blood > 0) {// init data for runingload_init();// run a taskruning_a_task();// determine why returnif (me.blood > 0) {no++;if (no > map.total) {success_gameover();break;}char command;turn_to_next_task(command);if (command != ENTER)break;}else game_over();}}//voidvoid TankGame::runing_a_task(){while ((leftCount || existCount) && me.blood) {clock_t now = clock();char command = -1; // 主人命令while (clock() - now < TIME_UNIT) // 小于一个时间片,暂停update_keyBoard_char(command);/*更新敌人坦克*/for (int i = 0; i != 3; i++) {if (enemy[i].blood == 0)continue;if (enemy[i].freezeTime == 0) {enemy[i].rand_direction(gameSpace); // 产生随机方向}else {if (enemy[i].speed == 0) {enemy[i].move(gameSpace);if (bullet[i+1].disapper) {int shot = -1;bullet[i+1] = enemy[i].rand_shot(gameSpace,i+1, shot);if (shot == 0)me.be_shot(gameSpace);bullet[i+1].registration(gameSpace);}enemy[i].freezeTime--;} else {enemy[i].speed--;}}}/*更新自己坦克*/if (command >=0 && command < 4) {me.trans_to_direction(command);me.move(gameSpace);}/*更新子弹*/for (int i = 0; i !=4; i++) {if (!bullet[i].disapper) { // 存在的子弹int shot;bullet[i].move(gameSpace, shot); // 运行,是否射中if (shot == 0)me.be_shot(gameSpace);else if (shot >= 1 && shot <= 3) {enemy[shot-1].be_shot(gameSpace);existCount--;} else if (shot >= 7 && shot <= 10) {bullet[shot-7].unregistration(gameSpace);bullet[shot-7].clear();bullet[shot-7].init(bullet[shot-7].kind);}}}/*自己产生子弹*/if (bullet[0].disapper) {if (command == 32) {int shot;bullet[0] = me.make_bullet(gameSpace,0, shot);if (shot >= 1 && shot <= 3) {enemy[shot-1].be_shot(gameSpace);existCount--;}bullet[0].registration(gameSpace);}}/*诞生缺损敌人*/if (leftCount > 0) {for (int i = 0; i != 3; i++) {if (enemy[i].blood == 0) {if (freezeTime[i] == 0) {freezeTime[i] = REBIRTHTIME;reset(enemy[i]);existCount++;leftCount--;}else freezeTime[i]--;}}}}}void TankGame::update_keyBoard_char(char& c){if (_kbhit()) {c = getch();if (c == -32) {c = getch();if (c != UP && c != DOWN && c != LEFT && c != RIGHT)c = -1;else if (c == RIGHT)c = 0;else if (c == UP)c = 1;else if (c == LEFT)c = 2;elsec = 3;}elsec = 32;}}void TankGame::enter_picture(char &command){string captions[6];captions[0] = "◥◣◢◤■■■■■◥◣◢◤";captions[1] = " ◥◣◢◤◢◤◥◣◢◤";captions[2] = " ◥◣◢◤◢◤◥◣◢◤";captions[3] = " ◢◤◢◤◢◤◥◣";captions[4] = " ◢◤◢◤◢◤◥◣";captions[5] = " ◢◤■■■■■◢◤◥◣";string s = " ";color(0x0e);for (int i = 0; i != 6; i++)grid(7, 6 + i, captions[i]);Frame frame(30,15);frame.draw_frame(4,19,0x09);string sentence[3];sentence[0] = "This small game is made by yzx in 2010.";sentence[1] = "Wlecome to play it.";sentence[2] = "All Rights Reserved.";color(0x0e);for (int i = 0; i != 3; i++) {for (int k = 0; k != sentence[i].size(); k++) {grid(14+k,21+2*i,sentence[i][k]);sleep(50);}sleep(1000);}grid(7, 28,"Enter : 开始ESC : 退出");while (true) {if (_kbhit()) {command = getch();if (command == ENTER || command == ESC)break;}}// clear screen picture in wallclear_picture();}void TankGame::turn_to_next_task(char& command){clear_picture();color(0x0e);grid(18, 20, "第");grid(20, 20, no);grid(22, 20, "关");while (true) {if (_kbhit()) {command = getch();if (command == ENTER || command == ESC)break;}}grid(18, 20," ");}void TankGame::success_gameover(){clear_picture();Frame frame(30,15);frame.draw_frame(4,10,0x09);string sentence[3];sentence[0] = "Congratulations for Successfully finishing all tasks";sentence[1] = "Thank you for using it deeply.";sentence[2] = "And welcome to use it next time.";color(0x0e);for (int i = 0; i != 3; i++) {for (int k = 0; k != sentence[i].size(); k++) {grid(12+k,14+2*i,sentence[i][k]);sleep(50);}sleep(1000);}while (true) {if (_kbhit()) {char command = getch();if (command == ENTER || command == ESC)break;}}}void TankGame::game_over(){clear_picture();Frame frame(30,15);frame.draw_frame(4,15,0x09);string sentence[4];sentence[0] = "Game over, but you can try it again.";sentence[1] = "Thank you for using it deeply.";sentence[2] = "And welcome to use it next time.";sentence[3] = "All rights reserved.(Violators will be prosecuted.) .";color(0x0e);for (int i = 0; i != 4; i++) {for (int k = 0; k != sentence[i].size(); k++) {grid(13+k,18+2*i,sentence[i][k]);sleep(50);}sleep(1000);}while (true) {if (_kbhit()) {char command = getch();if (command == ENTER || command == ESC)break;}}}void TankGame::clear_picture(){int cirX = wide / 2;int cirY = high / 2;int depth = cirY > cirX ? cirY + 2 : cirX + 2;int lx, rx, uy, by;int l, r, u, b;for (int i = 0; i != depth; i++) {lx = cirX - i;rx = cirX + i;uy = cirY - i;by = cirY + i;uy <= 0 ? u = 1 : u = uy;by >= high - 1 ? b = high - 2 : b = by;lx <= 0 ? l = 1 : l = lx;rx >= wide -1 ? r = wide - 2 : r = rx;if (rx < wide - 1) {for (int k = u; k <= b; k++)grid(rx, k, " ");}if (lx > 0) {for (int k = u; k <= b; k++)grid(lx, k, " ");}if (by < high - 1) {for (int k = l; k <= r; k++)grid(k, by, " ");}if (uy > 0) {for (int k = l; k <= r; k++)grid(k, uy, " ");}}}void TankGame::test(){for (int y = 0; y != 40; y++) {for (int x = 0; x != 40; x++) {if (gameSpace[y][x].have)// && gameSpace[y][x].kind == 3)grid(x, 42+y, (char)gameSpace[y][x].no);elsegrid(x, 42+y, " ");}}}。
课程设计一 坦克大战 一、游戏介绍 相信大部分同学都玩过或看过“坦克大战”这款经典游戏。现在,就由我们自己动手来开发它。只要大家具备了C++语言和面向对象的基础知识,然后按照实验指南的指导一步一步进行下去,相信我们每个同学都能把这款经典游戏做出来。
二、实验目标 综合运用C++及其面向对象的知识开发一款小游戏。
三、实验内容 在一个战场上,玩家控制坦克,消灭敌方坦克,并防止敌方坦克摧毁我方基地。游戏的具体要求如下: 1、游戏有一个初始页面,如下图。屏幕上最内部的黑色区域为玩家坦克的活动区域,左上角坐标为(-26,-22),右下角坐标为(26,22)。当坦克运动到该区域边界时,坦克不能继续前进。 2、按下任意键开始游戏,玩家控制坦克在战场上穿梭,碰到墙时,不能通过。 3、敌方坦克自由移动,每隔2秒改变一个方向,每隔3秒发射一发子弹。 4、敌方坦克每隔5秒出现一辆,从屏幕上方的左、中、右三个位置依次出现。 5、当玩家被消灭或者我方基地被摧毁或者游戏时间大于30秒的时候,游戏结束。
游戏开始前 上海锐格软件有限公司
1 进入游戏 四、游戏的整体框架 2
五、实验指南 实验准备 打开FunCode,创建一个新的C++项目。注意:项目名称必须为英文和数字,且不能有空格。 点击“项目”→“导入地图模板”,从对话框中选取名称为TankWar的模板导入。导入成功后,界面如下:
实验一 游戏开始 【实验内容】 1、设置游戏标题 2、按空格键,提示图片消失,游戏进入开始状态.
【实验运行结果】 上海锐格软件有限公司
3 游戏开始前 按下空格键后 【实验思路】 要处理FunCode中的图片,我们需要声明CSprite类型对象来指向相应图片,然后调用精灵类的相应函数进行处理。 按下空格键是键盘按下事件,系统调用CSystem::OnKeyDown函数进行响应。该函数中调用CGameMain::OnKeyDown函数。因此我们可以在CGameMain类的OnKeyDown函数完成相应代码。 按下键盘后,需要改变游戏的状态,游戏从未开始进入开始状态。成员变量m_iGameState用来表示游戏状态。
【实验指导】 1、C++程序的执行入口是主函数。FunCode的主函数名称叫WinMain,写在Main.cpp文件中。CSystem::SetWindowTitle是设置程序运行窗口标题的函数,修改如下: 4
CSystem::SetWindowTitle("坦克大战"); 2、FunCode程序运行时,当发生键盘按下事件,程序首先调用并执行CSystem::OnKeyDown函数,然后由CSystem::OnKeyDown函数调用并执行CGameMain::OnKeyDown函数。因此,键盘按下事件的响应代码我们在CGameMain::OnKeyDown函数中编写即可。 3、我们要处理的两个精灵如下图,它们的名称分别是splash和start。我们需要创建两个CSprite类对象与这两个精灵绑定。
4、在CGameMain类中声明两个CSprite*类型,根据面向对象的封装性原理,成员变量的访问权限应该是private。代码应该写LessonX.h文件中。 CSprite* m_pSplash; CSprite* m_pStart; 在CGameMain类的构造函数中,对上面两个指针变量进行初始化。通过调用CSprite的构造函数,将精灵和精力对象绑定在一起。 m_pSplash= new CSprite("splash"); m_pStart= new CSprite("start"); 5、最后,我们在CGameMain::OnKeyDown函数中处理空格键按下事件。 if( 0 ==GetGameState() ) { if(iKey ==KEY_SPACE) { m_iGameState = 1; } } KEY_SPACE是枚举变量KeyCodes的成员,表示空格键。KeyCodes定义在CommonClass.h文件中。该枚举变量定义了全部的键盘值。注意:必须将m_iGameState的值改为1。当GameMainLoop函数再次执行时,根据m_iGameState的值调用并执行GameInit函数,游戏进入开始状态。 进入游戏开始状态时,调用CSprite类的SetSpriteVisible函数将精灵图片设置为不可见。 在GameInit函数中添加代码: m_pSplash->SetSpriteVisible(false); m_pStart->SetSpriteVisible(false); 6、程序执行完CGameMain::GameInit函数后,执行CGameMain:: SetGameState(2),将m_iGameState的值改为2,游戏进入运行状态。 7、在CGameMain类的析构函数中delete本实验创建的指针对象,以释放分配的内存。 CGameMain::~CGameMain() 上海锐格软件有限公司 5 { delete m_pSplash; delete m_pStart; } 8、编译并运行程序,然后按下空格键,看看运行效果。
实验二 坦克运动 【实验内容】 1、创建坦克类CTankPlayer; 2、游戏开始时,将坦克放置于(0,0)的坐标上; 3、通过按键WSAD控制坦克上下左右运动; 4、坦克运行到黑色区域边界时不能继续前进。
【实验运行结果】
在区域内运动 6 运动到区域边界
【实验思路】 坦克也是精灵,但是它具备一些自己独特的功能,比如通过键盘控制运动、开炮等。因此我们可以创建一个新的类CTankPlayer类,并让它继承CSprite类。 通过WASD键,控制坦克做相应的的上左下右运动。按下某个键,给坦克设置相应方向的运动速度;松开时,将该方向的速度设为0,表示停止运动。 屏幕上最内部的黑色区域为玩家坦克的活动区域,左上角坐标为(-26,-22),右下角坐标为(26,22)。当坦克运动到该区域边界时,坦克不能继续前进。
【实验指导】 1、通过类向导创建CTankPlayer类,其继承于CSprite类。以VC++ 6.0为例: 第一步、点击菜单“插入”-〉“新建类”。
第二步、在“New Class”对话框中输入类名和父类名。 上海锐格软件有限公司
7 第三步、点击“Change”按钮,在新对话框中修改CTankPlayer类的头文件和cpp文件的路径。将头文件保存到项目文件夹的\SourceCode\Header文件夹中,将cpp文件保存到项目文件夹下的\SourceCode\Src文件夹中。
这里需要特别注意的是创建文件路径的问题,所有的.h头文件应该在项目文件夹\SourceCode\Header中,所有的.cpp源文件应该放在项目文件夹下的\SourceCode\Src文件夹中。这样我们在#include的时候只需要写文件名就可以了。如果保存到其他路径下,需要写相对路径。 2、点击OK,出现下面提示,不用管它,点击“确定”。 8
3、这是因为,我们创建的类集成了CSprite类,但是却没有把这个类的声明文件include进来。因此我们在新建类的头文件中,做如下操作: #include "CommonClass.h" 4、编译程序,发现如下提示:
打开CommonClass.h文件,找到CSprite类的定义,可以发现该类没有缺省构造函数,只有一个带参数的构造函数。因此,作为它的子类,构造函数也必须带参数,并且将参数传递给父类。构造函数的声明和定义修改如下: CTankPlayer(const char* szName); CTankPlayer::CTankPlayer(const char* szName):CSprite(szName) { } 5、为CTankPlayer类添加m_iDir,m_fSpeedX,m_fSpeedY,m_iHp四个成员变量(成员变 量。用来表示坦克在X轴和Y轴方向上的速度以及运行的方向,并且在构造函数中初始化为0。这里规定,m_iDir的值为0、1、2、3,分别表示上、右、下、左。 成员函数的声明和定义如何添加,访问权限是什么,可参考实验一,下文不再继续提示),分别表示运动方向、X轴、Y轴速度以及血量值。本文档的命名采用匈牙利命名法,m_表示类成员变量,i表示整型,f表示float型,sz表示字符指针,g_表示全局变量等。 同时需要在public权限下定义获取和设置这些变量的Get和Set方法,可在LessonX.h文件中完成: //set方法 void SetHp(int hp) {m_iHp = hp;} void SetDir(int dir) {m_iDir = dir;} void SetSpeedX(float speedX) {m_fSpeedX = speedX;} void SetSpeedY(float speedY) {m_fSpeedY = speedY;} //get方法