程序设计实训坦克大战实验报告材料
C++课程设计报告

《面向对象编程技术》课程设计实验报告——————坦克二班级:软124姓名:张景东学号:129074282指导教师:胡增涛设计完成时间:2013/12/24目录一、程序名称二、设计目的三、程序设计的意义四、功能介绍五、开发平台六、课程设计总体规划1、处理流程图2、结构模块分析七、主要代码八、运行效果抓图九、创新和难点十、课程设计中目前存在的问题十一、心得体会一、程序名称以《坦克大战》游戏为题材,自己动手,从零开始,写出简单坦克小游戏-----坦克二。
二、设计目的1、进一步掌握C++进行类的定义和操作方法;2、学习和掌握C++程序设计方法以及上机调试技巧,为以后学校其他专业课程打好基础;3、能够培养我们独立分析问题、解决问题、查阅资料以及自学的能力,以适应计算机只是日新月异发展的形式;4、程序设计的目的不单单是课堂上的学习,我觉得最重要的是让我们学生掌握程序设计的思想与方法。
在课程设计的过程中,我们充分运用我们课堂上学习到的知识,并且复习C语言中的函数等知识点。
在这个过程中,我们能够不断提高对C++面向对象程序设计的理解,最终能够独立自主解决一些问题。
三、程序设计的意义大学最重要无疑是动手能力与自学能力的培养,课程设计明显给了我们这样的一个机会。
遇到瓶颈的时候,我们需要去图书馆查阅书籍,代码错误的时候我们需要反复的调试,在这个过程中,我们的动手能力以及自学能力都在不知不觉中得到了很大的提升。
回顾起此次课程设计,我还是感慨颇多,从理论到实践,在这几乎一个学期的时间里(课程设计是C++第一次上课的时候提出来的),我学到了很多很多的东西,不仅巩固了以前所学过的C语言方面的知识,而且自己也去图书馆查阅资料学到了很多。
通过这次的课程设计使我懂得了理论与实际结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践结合起来,从理论中得出结论,才是自己真正掌握了的,属于自己的知识,才能提高自己的实际动手能力和独立思考的能力。
坦克大战 实验报告

