09C++课程设计_坦克大战
- 格式:doc
- 大小:861.50 KB
- 文档页数:32
坦克大战游戏策划书3篇篇一《坦克大战游戏策划书》一、游戏概述1. 游戏名称:坦克大战2. 游戏类型:射击游戏3. 游戏背景:设定在一个虚构的战争世界,玩家将扮演坦克驾驶员,参与各种战斗任务。
4. 游戏目标:通过消灭敌人、摧毁敌方基地或完成特定目标来获得胜利。
二、游戏玩法1. 操作方式玩家使用键盘或手柄控制坦克的移动和射击。
方向键控制坦克的前后左右移动,射击键进行攻击。
2. 游戏地图地图设计多样化,包括平原、城市、森林等地形。
地图上分布着各种障碍物、敌方坦克和资源点。
3. 游戏模式单人模式:玩家独自对抗电脑控制的敌人。
多人模式:支持玩家之间进行对战或合作。
4. 游戏元素坦克种类:设计多种不同类型的坦克,具有不同的属性和技能。
武器系统:坦克配备多种武器,如主炮、副炮、导弹等,可升级和切换。
道具系统:地图上散布着各种道具,如补血包、加速道具、护盾等,可增强玩家的能力。
升级系统:通过消灭敌人或完成任务获得经验值,升级坦克的属性和解锁新技能。
三、游戏特色1. 丰富的游戏内容多种游戏模式,满足不同玩家的需求。
精心设计的地图和关卡,增加游戏的挑战性和趣味性。
2. 策略与技巧并重玩家需要根据地形和敌人的位置,选择合适的战术和武器。
合理运用道具和升级系统,提升坦克的战斗力。
3. 精美的画面与音效采用高品质的图形和音效,营造出紧张刺激的游戏氛围。
支持多种分辨率和画面特效,适应不同设备的需求。
4. 在线排行榜与成就系统设立在线排行榜,让玩家可以与其他玩家竞争。
设计丰富的成就系统,增加游戏的可玩性和重复性。
四、游戏开发计划1. 团队组建确定游戏开发团队的成员,包括策划、美术、程序等。
2. 开发进度制定详细的开发进度表,明确各个阶段的任务和完成时间。
3. 测试与修复进行内部测试和玩家测试,收集反馈意见,修复发现的问题。
4. 发布与推广确定游戏的发布平台和时间,制定相应的推广策略。
五、游戏盈利模式1. 游戏内购出售虚拟道具,如坦克、武器、皮肤等。
JAVA程序开发课程设计课程大作业专业:软件工程班级:14软工2学号: ***********名:***项目名称:坦克大战一、需求分析:1.基本功能:(1)我方坦克能上下移动(2)敌方坦克能自由移动(3)我方坦克能开火(4)敌方坦克能自由开火(5)子弹打中我方,会减血,我方打中敌方,敌死。
敌打敌不会受伤(6)有血条,主界面2.扩展功能(1)用图形来表示坦克和炮弹(2)用图形来表示中子弹后的爆炸效果(3)地图上存在金属墙,我方坦克和子弹不能穿过(4)地图上存在曹村,我方和敌方坦克能够自由穿过,子弹也一样(5)地图上会随机出现加血包(6)我方坦克遇到加血包,会增加生命(7)游戏开始时,会启动背景音乐(8)我方坦克死亡时,提示游戏结束二、系统设计:1. BgMusic(1)主要功能:添加背景音乐TankMap类通过调用该类,并读取BgMusic包下面的背景音乐文件(2)成员属性:1)filename,用于记录读取到的文件名,并处理2)nBytesRead,这是缓存,用于读取音乐文件,缓存下来(3)成员方法:1)run,播放背景音乐2)构造方法BgMusic,将读取到的文件名,存储到成员属性filename中2. Blood(1)主要功能:地图中添加血包(2)成员属性:1)x,y,width,height,血包的位置以及宽高2)rpos_x,rpos_y,用于记录血包移动后的位置3)tm,调用TankMap类,并在地图中放血包4)live,血包的存活,被坦克吃了就消失5) blood,用于记录血包的存活6)step,血包的步长7)stepMove,血包走过总的步长(3)成员方法:1)Blood,构造方法,将血包放到地图中2)draw,画血包3)move,血包的移动4)getRect,获取血包的位置3. Tank(1)主要功能:地图中添加我方坦克(2)成员属性:1)WIDTH,HEIGHT,xspeed,yspeed,坦克的宽高和x,y上的移动速度2)x,y,direction,我方坦克出现的初始位置和初始状态3)tm,调用TankMap类,并在地图中放坦克4)isLive,我方坦克是否存活5) isgood,坦克属于哪一方6)life,我方坦克的初始生命值7)step,使用Blood类,血包随机出现8)upimage,rightimage,downimage,leftimage,oldimage,存放坦克图片(3)成员方法:1)draw,绘制坦克2)move,根据移动方向,移动坦克,不允许坦克移除地图3)checkDirection,确定用户单击的方向键,修正坦克即将移动方向4)fire,发射子弹5)getRec,返回坦克当前位置,便于判断是否与敌方坦克或子弹重叠6)stay,坦克撞墙的处理7)eat,我方坦克吃血包4.EnemyTank(1)主要功能:地图中添加敌方坦克(2)成员属性:1)WIDTH,HEIGHT,xspeed,yspeed,坦克的宽高和x,y上的移动速度2)x,y,direction,我方坦克出现的初始位置和初始状态3)tm,调用TankMap类,并在地图中放坦克4)islive,我方坦克是否存活5)enemytank,存放坦克图片(3)成员方法:1)draw,绘制坦克2)move,根据移动方向,移动坦克,不允许坦克移除地图3)fire,发射子弹4.Explor(1)主要功能:子弹打中坦克,发生爆炸效果(2)成员属性:1)x,y,坦克出现的位置2)tm,调用TankMap类,并在地图中放爆炸3)islive,我方坦克是否存活(3)成员方法:1)draw,绘制爆炸2)Explor,爆炸的构造方法5.Help(1)主要功能:给用户游戏帮助(2)成员属性:1)help,将帮助的文字存放在字符串中(3)成员方法:1)getHelpDialog,调用帮助6.Shell(1)主要功能:设计子弹(2)成员属性:1)WIDTH,HEIGHT,xspeed,yspeed,子弹的宽高和x,y上的移动速度2)x,y,direction,子弹出现的位置和方向3)tm,调用TankMap类,并在地图中放子弹4)isLive,子弹是否打中坦克5)isgood,是否是我方6)Image,加载子弹图片(3)成员方法:1)draw,绘制子弹2)move,根据移动方向,移动坦克,得到子弹的移动3)getRec,获取坦克的位置4)hitTanks,子弹打坦克5)hitWalls,子弹打墙7.Wall(1)主要功能:给地图添加墙(2)成员属性:1)x,y,w,h,墙的位置和宽度高度2)tc,地图(3)成员方法:1)draw,画墙2)getRect,获取墙的位置8.TankMap(1)主要功能:地图(2)成员属性:1)MAPWIDTH,MAPHEIGHT,地图的宽高2)t,我方坦克3)bufferImage,缓冲,用于解决闪屏4)forestimage,草丛5)shells,EnemyTank,Blood,Explors泛型6)enemyCount,敌方坦克数量7)w1,w2,不可穿过的墙(3)成员方法:1)init,初始化地图2)paint,画血包,地图,坦克等3)addBloods,加血4)update,解决闪屏三、功能实现:1.功能1:我方,敌方坦克上下移动并开火(1)操作说明游戏启动时,按上下左右键可以是我方坦克移动,按F键可以开火(2)关键代码//绘制坦克public void draw(Graphics g){//根据不同方向加载不同图片,读取的时候需要处理异常try{switch(direction){case STOP:case UP:upimage=ImageIO.read(new File("src/images/up.gif"));oldimage=upimage;g.drawImage(upimage, x, y, null);break;case RIGHT:rightimage=ImageIO.read(new File("src/images/right.gif"));oldimage=rightimage;g.drawImage(rightimage, x, y, null);break;case DOWN:downimage=ImageIO.read(new File("src/images/down.gif"));oldimage=downimage;g.drawImage(downimage, x, y, null);break;case LEFT:leftimage=ImageIO.read(new File("src/images/left.gif"));oldimage=leftimage;g.drawImage(leftimage, x, y, null);break;}}catch (IOException e) {};g.drawImage(oldimage, x, y, null);move(direction);}//根据移动方向,移动坦克,不允许坦克移出地图public void move(Direction d){/*** 记录坦克原来的位置,撞墙可以回到原位置*/oldX=x;//记录坦克原来的位置,撞墙可以回到原位置oldY=y;if(d == Direction.STOP){}else if(d == Direction.UP){y-=yspeed;if(y<=HEIGHT)y=HEIGHT;}else if(d==Direction.RIGHT){x+=xspeed;if(x>=800-WIDTH)x=800-WIDTH;}else if(d==Direction.DOWN){y+=yspeed;if(y>=600-HEIGHT)y=600-HEIGHT;}else if(d==Direction.LEFT){x-=xspeed;}2.功能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日:完成课程设计报告,准备答辩分工:随着计算机的普及以及对电子游戏的认识,电子游戏已被越来越多的人选作放松、娱乐的休闲方式;电子游戏既不需要专门购买游戏器材,也不需要宽阔的游戏场地,只需要一台能独立完成任务的计算机即可,它可以是人们工作、学习时用的计算机,并不需要另行配置,这比起传统休闲游戏即省钱又省事。
局域网游戏更是可以将现实空间中零散的计算机,组织起来,使其在逻辑空间中集中起来,使游戏的组织、开展变得轻松。
如此轻松而又安逸的休闲方式,使得越来越多的人尝试,甚至已经将电子游戏作为主要休闲方式,既然有如此多的人使用,那其中必然存在巨大的商机,即使人们不愿意为一个小小的休闲游戏花费金钱,但在游戏中添加广告、游戏相关服务也包藏了巨大的财富;当然电子游戏的制作如今已是空前的火爆,大大小小的游戏公司横空出世,都想在电子游戏制作这个行业里占据一席之地,而一款成功的电子游戏需要精心的策划、分析、设计,只有这样才能获得游戏中包藏的财富,以及做出一款真正能够让玩家娱乐、放松的游戏,而不是骗取玩家钱财的工具。
坦克大战游戏设计1.课程设计的目的随着手机的日益普及,java功能在移动设备上的实现及java 应用程序产生的影响力,对丰富人们的生活内容,提供便捷的咨询起着不可忽视的作用。
本项目介绍了坦克大战的基本构建方法、java的相关技术及本程序的结构分析和具体功能的实现。
游戏是在Eclipse3.2环境下编程。
本项目重点运用了图形化用户界面GUI,Thread多线程的有关知识,其中涉及了绘图工具的运用,事件处理操作以及图形的碰撞检测等知识点。
通过此课程设计,使学生巩固所学知识、培养学生动手能力,了解Java的面向对象的体系结构。
学生用Java语言设计一个完整的应用程序,综合应用所学知识完成软件的分析、设计、调试和总结,提高学生对Java语言的综合应用能力和解决问题的能力。
2.设计方案论证2.1设计思路本项目介绍了坦克大战的基本构建方法、java的相关技术及本程序的结构分析和具体功能的实现。
游戏是在Eclipse3.2环境下编程。
一、游戏基本元素:坦克,炮管,子弹,墙壁,地雷二、它的主要功能:(1)能够朝四个方向移动:上、下、左、右键。
(2) 按下鼠标左键发射普通子弹;按下鼠标右键发射散弹;子弹爆炸的效果,普通子弹和炮弹的效果(3)敌人能够移动(4)能够模拟爆炸(5)能够产生障碍(6)能够增长生命玩家控制主坦克(上方有血条的)的移动以及炮弹的发射。
若玩家将敌方坦克全部打掉则玩家胜;若期间由玩家控制的主坦克被打掉则视为玩家失败。
游戏中只有普通墙作为障碍物,玩家无法穿越它们并且普通子弹不能将墙打穿;但是玩家可以用炮弹将普通墙打掉。
桃心可以将坦克的血加满。
2.2简要的设计流程:键盘监听器2.2设计方法2.2.1构建游戏主类在主类中构造一个主Frame框架,设置它的大小和位置,并将其显示。
在主类中编写一段代码,构造一个窗口。
并添加窗口关闭的处理事件,将窗口设置成打小不可变。
主要代码如下:this.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0);}});this.setResizable(false);2.2.2构建坦克类Tank构造主窗口中所需要的Tank类,并将坦克加到窗口中,实现坦克的四个方向的移动创建一个坦克类,用画图工具构造出简单的图形代表坦克,并将坦克加入到主窗口当中。
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的图形用户界面而开发的,可以放松心情的小游戏。
游戏从系统操作简便、界面友好、灵活、上手即会的基本要求出发,完成整款游戏的开发。
游戏更设置了暂停、计分、音乐、速度,用户信息保存等功能,可以根据自己的爱好,挑战更高难度,为用户带来愉悦的体验。
《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 程序调试出错信息及解决方法程序在调试过程中碰到很多的错误,譬如说事件监听器与事件源没有关联、除数为零、数组下标越界等等。
《程序设计应用基础》课程设计计划书坦克大战游戏1引言学习了C语言程序设计之后,我们粗略的掌握了程序设计的基本思路和要求,为了更加熟练的掌握这门计算机语言,我们选择编译一个经典小游戏——坦克大战。
通过课程设计提高我们的动手能力,把理论知识运用到实践当中。
在课程设计中,C语言的语法和逻辑严谨,对于初学者而言,有时忘记一个逗号或者分号整个程序便运行不了,经过了反复的调试,修改,最终形成可执行的程序。
在这个过程中,通过不断的练习,我们对C语言的掌握程度有明显的提高,同时,也锻炼了我们的头脑,使我们的思维更加科学严谨。
2设计方案2.1设计思路坦克大战游戏,一共两关。
不同的关卡,游戏地图、敌方坦克出现的种类不一样。
敌方坦克地图上最多存在4辆,击杀后会出现新坦克直至补足4个,当击杀坦克一定数值则敌方新坦克不会再增加。
击杀完所有坦克则胜利过关。
己方坦克也有复活次数,用完则失败。
另地图正下方有己方老家,若被敌方坦克攻破则游戏失败。
3程序设计与实施3.1程序的主要模块整个程序分为里表两大部分。
里部分由41*41的int地图数组组成,每个元素代表了该以该数组元素行列下标为地图坐标y,x那个单元的情况,不同的地图障碍物在该数组有不同的值,坦克在地图上占3*3个单元,在地图数组内相应坐标的3*3个元素内也对应特殊的值。
由地图数组值可以读出该坦克信息。
表部分则是根据里部分的地图数组通过gotoxy和printf函数在命令行界面打印出相应字符以构成游戏界面的。
程序中的每个函数操作都是通过里部分(地图数组)判定,然后对里部分(地图数组)操作,再由里部改变外部,由gotoxy和printf函数将可视化界面呈现给玩家。
也就是游戏主体函数内里表部分是一起操作的,不分开。
对于函数分类,程序又可分为三大类。
一类游戏辅助函数。
一个子弹系统,一个坦克系统。
子弹和坦克分别都是独立运作的系统,有少量信息交换。
3.2 主函数及其流程图主函数包括打印地图,实现游戏内置调节游戏速度的功能,判断坦克类型,判断敌我坦克是否存活,判断游戏胜负。
《坦克大战》游戏策划方案1 立项原因a 根据原红白机的《坦克大战》,分析现行的类似游戏改编b 独特的对抗性吸引更多的玩家体验乐趣c 简单的操作性使本游戏更适合休闲娱乐d 丰富道具,坦克同样可以吸引大型游戏的玩家e 游戏针对人群是25岁及以下的玩家,但是游戏的简单和快速性使它同样适合工作间隙的休闲娱乐2 市场调查略3 游戏特色及玩点a 游戏以卡通搞笑风格让玩家轻松游戏b 对抗性强,让玩家充分体验网络对抗的刺激感觉c 操作简单,方向+鼠标就可以完成游戏的所有基本操作d 场景变化多样,满足玩家的新鲜感e 游戏的多种道具不但有实用性还尽量提供玩家酷的感觉,满足玩家的成就感4 游戏概述a 游戏是以坦克为主角的多人网络对抗游戏b 玩家可以组队也可以双人进行c 游戏在一个选定的场景中进行d 摧毁对方或者逼迫对方认输是游戏的胜利条件5 游戏风格a 游戏以2D卡通画面表现轻松搞笑得风格b 在主体风格下,游戏体现多种场景c 场景中为横板卷轴方式体现,侧视图效果6 游戏规则6.1 基本规则a 玩家可以自由创建房间,一旦房间创建完毕,就必须满足房间人数才能开始游戏b 死亡设定,创建房间时可以选定死亡不能重生或者死亡可在n秒后重生(10<=n<=60)c 胜利规则,创建房间时可以选择对方玩家全灭(死亡不能重生)或者摧毁对方指挥塔或者n分钟后结束(5<=n<=60)d 游戏开始后按照房间的分配分成两方,在各自区域出生e 双方各有一个弹药基地一旦摧毁将极大的降低本方的弹药填装速度f 双方各有一个指挥塔,一旦摧毁如果游戏没有结束就会禁止本方玩家使用道具g 玩家在游戏场景中不能穿过任何玩家坦克h 玩家每击毁一辆敌对坦克就立即得到100游戏金币i 玩家摧毁敌人弹药基地本方所有玩家就会立刻得到500金币j 玩家摧毁敌人指挥塔本方所有玩家就会立刻得到1000金币k 本方玩家不会伤害任何属于本方的物体或玩家6.2 战斗方法及规则6.2.1 行动点数a 每名玩家都拥有最少10点的行动点数b 移动或者开炮都需要消耗行动点数c 行动点数为0则无法继续任何动作但是可以使用道具d 行动点数消耗完可以等待自动恢复,也可以通过道具立即增加行动点数6.2.2 弹药量a 弹药量根据坦克炮塔不同会稍有不同但是具体数字玩家看不到b 不同的武器对弹药的消耗量不同c 弹药量不足时无法开炮d 弹药量会随时间自动增加6.2.3 开炮角度a 开炮角度影响炮弹的飞行轨迹b 开炮角度用Q、E调节,一次调节后游戏中不会自动变化,除非玩家继续调节6.2.4 射程调整a 射程同样影响炮弹的飞行轨迹,射程越远炮弹飞出的距离就越远b 射程用键盘空格键,或者鼠标右键控制c 玩家按住空格或者鼠标右键力度自动循环增加当玩家松开空格或者鼠标右键时发射炮弹6.2.5 风力a 风力会影响炮弹的射程b 顺风射程自动增加,逆风射程自动减少c 玩家只能通过场景的风力开关或者道具改变风的方向d 风力开关,坦克每接触开关一次就会变风向一次d 风的力度总是一定的6.2.6 车身装甲a 每辆坦克都有自己的装甲,装甲的强度有坦克车身决定b 装甲强度降低为0,则坦克爆炸即玩家死亡一次6.2.7 火炮a 不同的火炮有不同的强度和攻击形式b 总的来说火炮威力越大需要的弹药数量就越多6.2.8 炮台a 炮台,车身上面就是炮台它连接火炮和车身b 炮台的性能越好火炮的填充速度就越快6.2.9 履带,轮胎a 履带,轮胎决定坦克的移动性能b 好的履带,轮胎带来更多的行动点数和更快的行动点数恢复速度6.3 玩家规则a 游戏得进行最少需要2人,当游戏开始后如果不足两人则游戏自动结束b 设置房间的玩家为房主,房主退出游戏则游戏自定结束c 玩家掉线以后游戏继续进行不作处理,但是该玩家损失500金币d 任何强制退出的玩家将赔给所有其他玩家每人300金币,如果该玩家不足赔偿则扣掉所有金币其余部分由系统给与e 游戏的最大人数由房主选择的地图场景决定f 游戏过程中人数不足时其他玩家可以随时加入正在进行的游戏6.4 玩家等级划分a 玩家等级的划分依据为敌人坦克摧毁总数量b 玩家最后一击导致地方坦克被摧毁则此玩家摧毁总数量+1c 玩家等级划分办法d 玩家等级的作用,玩家等级越高就可以购买越高级的道具,改装越高级的坦克部件7 游戏商店 7.1 坦克车间a 车间主要负责改装坦克b车间可以改装的项目包括:火炮,炮塔,车身,履带或者轮胎7.2 道具商店a 道具是战斗过程中可以使用的物品b 道具分成战斗型道具和辅助型道具8 聊天系统a 玩家可以在大厅和房间中进行聊天,进入游戏后则无法聊天b 聊天包括一般和密语两种方式c 玩家可以在聊天中快捷的添加各种表情9 战场地图9.1 图示9.2 地图9.2.1 山地之战a背景为山地地带b 最大总人数6人c 对称图形场景总长度大约3公里,初始无风d 玩家在两边的上下层边界出现e 这个场景中玩家几乎没有统一水平面射击9.2.2 海边怪兽a 背景为海边b 战车在潜水区域移动会消耗更多的行动点数c 场景为对称图形,场景总长度大约2公里,初始无风d玩家在上下两边界出现,最大玩家总数4人e 这一场景中玩家几乎都是平行水平面射击9.2.3 丘陵地带a 背景为丘陵地带b 战车在丘陵地带无法保持车身水平c 场景为对称图形,场景总长度大约3公里,初始无风d 玩家在上下两边界出现,最大玩家总数4人e 这一场景中玩家要注意射击技巧,炮弹飞行轨迹更加难以把握9.2.4 太空时代a 背景为太空b 战车在太空中开炮消耗更多的行动点数c 场景对称,场景总长度2公里,初始无风d 玩家在场景上下两边边界出生,最大玩家人数6人e 这一场景中完全要靠升降梯进行层面移动,多层面是本场景的最大特点10 坦克组成系统a 坦克的组成只能通过同系列也就是G、F、S三个系列来组合b 默认坦克可以随意改装不见中的一个,一旦改装就只能用相同系列的其他部件来进行c 玩家可以通过废弃其他部件来恢复成默认的坦克11 道具系统12 特殊效果设定a 普通炮弹发射,炮口喷射红光b 火焰系的炮弹,炮口持续燃烧冒烟3秒c 酸性武器,炮口流出淡黄色液滴3秒d 坦克被普通炮弹打中,坦克稍稍弹起,如下,大概1秒e 坦克被火焰武器击中,整个坦克出现燃烧效果3秒f 坦克被酸性武器击中,整个坦克出现类似中毒的效果,车身变为黄绿色,3秒g 坦克装甲降为0,出现坦克整个炸开,假象操作者从坦克中飞出屏幕的效果13 音乐,音效a 刚进入大厅,房间,战场3处时有1分钟的音乐b 坦克移动的音效c 坦克开跑的音效d 坦克被击中的音效e 坦克被彻底摧毁的音效f 胜利音乐g 失败音乐14 游戏操作a键盘操作b 鼠标操作鼠标左键点击物品快捷栏使用物品鼠标右键按住准备发射并循环增加射程状态鼠标右键松开发射炮弹15 游戏配置a 机器配置CPU PIII及以上内存256MADSL宽带显卡64M b 窗口模式800*60016制作人员需要策划1人美工2人客户端1人服务器端1人音乐及音效1人17 结构流程18 游戏流程。
坦克大战游戏策划书3篇篇一坦克大战游戏策划书一、游戏名称坦克大战二、游戏类型射击、策略三、游戏平台PC 端四、游戏背景在游戏中,玩家需要控制自己的坦克,在一个充满敌人和障碍物的战场上消灭所有敌人,保护自己的基地。
五、游戏目标1. 消灭所有敌人。
2. 保护自己的基地。
3. 在规定时间内获得最高分。
六、游戏玩法1. 玩家通过键盘控制坦克的移动和射击。
2. 坦克可以向四个方向移动,包括前进、后退、向左转和向右转。
3. 坦克可以向八个方向射击,包括正前方、正左方、正右方、左前方、左后方、右前方、右后方和后方。
4. 敌人会从不同的方向出现,并向玩家的基地前进。
5. 玩家需要消灭所有敌人,才能进入下一关。
6. 如果玩家的坦克被敌人的炮弹击中,或者撞到障碍物,或者基地被敌人摧毁,游戏结束。
7. 玩家可以通过消灭敌人获得金币,金币可以用来购买道具,如增加坦克的速度、攻击力、防御力等。
8. 玩家可以通过消灭敌人获得分数,分数越高,游戏结束时的奖励越高。
七、游戏关卡1. 游戏共有十个关卡,每个关卡的难度逐渐增加。
2. 每个关卡的地图都不同,包括不同的地形、障碍物和敌人的分布。
3. 每个关卡的敌人都会有不同的特点和攻击方式,玩家需要根据敌人的特点来制定策略。
八、游戏画面1. 游戏画面采用 2D 风格,以坦克和战场为主要元素。
2. 游戏画面色彩鲜艳,对比度高,易于玩家识别和区分敌我坦克。
3. 游戏画面中会有敌人的炮弹和玩家的坦克的炮弹的特效,增加游戏的紧张感和刺激感。
九、游戏音效1. 游戏音效包括坦克的移动声、射击声、爆炸声、敌人的脚步声等。
2. 游戏音效的音量和节奏会根据游戏的不同阶段进行调整,增加游戏的氛围和节奏感。
3. 游戏音效的设计要符合游戏的主题和风格,让玩家更容易沉浸在游戏中。
十、游戏操作提示1. 在游戏开始前,会有一段操作提示,告诉玩家如何控制坦克和射击。
2. 操作提示会在游戏过程中随时出现,提醒玩家如何应对不同的情况。
课程设计一坦克大战一、游戏介绍相信大部分同学都玩过或看过“坦克大战”这款经典游戏。
现在,就由我们自己动手来开发它。
只要大家具备了C++语言和面向对象的基础知识,然后按照实验指南的指导一步一步进行下去,相信我们每个同学都能把这款经典游戏做出来。
二、实验目标综合运用C++及其面向对象的知识开发一款小游戏。
三、实验容在一个战场上,玩家控制坦克,消灭敌方坦克,并防止敌方坦克摧毁我方基地。
游戏的具体要求如下:1、游戏有一个初始页面,如下图。
屏幕上最部的黑色区域为玩家坦克的活动区域,左上角坐标为(-26,-22),右下角坐标为(26,22)。
当坦克运动到该区域边界时,坦克不能继续前进。
2、按下任意键开始游戏,玩家控制坦克在战场上穿梭,碰到墙时,不能通过。
3、敌方坦克自由移动,每隔2秒改变一个方向,每隔3秒发射一发子弹。
4、敌方坦克每隔5秒出现一辆,从屏幕上方的左、中、右三个位置依次出现。
5、当玩家被消灭或者我方基地被摧毁或者游戏时间大于30秒的时候,游戏结束。
游戏开始前进入游戏四、游戏的整体框架五、实验指南实验准备打开FunCode,创建一个新的C++项目。
注意:项目名称必须为英文和数字,且不能有空格。
点击“项目”→“导入地图模板”,从对话框中选取名称为TankWar的模板导入。
导入成功后,界面如下:实验一游戏开始【实验容】1、设置游戏标题2、按空格键,提示图片消失,游戏进入开始状态.【实验运行结果】30游戏开始前按下空格键后【实验思路】要处理FunCode中的图片,我们需要声明CSprite类型对象来指向相应图片,然后调用精灵类的相应函数进行处理。
按下空格键是键盘按下事件,系统调用CSystem::OnKeyDown函数进行响应。
该函数中调用CGameMain::OnKeyDown函数。
因此我们可以在CGameMain类的OnKeyDown函数完成相应代码。
按下键盘后,需要改变游戏的状态,游戏从未开始进入开始状态。
成员变量m_iGameState用来表示游戏状态。
【实验指导】1、C++程序的执行入口是主函数。
FunCode的主函数名称叫WinMain,写在Main.cpp文件中。
CSystem::SetWindowTitle是设置程序运行窗口标题的函数,修改如下:30CSystem::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(){delete m_pSplash;delete m_pStart;}8、编译并运行程序,然后按下空格键,看看运行效果。
实验二坦克运动【实验容】1、创建坦克类CTankPlayer;2、游戏开始时,将坦克放置于(0,0)的坐标上;3、通过按键WSAD控制坦克上下左右运动;4、坦克运行到黑色区域边界时不能继续前进。
【实验运行结果】在区域运动30 运动到区域边界【实验思路】坦克也是精灵,但是它具备一些自己独特的功能,比如通过键盘控制运动、开炮等。
因此我们可以创建一个新的类CTankPlayer类,并让它继承CSprite类。
通过WASD键,控制坦克做相应的的上左下右运动。
按下某个键,给坦克设置相应方向的运动速度;松开时,将该方向的速度设为0,表示停止运动。
屏幕上最部的黑色区域为玩家坦克的活动区域,左上角坐标为(-26,-22),右下角坐标为(26,22)。
当坦克运动到该区域边界时,坦克不能继续前进。
【实验指导】1、通过类向导创建CTankPlayer类,其继承于CSprite类。
以VC++ 6.0为例:第一步、点击菜单“插入”-〉“新建类”。
第二步、在“New Class”对话框中输入类名和父类名。
第三步、点击“Change”按钮,在新对话框中修改CTankPlayer类的头文件和cpp 文件的路径。
将头文件保存到项目文件夹的\SourceCode\Header文件夹中,将cpp文件保存到项目文件夹下的\SourceCode\Src文件夹中。
这里需要特别注意的是创建文件路径的问题,所有的.h头文件应该在项目文件夹\SourceCode\Header中,所有的.cpp源文件应该放在项目文件夹下的\SourceCode\Src文件夹中。
这样我们在#include的时候只需要写文件名就可以了。
如果保存到其他路径下,需要写相对路径。
2、点击OK,出现下面提示,不用管它,点击“确定”。
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;}30//get方法int GetHp() {return m_iHp;}int GetDir() {return m_iDir;}float GetSpeedX() {return m_fSpeedX;}float GetSpeedY() {return m_fSpeedY;}6、在CTankPlayer类的构造函数完成上面四个成员变量的初始化。
CTankPlayer::CTankPlayer(const char* szName):CSprite(szName) //对构造函数进行实现{m_iDir=0;m_fSpeedX=0.f;m_fSpeedY=0.f;m_iHp=2;}子类对象创建时,要先调用父类的构造函数完成父类部分的构造。
如果父类没有默认构造函数,子类的构造函数必须显示调用父类的构造函数。
CTankPlayer构造函数调用CSprite类构造函数,并将参数szName的值传递给它,从而将名称为szName 的精灵图片与CTankPlayer对象绑定起来。
7、为CTankPlayer类添加Init函数,该函数主要用来完成该类的初始化工作。
这里,先调用setHp方法设置血量。
然后调用父类的SetSpritePosition函数将坦克精灵设置在屏幕中央(0,0)处。
接下来给坦克精灵设置时间边界的大小,与世界边界的碰撞模式为WORLD_LIMIT_NULL,表示精灵与世界边界碰撞的响应由代码完成,同时设置坦克碰撞模式为发送碰撞和接收碰撞。
void CTankPlayer::Init(){SetHp(2);SetSpritePosition(0.f,0.f);SetSpriteWorldLimit(WORLD_LIMIT_NULL, -26, -22, 26, 22);SetSpriteCollisionActive(1,1);//设置为可以接受和发生碰撞SetSpriteVisible(true);}8、完成CTankPlayer类相关定义后,在CGameMain类中增加一个私有成员变量m_pTankplayer,类型为CTankPlayer*。