第一篇:坦克大战迭代式需求分析
坦克大战
动手写一个练习项目:
一.系统分析:
需求分析:
启动游戏后:
1.展现出一个800*600的游戏界面,游戏界面不可调整大小,游戏界面点击右上角的红叉后关闭。
2.信息统计功能,在游戏界面左上角,当前屏幕子弹数,当前敌军坦克数。
3.我方坦克,颜色为红色,形状为原型,具有一个炮筒,和坦克的移动方向保持一致。
根据键盘的方向键,坦克的移动方向分为左、左上、上、右上、右、右下、下、左下。
当按住Ctrl键的时候,能够发送炮弹,多次按键,多次发送。
坦克有血量,满血为100,每次被击中,都会掉血10,直到0后,坦克死亡,游戏结束。
4.敌军坦克
形状:原型
颜色:蓝色
移动:随机移动
血量:当被一发炮弹击中的时候,立即死亡消失。
5.碰撞
当子弹碰撞坦克时,子弹消失。
当敌军坦克碰撞到我方坦克时,敌军坦克消失。
当子弹碰撞到墙壁时,子弹消失,不可穿透墙壁。
当坦克碰撞到坦克时,不可穿越。
当坦克碰撞到四周的游戏界面时,不可走出游戏界面。
二.系统设计
1.目录规范:
src/com/neusoft 下存放实体类。
涉及的类有:
TankClient:游戏的主类,其中包含了坦克,子弹,墙壁 Tank:坦克类 Missile:炮弹类
2.命名规范:
类名:首字母大写,驼峰标识。表示动作,要采用动词。方法名:首字母小写,驼峰标识。静态变量:全部大写
以上,命名简单含义明确,要做到见名知意。
3.工具及其环境
采用MyEclipse6.5进行开发,JDK1.6,windows2003操作系统。
三.开发计划
1.采用迭代式开发
v1.完成游戏界面开发,添加响应事件,能够关闭窗口。完成 完成 v2.我方坦克开发,展现、移动。完成
v3.炮弹开发,一枚炮弹从我方坦克发出,向屏幕下方飞去。完成 v4.按键发送炮弹,当按住ctrl键的时候,炮弹才会发出去。完成 v5.炮筒开发,随着坦克的移动方向不同,炮筒的方向不同。完成
v6.基数统计,在主屏幕的左上角统计当前游戏屏幕内的炮弹数。完成
敌军坦克开发,敌军坦克随机移动,能够发送炮弹。添加十辆坦克到游戏界面。v7.碰撞开发,子弹碰到敌军坦克时,坦克爆炸,消失,子弹消失。
v8.墙壁开发,子弹遇到墙壁,消失,不可穿透,坦克遇到墙壁停止,调转方向。v9.游戏细节限制,坦克之间不可穿越。我方坦克血条。游戏结束时候提示。
版本:
MyProject_001_TankWar版本:完成v1、v2、v3、v4、v5功能。MyProject_002_TankWar版本: 1.修改子弹画图方法,由原来的Tank类中移动到TankClient类中,降低耦合度。
2.解决“java.util.ConcurrentModificationException”bug,使用Iterator迭代器对子弹的容器进行迭代,并调用Iterator自身的remove方法,取代容器自身的方法。3.满足v6、v7 MyProject_003_TankWar版本:
添加十辆坦克到游戏界面。敌军坦克随机移动,能够发送炮弹。解决敌军炮弹自残的问题。解决边界问题,坦克无法走出游戏边界。MyProject_004_TankWar版本:
1.使我方坦克可以被攻击,被攻击后掉血,每次掉 十分之一,直到死亡。2.增加血条,初始状态满血,每被攻击一次,就会掉十分之一的血。MyProject_004_TankWar版本:
计划完成,一键重新开始游戏。游戏结束提示。坦克大招,随机血包。
项目笔记:
虽然工作了几年,没有仔细学过JAVASE,所以总是感觉自己基础薄弱,其中的原因有自身的因素,也有外界因素,在大公司没办法,可能一个方向就够你干很多年,机会少。这是我第一个认认真真自己写的项目。
得到的收获:
1.面向对象思想,分析问题域,定义对象、方法。
2.开发的阶段性,之前我的做法一般都是瀑布式,说实在的却是如书上所说郁闷,干的满头大汗,都三而竭了,还没看到成绩,难免垂头丧气,影响士气。感觉到了原型法的好处,写项目分版本,快速建立原型,在此基础上逐渐丰富,很好的开发方式,值得使用。3.了解到了持有对方引用,这种模式,很好,降低了耦合,增强了内聚。
心中迷惑:
1.低耦合、高内聚,这个概念还是模糊,不知道合适的力度,类与类之间,耦合度多低算低呢?除了持有对方引用,还有其他的办法降低耦合度么?
2.总是感觉面向对象过程中,对象的确定和方法的确定很灵活、可以说不同的人有不同的看法,那么什么样的设计才是完美,最优的方案呢?
第二篇:坦克大战大报告
大作业题目:坦克大战程序
一、需求分析
功能需求
坦克大战其中包括对主战坦克的编写、坦克的初始位置的编写、坦克的移动方向的编写、坦克的速度的编写、坦克的子弹速度的编写、敌军的子弹速度的编写、设置游戏难度的编写、子弹的编写、敌军坦克的编写、构造函数的编写,初始化敌军坦克的位置和状态的编写、键盘控制坦克的移动的编写、发弹的编写、判断是否被击中的编写、判断是否击中敌军的编写等。通过上下左右键进行对坦克的移动,通过F键发射子弹,其它坦克可以随机移动。构造主窗口中所需要的类,并将坦克加到窗口中,实现坦克的四个方向的移动并创建炮弹类,并让屏幕中的坦克能发射炮弹,让坦克可以朝对方信息统计功能,在游戏界面左上角,显示当前屏幕子弹数。.(1)、我方坦克,形状为一辆坦克图片,和坦克的移动方向保持一致。根据键盘的方向键,坦克的移动方向分为上、下、左、右。当按住F键的时候,能够发送炮弹,多次按键,多次发送。坦克有血量,满血为100,每次被击中,都会掉血10,直到0后,坦克死亡。(2)、敌军坦克,形状为一个黄色圆,移动为随机移动,血量为当被一发炮弹击中的时候,立即死亡消失。(3)、补血包,当我方坦克碰撞到补血包时,可补血,敌方坦克碰撞到时,穿过补血包,不会补血。补血包随机出现。.(4)、碰撞:当子弹碰撞坦克时,子弹消失。当敌军坦克碰撞到我方坦克时,相互穿过。当子弹碰撞到墙壁时,子弹消失,不可穿透墙壁。当坦克碰撞到坦克时,可穿越。当坦克碰撞到四周的游戏界面时,不可走出游戏界面。
运行需要
(1)数据精确性
在进行存取款金额时,需求数据记录定位精确,要求输入数精确金额。(2)时间特性
系统要求用户进行相应操作后系统的响应时间应尽量短,不能超过一定的时间范围本设 计暂规定为1-2s。(3)适应性
要求平台具有很好的更新能力,平台应该能够对并发事件,对于“不可靠”数据具有较强的识别处理能力。(4)可维护性
为满足系统在以后运行过程中出现问题能够修正以及系统需要升级等要求,系统应该具有可维护、可扩充、可更新的性能。(6)兼容性适合
Windows2003及以上版本的操作系统。(7)安全性
系统运行应该满足具有一定能够避免黑客、病毒等恶意攻击的安全防范措施。但相对如此简单的平台,应考虑到这些东西。
二、类的设计
1、类的设计:
坦克大战游戏主要涉及到的对象有地图、坦克、炮弹、血包。因此,整个系统的功能可以由以下几个类完成:
TankMap类: 此类主要功能是利用java中AWT包来实现坦克游戏的主窗口,以及对其他类的调用和实例化;游戏地图的初始化,重绘地图上的其他元素。
Blood类:此类主要是定义玩家坦克的生命值,有可以控制玩家坦克的加血等操作的方法。
Tank类:此类主要定义的是游戏中的坦克,可以实例化出玩家坦克,在此类中有坦克的移动,开火等方法。
EnemyTank类:此类主要定义的是游戏中的敌方坦克,可以实例化出敌方坦克,在此类中有敌方坦克的移动,开火等方法。
Shell类:此类主要定义的是游戏中的炮弹类,其中有炮弹的大小以及移动等因素。Explor类:此类定义的是坦克被攻击后的爆炸,其中有坦克击毁后爆炸的图形变化。
2、方法的设计: TankMap类的方法:
init():初始化地图以及地图上的元素
paint():绘制地图以及地图上的元素
update():重绘地图以及地图上的元素
Main():程序入口,创建TankMap对象 Tank类的方法:
Move():按照指定的方向,实现坦克的移动
checkDirection():判断用户点击的方向键,更新坦克运动方向
Fire():当用户单击F键时,发射炮弹
getRec():获取坦克当前所处位置的矩形
isLive():判断坦克的生命值是否为0
setLife(int life):设定坦克生命值
Draw():在指定的地图上绘制坦克
Tank():构造方法,初始化坦克,指定坦克所在地图 Shell类的方法:
Move():按照发射该炮弹的坦克的方向移动
getRec():获取炮弹当前所处位置的矩形
Draw():在指定地图上绘制炮弹
hitTank():打击指定坦克
Shell():构造方法,初始化炮弹 Blood类的方法:
getRec():获取血包当前所处位置的矩形
Draw():在指定地图上绘制血包
Blood():构造方法,初始化血包
三、编码实现及说明
TankMap类:
public class TankMap extends Frame {
public static final int MAPWIDTH=800;public static final int MAPHEIGHT=600;Random r=new Random();public int time=0;int s=1;//城墙数 Tank t=null;public static java.util.List
java.util.List
walls=new enemys=new public
public java.util.ArrayList
java.util.List
explors=new java.util.ArrayList
} public void paint(Graphics g){
Color c=g.getColor();g.setColor(Color.PINK);g.fillRect(0,0,MAPWIDTH,MAPHEIGHT);g.setColor(Color.RED);g.drawString(“当前炮弹数目:”+shells.size(),20,40);g.drawString(“生命值:”,20,60);g.fillRect(65,55,t.getLife(),5);g.setColor(c);t.draw(g);public int enemyCount=10;
public static void main(String[] args){
} public void drawImage(){ } public void init(){
this.setSize(MAPWIDTH,MAPHEIGHT);this.setTitle(“TankWar”);
this.setVisible(true);
this.addKeyListener(new DirectionHandler());
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent arg0){ } System.exit(0);TankMap tv=new TankMap();tv.init();});for(int i=0;i
}
if(r.nextInt(10)==9 && bloods.size()==0)
for(int i=0;i } for(int i=0;i } for(int i=0;i } for(int i=0;i } for(int i=0;i } Shell s=shells.get(i);if(s.isLive && s.isgood){ } s.draw(g);s.hitTanks(enemys);s.hitTank(t);}else if(s.isLive&&!s.isgood){ Wall w=walls.get(i);w.wallb(t);w.draw(g); Blood b=bloods.get(i);b.bloodb(t);b.draw(g);Explor e=explors.get(i);e.draw(g);EnemyTank et=enemys.get(i);et.draw(g);bloods.add(new Blood());bloods.remove(0);if(r.nextInt(30)==7 && bloods.size()==1)public void update(Graphics g){ } class PaintThread implements Runnable{ public void run(){ while(true){ repaint();time++;paint(g); } } } } try{ } Thread.sleep(100);e.printStackTrace();}catch(InterruptedException e){ class DirectionHandler extends KeyAdapter{ } public void keyPressed(KeyEvent arg0){ } t.checkDirection(arg0); Tank类: public class Tank { public static final int WIDTH=50,HEIGHT=50,xspeed=10,yspeed=10;public int x=400,y=300;public Direction direction = Direction.STOP;TankMap tm;boolean isLive = true;boolean isgood = true;int life = 100;public int zhuanxiang=1;public boolean isLive(){ } public void setLive(boolean isLive){ } public int getLife(){ } public void setLife(int life){ } public Tank(){} public Tank(TankMap t){ } public void draw(Graphics g){ if(zhuanxiang==1){ tm=t;this.life = life;return life;this.isLive=isLive;return isLive; } } ImageIcon icon=new ImageIcon(“tank_shang.gif”);Image tankImage=icon.getImage();g.drawImage(tankImage,x,y,null);else if(zhuanxiang==-2){ } else if(zhuanxiang==2){ } else { } /*Color c = g.getColor();g.setColor(Color.RED);g.fillOval(x,y,WIDTH,HEIGHT);g.setColor(c);*/ move(direction);ImageIcon icon=new ImageIcon(“tank_xia.gif”);Image tankImage=icon.getImage();g.drawImage(tankImage,x,y,null);ImageIcon icon=new ImageIcon(“tank_zuo.gif”);Image tankImage=icon.getImage();g.drawImage(tankImage,x,y,null);ImageIcon icon=new ImageIcon(“tank_you.gif”);Image tankImage=icon.getImage();g.drawImage(tankImage,x,y,null);public void move(Direction d){ if(d==Direction.STOP){ }else if(d==Direction.UP){ zhuanxiang=1;y-= yspeed;if(y<=20)y=20;}else if(d==Direction.RIGHT){ zhuanxiang=-2;x+=xspeed;if(x>=800-WIDTH)x=800-WIDTH;}else if(d==Direction.DOWN){ zhuanxiang=-1;y+=yspeed; } } } if(y>=600-HEIGHT)y=600-HEIGHT;}else if(d==Direction.LEFT){ zhuanxiang=2;x-=xspeed;if(x<=0)x=0;public void checkDirection(KeyEvent k){ } public void fire(){ tm.shells.add(new if(k.getKeyCode()==KeyEvent.VK_UP){ } if(k.getKeyCode()==KeyEvent.VK_F){ } fire();direction=Direction.UP;direction=Direction.RIGHT;direction=Direction.DOWN;direction=Direction.LEFT;}else if(k.getKeyCode()==KeyEvent.VK_RIGHT){ }else if(k.getKeyCode()==KeyEvent.VK_DOWN){ }else if(k.getKeyCode()==KeyEvent.VK_LEFT){ Shell(this.x+WIDTH/2,this.y+HEIGHT/2,this.direction,tm,Color.RED,} public Rectangle getRec(){ } return new Rectangle(this.x,this.y,this.WIDTH,this.HEIGHT);true));EnemyTank类: public class EnemyTank extends Tank { public static final int WIDTH=20,HEIGHT=20,xspeed=3,yspeed=3;public int x=400,y=300;public Direction direction = Direction.DOWN;public boolean islive = true;Color color = Color.YELLOW;TankMap tm;Random r=new Random();int randomCount = r.nextInt(10)+5; public EnemyTank(){} public EnemyTank(int wx,int wy,Color c){ } @Override public void draw(Graphics g){ } public void move(){ if(randomCount==0){ } randomCount--;if(r.nextInt(40)>36){ } if(direction==Direction.UP){ ImageIcon icon=new ImageIcon(“tank_shang.gif”);Image enemytankImage=icon.getImage();y-=yspeed;if(y<=HEIGHT)y=HEIGHT;fire();Direction dirs[]=Direction.values();direction = dirs[r.nextInt(dirs.length-1)];randomCount = r.nextInt(10)+5;Color c = g.getColor();g.setColor(color);g.fillOval(x, y, WIDTH, HEIGHT);g.setColor(c);move();x=wx;y=wy;color=c;}else if(direction==Direction.RIGHT){ ImageIcon icon=new ImageIcon(“tank_you.gif”);Image enemytankImage=icon.getImage();x+=xspeed;if(x>=800-WIDTH)x=800-WIDTH;}else if(direction==Direction.DOWN){ ImageIcon icon=new ImageIcon(“tank_xia.gif”);Image enemytankImage=icon.getImage();y+=yspeed;if(y>=600-HEIGHT)y=600-HEIGHT;}else if(direction==Direction.LEFT){ ImageIcon icon=new ImageIcon(“tank_zuo.gif”); } } } Image enemytankImage=icon.getImage();x-=xspeed;if(x<=0)x=0;@Override public void fire(){ tm.shells.add(new Shell(this.x+WIDTH/2,this.y+HEIGHT/2,this.direction,tm,Color.BLUE} public Rectangle getRec(){ } return new Rectangle(this.x,this.y,this.WIDTH,this.HEIGHT);,false));Blood类: public class Blood { public final int WIDTH=30,HEIGHT=30;public int x= new Random().nextInt(770),y= new Random().nextInt(570);TankMap tm;{ } public boolean bloodb(Tank t){ if(t.isLive&&this.getRec().intersects(t.getRec())){ if(t.getLife()<=60){ } else { System.out.println(“blood up”);t.setLife(100);System.out.println(“恭喜你,补血啦啦啦!”);t.setLife(t.getLife()+40);tm.bloods.remove(this); ImageIcon icon=new ImageIcon(“blood.JPG”);Image tankImage=icon.getImage();g.drawImage(tankImage,x,y,null);public void draw(Graphics g) } } } } tm.bloods.remove(this);return false;public Rectangle getRec(){ } return new Rectangle(this.x,this.y,this.WIDTH,this.HEIGHT);Shell类: public class Shell { public final int WIDTH=5,HEIGHT=5,xspeed=8,yspeed=8;public int x,y;Direction dir = Direction.STOP;public boolean islive=true;TankMap tm=null;Color color=Color.RED;boolean isgood=true;boolean isLive=true;//构造方法 public Shell(){} public Shell(int xd,int yd,Direction d,TankMap t){ } public Shell(int xd,int yd,Direction d,TankMap t,Color c,boolean g){ } public void draw(Graphics g){ if(islive){ Color c = g.getColor();g.setColor(color);g.fillOval(x,y,WIDTH,HEIGHT);g.setColor(c);move(dir);x=xd;y=yd;dir=d;tm=t;color=c;isgood=g;x=xd;y=yd;dir=d;tm=t;}else{ } } tm.shells.remove(this);public void move(Direction d){ } public Rectangle getRec(){ } public boolean hitTank(Tank t){ if(this.isLive&&t.isLive&&this.getRec().intersects(t.getRec())){/return new Rectangle(this.x,this.y,this.WIDTH,this.HEIGHT);if(d==Direction.UP){ } y-=yspeed;if(y<=0)islive=false;}else if(d==Direction.RIGHT){ x+=xspeed;if(x>=800)islive=false;}else if(d==Direction.DOWN){ y+=yspeed;if(y>=600)islive=false;}else if(d==Direction.LEFT){ x-=xspeed;if(x<0)islive=false;/用户坦克生命值减20 t.setLife(t.getLife()-20); } public boolean hitTanks(List } return false;if(t.getLife()<=0){ } this.islive=false;Explor e=new Explor(x-3,y-3,this.tm);tm.explors.add(e);return true;t.setLive(false);t.direction=Direction.STOP;JOptionPane.showMessageDialog(tm, “Game Over!”);System.exit(0); } } EnemyTank e;for(int i=0;i } return false;e = enemyTanks.get(i);if(this.getRec().intersects(e.getRec())){ } System.out.println(“hittanks”);e.setLive(false);tm.enemys.remove(e);this.islive=false;Explor ex=new Explor(x-3,y-3,this.tm);tm.explors.add(ex);return true;过程收获 这已经是本学期第二个小程序了,有了第一份的基础,做第二次的时候明显熟练的很多,效率比之前也提高了很多,求助老师与同学也少了许多,基本可以独自完成坦克大战这一小游戏 可能是收以前学习的知识影响吧,在刚刚学习的时候总摆脱不了思维定势的阴影,总是找不到感觉,老师讲的都会,可到自己写的时候却完全无从下手,“难道我真的一无是处,什么都做不了?”,我已经近乎崩溃了,或许是我的性格原因吧,很快我就说服自己,走出了阴霾,我想起曾听一位说过的话:我的天资愚钝,也许别人花一天就能做完的事我肯能要话十天,但我知道,我花一天去做一件事永远没有花十天时间做的好,那样也就永远赶不上别人。所以我不停的看老师的代码,不停的问助教老师,就这样不厌其烦的,有了长足的进步。 java体系知识点很多,很多东西是要记忆的,可能会学了后面忘了前面,所以,一定要有“一百万次理论”的实践,那样没有什么事是做不好的。这又将是我人生的一笔弥足珍贵的财富,我相信这绝不是一笔意外的财富。在java学习过程中出现的不足,在学习中由于为了追求学得快,导致敲的代码很少,所以很多的知识都不牢固,很容易忘记,每当提到有关的问题是只知道但很难解决;需要通过很多时间去查资料。这样让我导致出现了不自信和有了不乐意敲代码想法。所以我们学编程的要想满足别人的要求,必须先满足自己,多敲代码,让自己有实力有信心。 学生签名: 日期:2014年4月15日 坦克大战 一.教学目标:学习新的形状——六边形,并运用六边形进行绘画。二.教学准备:8开素描纸、油性笔、油画棒。三.教学重点: 重点:运用六边形进行绘画。 难点:颜色的搭配与填涂。 四.教学过程: (一)导言:直接揭开主题并板书。 (二)新课教授: 1、老师先在黑板上画出六边形,并向学生讲解六边形是将长方形的四个角裁掉而得来的。 2、示范: ①用油性笔的左边画上一个扁扁的六边形。在这个六边形上面画一个小一点的六边 形,坦克的样子就出来了。接着再给坦克加上一个盖子,还有炮筒。最后再在大的六边形 里面画出一些图形,作为轮子,将坦克的履带部分画完整。用同样的方法再在右边画出另 一辆坦克。 ②上色。用油画棒将坦克和背景都涂上颜色。颜色要涂均匀些。 (三)作业布置:完成一幅以坦克为主题的图画。 五、小结:作品展示,相互欣赏,教师引导评价。 坦克大战 明阳天下拓展 项目简介 团队的所有成员在规定的时间和规则的约束下,进行角色分配后,蒙上双眼依次进入模拟战场,在躲避地雷的同时用炮弹尽可能的击中对手,最终战场剩余人数最多的小组获胜。 项目规则 1、每队队员同时蒙眼进入雷区,听由场外队员指挥捡炮弹,中途如有触碰地雷,该队员视为中弹身亡,由下一名队员顶替; 2、场内队员蒙眼听从场外队员的指挥,捡起炮弹,击中对方队员身体任意部位,即可淘汰对方队员继续存活; 3、场外队员只能在限定的区域内活动,不可触发到其他组的区域; 4、最后场外留有人数最多组获胜。 项目目标 有效沟通,战略与决策,在特殊的情况下如何和其他学员进行有效沟通; 团队的力量如何发挥才能体现最大的力量; 怎样才能是更合理的指挥方式; 默契程度和信任度的考验。 北京明阳天下拓展培训机构是国内体验培训领域的“黄埔军校”。在体验式培训、户外教育理论、专项主题研究、软件实操开发等软件设施方面已走在行业前列;而硬件拓展设备、拓展器材、拓展设施设计建造和大型独资实操基地等硬件设施方面同样领先全国。强大的课程研发队伍,与国际接轨的先进培训理念,完善的硬件设备,优越的服务意识,明阳天下拓展始终秉承“专业致胜,效果为王”的理念,为成千上万的客户打造专业化、高标准的拓展培训方案。 实习报告 学 校:学院:专业班级:学号:姓名: 中南大学 信息科学与工程信息安全0801 0909080910 李亨 实习单位:湖南省软件评测中心 实习内容:C++游戏开发 实习时间:2011.9.21-2011.9.9 实习心得体会: 一转眼为期3个星期的实习生活过去了,现在又开始了紧张的学校生活。回想自己的实习经历,感觉自己真的收获不少。明年这个时候,我们就已经离开校园,去社会上去打拼了。最大的心愿就是好好把握校园里的生活,尽量多的学习知识本领,为以后的工作做足够的储备。而学校为我们组织安排的实习,恰恰满足了我们的需求,为我们提供了很好的锻炼机会,使我们能充分有效的利用时间去时间锻炼。真心感谢学校!! 实习的过程虽然有些辛苦,学校跟实习单位的距离还算是蛮远的,每天花在公交车上的时间大概有2个小时,而且每天都要一直呆在机房里面编程序和听课。但是,令人欣慰的是,我们从短短3个星期的实习中,发现了很多自身的问题和不足,特别是专业知识上的匮乏,以及遇到编程问题时候的解决思路与方法。只有通过不断的实践才能知道自己水平的高低。有付出才会有收获!实习单位的老师给人的印象非常好,他们总是不厌其烦的为我们答疑,细心的向我们传授各种专业知识,耐心的给我们做专业的指导。更为重要的是,他们还为告诉我们一些从业经验和做人的道理。 记得有位老师“咬文嚼字”的为我们分析了“赢”字的含义,上面的“亡”代表死亡,告诫我们要有死亡来临的危机感;“口”代表口才,一个人必须要有一定的口才,这样才能立于不败之地;“月”代表时间,一寸光阴一寸金,寸金难买寸光阴,这让我们懂得时间的宝贵性,不要蹉跎岁月,浪费宝贵的青春;“贝”代表金钱,金钱不是万能的,但没有金钱是万万不能的,人必须驾驭于金钱之上,学会理财,懂得挣钱和花钱;“凡”表示着一颗平凡的心,高调做事,低调做人,时刻保持的谦卑平凡的态度,此所谓“满招损,谦受益”也。 实习期间,我们的主要内容就是C++的游戏开发,以前从未做过游戏开发,对游戏的引擎知识从未有过了解,老师认真细致的向我们讲解了引擎的知识,从简到难,逐步带领我们进入游戏开发的领域。由于时间有限,我们只能做那种简单的单机游戏,互联网的游戏由于涉及到网络模块,需要花费更多的时间跟精力,所以我们主要的研究方向就是2D单机游戏。游戏开发都是分组完成,每个小组都是4到6个人,我们这组是6个成员。我们选择的项目是《坦克大战》。《坦克大战》(Battle City)是一款经典的老游戏了。是1985年日本南梦宫Namco游戏公司任天堂FC平台上,推出的一款多方位平面射击游戏。游戏以坦克战斗及保卫基地为主题,属于策略型联机类。同时也是FC平台上少有的内建关卡编辑器的几个游戏之一,玩家可自己创建独特的关卡,并通过获取一些道具使坦克和基地得到强化。 开发组长管理编程、代码审查、单元测试、集成测试、缺陷管理 与改错等活动。 开发人员依据计划编写代码,并对自己的代码进行必要的审查和 测试。 开发人员依据计划审查、测试同伴的代码。 我们分工明细之后,开始了各自模块的工作。我要完成的任务是地图的设计和障碍物的设计。其中涉及到图片的加载,类的一些继承知识,总体来说算是简单。完成自己的内容之后,我还协助组长完成总体框架的设计。 将游戏画面底部作为一条数轴,划分为22个部分。玩家输入射击仰角N,根据仰角N的不同,出现不同的爆炸效果(包括击中对方获胜)。程序给出一个随机数M,作为敌对坦克的设计仰角,根据仰角M,出现不同的爆炸效果(包括击中玩家致使玩家失败)。 功能函数设计: 1.不同的效果画面,包括背景颜色的输出。 2.请玩家输入设计仰角。 3.爆炸效果的判断以及调用相应的子函数。 4.判断胜负,并输出相对应的效果画面。 5.游戏未分胜负时进行循环。 函数调用流程 1.调用开头画面子函数 2.调用主要背景画面函数 3.根据玩家射击仰角调用对应的爆炸画面子函数 4.根据随机给出的射击仰角调用对应的敌对的爆炸画面的子函数 这次实习让我受益匪浅。 刚开始做这个坦克设计游戏程序的时候,不知道从何入手,后来经过仔细考虑后,画了程序设计分析图,把游戏的功能、流程和要求等罗列出来,程序才渐渐明晰起来,导致经常漏了一些必要的步骤没有编写出来。重新安排好位置,使分配合理之后,整个程序需的结构一目了然。使得编写也变得很轻松。在最后的调试中,由于镶嵌了一些小功能的程序语句,使得编写出现了错误,个别功能没有实现,但是由于程序结构的清晰,错误很快就找了出来,并给予更改。所以我认为一个清晰明了的程序结构很重要。这也为我以后自己做程序项目打下了基础,而其积累了不少程序设计的经验。以后还要继续加强专业知识的积累!!第三篇:1情境描写—坦克大战
第四篇:拓展项目——坦克大战
第五篇:计算机实习报告(坦克大战C++开发)