本科实验报告课程名称:Java语言程序设计实验项目:TankWar实验地点:致远楼B403专业班级:软件工程1219 学号:2012005496 学生姓名:柴丁方指导教师:任少斌2014年 1 月7 日import java.awt.*;import java.awt.event.*;public class TankWarClient extends Frame {//构造游戏开始的界面public void KaiShiJieMian() {this.setLocation(400,200); //游戏窗口的左上点在屏幕的位置this.setSize(800, 600);//游戏窗口的尺寸//使按窗口的“X”时,可以关闭程序较上一次实验添加的代码段为:public void paint (Graphics g) {Color c = g.getColor();//color类是 java。
awt 中的,因此可以直接 color cg.setColor(Color.green);// 类 java.awt.Graphics 中的方法,将此图形上下文的当前颜色设置为指定颜色。
g.fillOval(50, 50, 30, 30);//int x, int y,int width,int height,分别为坐标与椭圆的长宽g.setColor(c);}变更2:较上一次实验添加的代码段为:1.更改如下代码段中的“常量值”为“x”“y”,使所填充的椭圆位置可以随值改变,为静态的图形动起来打下了基础。
static int x=50,y=50;实验四:从版本0.4到版本0.41变更1:变更2:较上一次实验添加的代码段为:1.public class TankWarClient extends Frame {Image offScreenImage = null;}//先把内存的offScreenImage清空较上一次实验添加的代码段为:1.TankWarClient类中:2.3.较上一次实验修改的代码段为:public class Tank {public static final int XSPEED = 5;public static final int YSPEED = 5;private int x, y;private boolean bL=false, bU=false, bR=false, bD = false;enum Direction {L, LU, U, RU, R, RD, D, LD, STOP};private Direction dir = Direction.STOP;//此处为构造函数。
坦克大战报告

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:我方开火,敌方会爆炸,然后死亡。
新世纪坦克大战课程设计报告

计算机学院计算机科学与技术专业《程序设计综合课程设计》报告(2010/2011学年第一学期)学生姓名:学生班级:学生学号:指导教师:2011年 1 月9 日新世纪坦克大战目录《程序设计基础》课程设计 (1)——《新世纪坦克大战》 (1)一.课程设计目的和要求 (1)二.课程设计任务内容 (1)三.详细设计说明 (1)(1)需求分析 (1)(2)算法设计 (2)(3)数据结构设计 (2)(5)功能函数设计 (4)(6)函数调用流程 (4)(7)编码和实现 (4)(8)调试和运行 (5)四.软件使用说明 (9)五.课程设计心得与体会 (9)附录1:参考文献 (10)附录2:程序清单 (11)《程序设计基础》课程设计——《新世纪坦克大战》一.课程设计目的和要求1.熟悉c++的各种编译技巧和注意事项。
2.能就实际问题提出问题并给予分析。
3.学会分析程序所具备的功能,并把各个功能分类处理。
4.提高使用c++处理实际问题的能力。
5.提高c++编程的实践能力。
二.课程设计任务内容在DOS界面上实现一个简单的《新世纪坦克大战》小游戏。
要求能够自主调整射程,随机给出爆炸效果,判断胜负,画面颜色丰富,基本实现动画效果。
三.详细设计说明(1)需求分析1.游戏规则、特色以及作者版权的介绍。
2.游戏主要背景的输出。
3.背景以及前景的颜色设置。
4.玩家坦克射程的判断。
5.敌对坦克的射程的随机给出以及判断。
6.爆炸效果画面的选取调用以及输出。
7.胜负的判断以及相关函数的调用以及输出。
8.实现游戏回合制的循环。
(2)算法设计将游戏画面底部作为一条数轴,划分为22个部分。
玩家输入射击仰角n,根据仰角n的不同,出现不同的爆炸效果(包括击中对方获胜)。
程序给出一个随机数m,作为敌对坦克的射击仰角,根据仰角m,出现不同的爆炸效果(包括击中玩家致使玩家失败)。
(3)数据结构设计坦克输出画面函数:void picture00(){cout<<" ### ***"<<'\n';cout<<" ####### *******"<<'\n';cout<<" ##### *****"<<'\n';cout<<"#######*******"<<'\n';cout<<"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"<<'\n';}随机数生成函数:srand(time(0));m=rand()%20-1;(5)功能函数设计1.不同的效果画面,包括背景颜色的输出。
拓展项目——坦克大战(共5则)

拓展项目——坦克大战(共5则)第一篇:拓展项目——坦克大战坦克大战明阳天下拓展项目简介团队的所有成员在规定的时间和规则的约束下,进行角色分配后,蒙上双眼依次进入模拟战场,在躲避地雷的同时用炮弹尽可能的击中对手,最终战场剩余人数最多的小组获胜。
项目规则1、每队队员同时蒙眼进入雷区,听由场外队员指挥捡炮弹,中途如有触碰地雷,该队员视为中弹身亡,由下一名队员顶替;2、场内队员蒙眼听从场外队员的指挥,捡起炮弹,击中对方队员身体任意部位,即可淘汰对方队员继续存活;3、场外队员只能在限定的区域内活动,不可触发到其他组的区域;4、最后场外留有人数最多组获胜。
项目目标有效沟通,战略与决策,在特殊的情况下如何和其他学员进行有效沟通;团队的力量如何发挥才能体现最大的力量;怎样才能是更合理的指挥方式;默契程度和信任度的考验。
北京明阳天下拓展培训机构是国内体验培训领域的“黄埔军校”。
在体验式培训、户外教育理论、专项主题研究、软件实操开发等软件设施方面已走在行业前列;而硬件拓展设备、拓展器材、拓展设施设计建造和大型独资实操基地等硬件设施方面同样领先全国。
强大的课程研发队伍,与国际接轨的先进培训理念,完善的硬件设备,优越的服务意识,明阳天下拓展始终秉承“专业致胜,效果为王”的理念,为成千上万的客户打造专业化、高标准的拓展培训方案。
第二篇:坦克大战大报告大作业题目:坦克大战程序一、需求分析功能需求坦克大战其中包括对主战坦克的编写、坦克的初始位置的编写、坦克的移动方向的编写、坦克的速度的编写、坦克的子弹速度的编写、敌军的子弹速度的编写、设置游戏难度的编写、子弹的编写、敌军坦克的编写、构造函数的编写,初始化敌军坦克的位置和状态的编写、键盘控制坦克的移动的编写、发弹的编写、判断是否被击中的编写、判断是否击中敌军的编写等。
通过上下左右键进行对坦克的移动,通过F键发射子弹,其它坦克可以随机移动。
构造主窗口中所需要的类,并将坦克加到窗口中,实现坦克的四个方向的移动并创建炮弹类,并让屏幕中的坦克能发射炮弹,让坦克可以朝对方信息统计功能,在游戏界面左上角,显示当前屏幕子弹数。
坦克大战设计报告

手机版疯狂坦克游戏设计与开发摘要Java良好的跨平台特性在移动平台的开发中显示出了巨大的威力。
Java语言面向对象的优势也使得开发游戏变得非常容易。
随着手机的日益普及、Java功能在移动设备上的实现,Java应用程序产生的手机增值服务逐渐体现出其影响力,对丰富人们的生活内容、提供快捷的资讯起着不可忽视的作用。
本论文着眼于J2ME技术的应用,开发一款可商用的手机游戏程序——坦克大战。
本程序的界面和运作方式继承于日本任天堂公司在20世纪80年代开发的Battle City游戏,将老少皆宜的经典作品移植到手机上来,为更流行的硬件平台提供应用软件。
本论文介绍了任天堂红白机的软硬件特性、J2ME的相关技术及本程序的结构分析和具体功能的实现。
关键词:J2ME,手机游戏,Java,坦克大战目录1 绪论 (3)1.1开发背景 (3)1.2 开发工具 (3)1.3 开发意义 (3)2 需求分析 (6)2.1功能需求分析 (6)2.2界面需求分析 (6)3 总体设计 (7)3.1主要功能 (7)3.2 程序流程 (8)4 详细设计和具体实现 (9)4.1游戏进入前的选择 (9)4.2主游戏逻辑及其涉及到的若干类 (10)4.3坦克的共同行为 (13)4.4玩家坦克的功能属性 (14)4.5敌人坦克的功能属性 (15)4.6子弹的运行和控制 (19)4.7记分系统 (21)5.测试与实现 (22)6 程序的总结和展望 (23)1 绪论1.1开发背景在信息社会中,手机及其他无线设备越来越多的走进普通百姓的工作和生活,随着信息网络化的不断进展,手机及其他无线设备上网络势在必行。
但是传统手机存在以下弊端:1. 传统手机出厂时均由硬件厂商固化程序,程序不能增加、删除,有了错误也不能更新、修改,若要增加新功能必须另换一部手机。
2. 传统手机访问互联网是通过WAP(Wireless Application Protocal),所有网络资源必须接通网络才能在线访问,非常耗时、费用亦很高。
坦克大战实验报告

坦克大战实验报告班级:1205 姓名:许广龙学号:121010182一、系统简介使用JAVA编写一个人机游戏,有开始启动面板(Stage 1),并有闪烁效果。
在开始面板中有游戏(G)和帮助(H)两个菜单。
其中游戏(G)菜单中有开始游戏(N)、退出游戏(E)、保存游戏(S)、继续游戏(C)选项;帮助(H)菜单中有关于坦克如何操作的提示信息。
玩家有1辆坦克(有3条命),电脑有6辆坦克,我的坦克可以通过键盘控制进行移动和发射子弹,敌人坦克可自由运动并自动发射子弹。
敌人坦克相互之间不能重叠,敌人坦克与我的坦克不能重叠,我的坦克与敌人坦克不能重叠。
当子弹击中坦克时坦克死亡,并显示爆炸效果。
当我的坦克生命为0时游戏结束(显示GAMEOVER),当敌方的所有坦克死亡时游戏结束(显示VICTORY)。
二、需求分析设计一个图形用户界面,将所有游戏的元素都能在此用于界面上表现出来,界面能够接受用户的操作,具有人机交互功能。
用户可以选择开始游戏(N),退出游戏(E),保存游戏(S),继续游戏(C),游戏帮助(H)。
界面中包含我的坦克和敌人坦克以及坦克发出的子弹和爆炸后的效果。
坦克:坦克分为两种,敌人坦克和我的坦克。
我的坦克和敌人坦克均可以发射子弹,可以改变路径行走,且在行走过程中碰到边界或碰到其它坦克会自动换方向,坦克之间不能相互穿越。
子弹:子弹可以由敌方坦克和我的坦克发射,且发射出去的子弹可以直线移动,直到碰到其它坦克或超越边界就消失。
坦克受到一颗子弹攻击便死亡,死亡后坦克消失。
爆炸:当子弹射击到坦克身上时,要产生爆炸效果。
方向:坦克和子弹都有方向,可以选择上下左右四个方向,且子弹的方向从属于坦克的方向。
具体功能:1、坦克可以上下左右移动2、坦克可以发子弹(可以连发,最多5发子弹)3、当坦克中弹时,坦克消失,并显示爆炸效果。
4、我的坦克被击中后显示爆炸效果5、防止敌人坦克重叠运动、我的坦克与敌人坦克重叠运动、敌人坦克与我的坦克重叠运动6、玩游戏时可以保存游戏和继续游戏7、记录玩家的成绩三、系统设计程序流程图:总体框架:项目名:TankGame1主类文件:MyFrame.java坦克父类文件:Tank.java坦克子类(我的坦克):MyTank.java坦克子类(敌人坦克):EnemyTank.java我的面板:MyPanel.java子弹类:Shot.java开始面板:MyStartPanel.java记录类:Recorder.java爆炸类:Bomb.java四、详细设计(一) 、画坦克1、Tank类class Tank{int x,y;//坦克的位置int direct;//坦克的方向int color;//坦克的颜色,值为0时为的我的坦克,为1时为敌人的坦克int speed;public Tank(int x, int y) {this.x = x;this.y = y;}setter与getter方法(代码略)public void moveUp(){//向上移动,y坐标值减,方向值为0y-=speed;this.setDirect(0);}public void moveDown(){//向下移动,y坐标值增,方向值为2y+=speed;this.setDirect(0);}public void moveRight(){//向右移动,x坐标值增,方向值为1x+=speed;this.setDirect(0);}public void moveLeft(){//向左移动,x坐标值减,方向值为3x-=speed;this.setDirect(0);}}2、我的坦克类MyTankclass MyTank extends Tank{public MyTank(int x, int y) {super(x, y);}}3、主类MyFramepublic class MyFrame extends JFrame{MyPanel mp=null;public static void main(String[] args) {MyFrame tankGame1=new MyFrame();MyFrame.setVisible(true);}public MyFrame() {mp=new MyPanel();this.add(mp);this.setBounds(200,200,600,500);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}4、在MyFrame.java中创建MyPanel类class MyPanel extends JPanel{MyTank mytank=null;public MyPanel(){mytank=new MyTank(200,200);//创建我的坦克并设置其初始位置}//重载MyPanel类的paint函数以实现画坦克public void paint(Graphics g)//窗口大小改变或重绘窗口时,执行repaint()时会自动调用{super.paint(g);g.fillRect(0,0,600,500);this.drawTank(mytank.getX(),mytank.getY(),mytank.getDirect(),mytank.getColor(), 5, g); }//在MyPanel画坦克的函数,参数包括坦克的位置、方向、类型(用于设置颜色)、画笔:public void drawTank(int x, int y, int direct, int color, int size,Graphics g) {switch (color) {case 0://我的坦克的颜色g.setColor(Color.cyan);break;case 1:g.setColor(Color.yellow);break;case 2://敌人坦克的颜色g.setColor(Color.green);break;}switch (direct) {case 0:g.fill3DRect(x, y, size, 6 * size, false);g.fill3DRect(x + 3 * size, y, size, 6 * size, false);g.fill3DRect(x + size, y + size, 2 * size, 4 * size, false);g.fillOval(x + size, y + 2 * size, 2 * size, 2 * size);g.drawLine(x + 2 * size, y, x + 2 * size, y + 3 * size);break;case 3:g.fill3DRect(x, y, 6 * size, size, false);g.fill3DRect(x, y + 3 * size, 6 * size, size, false);g.fill3DRect(x + size, y + size, 4 * size, 2 * size, false);g.fillOval(x + 2 * size, y + size, 2 * size, 2 * size);g.drawLine(x, y + 2 * size, x + 3 * size, y + 2 * size);break;case 1:g.fill3DRect(x, y, 6 * size, size, false);g.fill3DRect(x, y + 3 * size, 6 * size, size, false);g.fill3DRect(x + size, y + size, 4 * size, 2 * size, false);g.fillOval(x + 2 * size, y + size, 2 * size, 2 * size);g.drawLine(x + 6 * size, y + 2 * size, x + 3 * size, y + 2 * size);break;case 2:g.fill3DRect(x, y, size, 6 * size, false);g.fill3DRect(x + 3 * size, y, size, 6 * size, false);g.fill3DRect(x + size, y + size, 2 * size, 4 * size, false);g.fillOval(x + size, y + 2 * size, 2 * size, 2 * size);g.drawLine(x + 2 * size, y + 6 * size, x + 2 * size, y + 3 * size);break;}}(二)、移动坦克(事件监听)在主类注册键盘事件监听,在MyPanel类中实现事件监听。
JAVA关于坦克大战的课程设计报告

课程设计任务书
题目:
学 号: 姓 名: 专 业: 课 程: 指导教师:
职称:
完成时间: 20 年 月----20 年 月
枣庄学院信息科学与工程学院制
课程设计任务书及成绩评定
课程设计的任务和具体要求 本课程的程序设计专题实际是计算机相关专业学生学习完《JAVA 语言程
序设计》课程后,进行的一次全面的综合训练,JAVA 程序设计的设计目的是 加深对理论教学内容的理解和掌握,使学生综合运用所学知识,利用软件工程 为基础进行软件开发、并在实践应用方面打下一定基础。
2
二.系统分析 2.1 可行性分析
2.1.1 技术可行性 软件使用 swing、GUI、Socket、面向对象设计等技术实现,这些技术
均已是非常成熟的技术,之前已有相当多使用这些技术的成功案例,故现 使用这些技术是可行的。 2.1.2 经济可行性
本软件为免费软件,将免费提供软件的下载、运行和维护服务,软件 暂无收入,待公布之后随着使用者越来越多,将添加相应的广告、服务, 从而增加收入,若使用者寥寥无几,将再次分析是否重新策划软件或者放 弃开发,以减少损失。
2.2 需求分析
设计一个图形用户界面,将所有游戏的元素都能在此用于界面上表现出来, 界面能够接受用户的操作,具有人机交互功能。用户可以选择重新开始游戏, 退出游戏,暂停游戏游戏帮助。
界面中包含我方坦克,和敌人坦克以及坦克发出的子弹和爆炸后的效果。 坦克:坦克分为两种,敌方坦克和用户控制的坦克。用户方和敌方坦克均 可以发射子弹,可以改变路径的行走,且在行走过程中遇到墙等阻碍物和游戏 边界时要改变方向,而不能一直顶着障碍物不放。坦克之间不能穿越,碰撞到 后自动调换方向。 墙:游戏中的边界王家的坦克和敌人的坦克都不能越过,坦克的子弹也不 能穿过。 子弹:子弹可以由敌方和用户方发射,且发射出去的子弹可以直线移动, 直到碰到障碍物就消失,子弹可以穿越树林和河流。敌方坦克受到一颗子弹攻 击会爆炸从而导致死亡,死亡后坦克消失。用户方受到子弹攻击后会减少寿命, 且受到四次攻击则死亡,此时如还有敌方坦克存在,则用户方输掉本次游戏。 爆炸:当子弹射击到坦克身上时,要产生爆炸效果。 方向:坦克和子弹都有方向,可以选择上下左右四个方向,且子弹的方向 从属于坦克的方向。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序设计实训报告坦克大战专业班级:装控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秒。
三、功能实现3.1 数据结构struct Weapon{char szName[128]; // 精灵名称float fPosX, fPosY; // 精灵坐标float fSpeedX, fSpeedY; // X和Y方向上速度float fFireTime; // 敌方坦克距下一次开炮的剩余时间float fRotateTime;int iHp; // 生命值int iDir; // 朝向:0 - 上方;1 - 右方;2 - 下方;3 - 左方int iType; // 类型: 0 - 我方坦克;1 - 敌方坦克;2 - 我方// 子弹; 3 - 敌方子弹Weapon* pNext; // 指向下一个节点的指针};enum Direction{UP = 0, // 上方RIGHT = 1, // 右方DOWN = 2, // 下方LEFT = 3 // 左方};enum Role{MYTANK = 0, // 我方坦克ENEMYTANK = 1, // 敌方坦克MYBULLET = 2, // 我方子弹ENEMYBULLET = 3 // 敌方子弹};const float GAME_TIME = 100.f; // 一局游戏时间const float CREATE_TANK_TIME = 2.f; // 每批次生成坦克的时间间隔const float TANK_SPEED = 20.f; // 坦克速度const float BULLET_SPEED = 30.f; // 子弹速度const float FIRE_TIME = 2.f; // 坦克开炮时间间隔const float WORLD_LEFT = -26.f; // 游戏场景边界左值const float WORLD_TOP = -22.f; // 游戏场景边界左值const float WORLD_RIGHT = 26.f; // 游戏场景边界左值const float WORLD_BOTTOM = 22.f; // 游戏场景边界左值int g_iMap[11][13]; // 二维数组定义游戏地图int g_iWallCount = 0; // 游戏中墙的数量int g_iNum = 0; // 记录全部精灵的数目,用来给精灵命名float g_fCreateTime = 0.f; // 每批次生成坦克的剩余时间int g_listSize;const float ROTATE_TIME = 2.f; // 敌方坦克调转方向的时间bool g_bStart; // 定义游戏开始与否int g_iScore; // 游戏中的分数float g_fGameTime=30.f; // 定义游戏时间int maxscore=0; // 定义初始最高分3.2 算法描述3.2.1 游戏开始和结束1、游戏状态g_bstart分为两种状态0,1 ,其中0表示游戏结束状态,1表示游戏开始;当游戏未开始时即g_start状态为0,按下空格键,游戏g_bstart状态变为1,游戏开始,将“空格开始”与“splash”设置为不可见,游戏开始计时为100秒,显示最高分数,将本局游戏分数初始化为0,初始化地图中墙,goal,玩家坦克的位置。
一局游戏进行中,每循环一次,g_fGameTime减去一次刷屏的时间。
当g_fGameTime≤0,说明一局游戏时间已完,游戏停止,重新显示“空格开始“字样。
2、按W、S、A、D键,控制坦克上下左右运动。
定义MoveMyTank函数,按下W键,设置玩家坦克向上的速度;按下A键,设置向左速度;按下S键,设置向下的速度,按下D键,设置向右速度。
松开键盘,坦克速度为0。
同时设置玩家坦克朝向iDir。
3、游戏开始后,右上角实时显示剩余时间。
一局游戏开始后,在WinMain函数中的主循环里,通过dSetTextValue把(int)g_fGameTime的数值显示在名为“time”的文字精灵里,从而实时显示剩余时间(显示整秒的时间)。
4、当超过100秒,游戏结束,重新显示“空格开始”字样,游戏时间设为0,坦克回到初始位置。
一局游戏进行中,每循环一次,g_fGameTime减去一次刷屏的时间。
当g_fGameTime≤0,说明一局游戏时间已完,游戏停止,重新显示“空格开始”字样。
同时,g_batart状态要改为0,否则下一局就不能正确判断游戏开始或结束。
3.2.2 玩家坦克在街道中运行1、一局游戏开始时载入地图。
利用数组的值来载入地图,值为0,说明此处为空;值为1,说明此处有墙。
游戏开始后载入地图,但只能载入一次。
如果不停载入,会占有大量资源。
创建一个新的精灵,首先需要给它命名。
有规则地给精灵命名,有利于我们对精灵进行处理。
我们按照墙生成的先后顺序,分别给精灵命名为:wall0,wall1,wall2….按树林生成的顺序,分别给精灵命名为:shu,shu1,shu2……,钢板分别命名为aa1,aa2……。
2、一局游戏结束后删除地图。
3、玩家坦克碰到墙的话,不能继续前行。
设置玩家坦克的碰撞属性,并专门定义一个函数处理玩家坦克发生碰撞后,玩家坦克的响应。
3.2.3 玩家坦克射击1、玩家按下j键,坦克发送炮弹;自定义一个函数,OnFire用于完成坦克发射子弹功能。
玩家坦克发射子弹,和敌方坦克发射子弹功能基本一样,我们可以写在一个函数里。
首先,需要把发射子弹的坦克名称传进来,这样,我们才能获取坦克的朝向和位置;其次,需要区别是我方坦克发射的子弹,还是敌方坦克发射的子弹。
在dOnKeyDown 中增加对OnFire函数的调用。
条件需要满足:游戏开始后,且玩家按J键。
2、创建链表,用链表管理炮弹;用链表管理子弹,每发射一颗子弹,就添加到链表里。
每删除一颗子弹,就从链表里相应删除节点。
游戏结束时,删除所有剩余的子弹。
3、子弹击中墙,将墙摧毁;子弹击中目标,游戏结束。
碰撞事件中,我们经常会将碰撞的一方或两方删除。
但是,如果我们直接删除某个精灵,而后面的精灵还需要获得它的信息时,就没法获得了。
因此,我们定义一个ISDead函数,当该指针存在且iHp 为0时,说明该精灵已死。
碰撞函数中,先将需要删除的精灵的iHp设置为0,最后再统一将需要删除的精灵删除。
4、在dOnSpriteColSprite函数中调用上面两个碰撞函数。
其中,墙只具有“接受碰撞”属性,因此只需要判断szTarName是否包含wall字符串。
子弹具有“发射碰撞”和“接受碰撞”两种属性,因此需要分别判断szSrcName和szTarName是否包含bullet 字符串。
3.2.4 敌方坦克产生与运动1、每隔一段时间,生成一辆敌方坦克,向下运动;坦克生成的初始位置前方不能有墙。
自定义一个函数,用于生成敌方坦克。
每次生成一辆敌方坦克,总是放在第一排,列数随机,但其前方不能有墙。
方向朝向,设置“发送碰撞”和“接受碰撞”属性,设置世界边界。
创建一个Weapon指针节点,将精灵名称、朝向、坦克调转方向时间保存起来,并将节点添加到链表中。
2、敌方坦克每隔一段时间,就顺时针变化一个方向,继续前进。
自定义一个MoveEnemyTank函数,用来处理敌方坦克的运动。
函数根据敌方坦克名称,获取敌方坦克当前朝向和速度,然后将该坦克顺时针旋转90度,并修改相应速度。
在WinMain函数中,一局游戏运行时,遍历链表,找出敌方坦克节点,判断是否已经到调换方向时间。
如果时间到,调用MoveEnemyTank函数。
3.2.5 坦克对战1、玩家坦克子弹击中敌方坦克,敌方坦克被摧毁,玩家加一分。
在OnTankColOther 函数中,对玩家子弹碰到敌方坦克,敌方坦克iHp设为0,并且g_iScore加1。
2、每隔一段时间,敌方坦克就发射一发子弹;增加一个一个全局常量的定义:const float FIRE_TIME = 2.f; // 敌方坦克发射炮弹的时间间隔\ 创建坦克时,需要给坦克的fFireTime赋值为FIRE_TIME。
在WinMain的主循环中,遍历链表,找到敌方坦克节点。
如果坦克发射炮弹时间到,调用OnFire函数。
3、敌方子弹击中玩家坦克,游戏结束。
在OnMyTankColOther函数中,当玩家坦克碰到的是子弹精灵(不可能是自己发射的子弹,因为子弹速度比坦克快),游戏结束。
四、系统界面图4-1 开始游戏图4-2 游戏进行画面图4-3 开始新一局游戏五、总结许晨欢:这次程序设计实训我自己收获非常的多,首先是对于funcode这款软件的收获,可以说是从无到有,从陌生到熟悉,开始觉得软件太难了,无从下手,后来在不断询问老师和同学的过程中,逐渐熟能生巧,学会了创建第一个项目,运行FunCode创建新项目,导入静态精灵,导入动画精灵,删除精灵,设计界面初步,运行游戏等基本操作。