第一篇:坦克大戰(zhàn)大報告
大作業(yè)題目:坦克大戰(zhàn)程序
一、需求分析
功能需求
坦克大戰(zhàn)其中包括對主戰(zhàn)坦克的編寫、坦克的初始位置的編寫、坦克的移動方向的編寫、坦克的速度的編寫、坦克的子彈速度的編寫、敵軍的子彈速度的編寫、設(shè)置游戲難度的編寫、子彈的編寫、敵軍坦克的編寫、構(gòu)造函數(shù)的編寫,初始化敵軍坦克的位置和狀態(tài)的編寫、鍵盤控制坦克的移動的編寫、發(fā)彈的編寫、判斷是否被擊中的編寫、判斷是否擊中敵軍的編寫等。通過上下左右鍵進(jìn)行對坦克的移動,通過F鍵發(fā)射子彈,其它坦克可以隨機(jī)移動。構(gòu)造主窗口中所需要的類,并將坦克加到窗口中,實(shí)現(xiàn)坦克的四個方向的移動并創(chuàng)建炮彈類,并讓屏幕中的坦克能發(fā)射炮彈,讓坦克可以朝對方信息統(tǒng)計功能,在游戲界面左上角,顯示當(dāng)前屏幕子彈數(shù)。.(1)、我方坦克,形狀為一輛坦克圖片,和坦克的移動方向保持一致。根據(jù)鍵盤的方向鍵,坦克的移動方向分為上、下、左、右。當(dāng)按住F鍵的時候,能夠發(fā)送炮彈,多次按鍵,多次發(fā)送。坦克有血量,滿血為100,每次被擊中,都會掉血10,直到0后,坦克死亡。(2)、敵軍坦克,形狀為一個黃色圓,移動為隨機(jī)移動,血量為當(dāng)被一發(fā)炮彈擊中的時候,立即死亡消失。(3)、補(bǔ)血包,當(dāng)我方坦克碰撞到補(bǔ)血包時,可補(bǔ)血,敵方坦克碰撞到時,穿過補(bǔ)血包,不會補(bǔ)血。補(bǔ)血包隨機(jī)出現(xiàn)。.(4)、碰撞:當(dāng)子彈碰撞坦克時,子彈消失。當(dāng)敵軍坦克碰撞到我方坦克時,相互穿過。當(dāng)子彈碰撞到墻壁時,子彈消失,不可穿透墻壁。當(dāng)坦克碰撞到坦克時,可穿越。當(dāng)坦克碰撞到四周的游戲界面時,不可走出游戲界面。
運(yùn)行需要
(1)數(shù)據(jù)精確性
在進(jìn)行存取款金額時,需求數(shù)據(jù)記錄定位精確,要求輸入數(shù)精確金額。(2)時間特性
系統(tǒng)要求用戶進(jìn)行相應(yīng)操作后系統(tǒng)的響應(yīng)時間應(yīng)盡量短,不能超過一定的時間范圍本設(shè) 計暫規(guī)定為1-2s。(3)適應(yīng)性
要求平臺具有很好的更新能力,平臺應(yīng)該能夠?qū)Σl(fā)事件,對于“不可靠”數(shù)據(jù)具有較強(qiáng)的識別處理能力。(4)可維護(hù)性
為滿足系統(tǒng)在以后運(yùn)行過程中出現(xiàn)問題能夠修正以及系統(tǒng)需要升級等要求,系統(tǒng)應(yīng)該具有可維護(hù)、可擴(kuò)充、可更新的性能。(6)兼容性適合
Windows2003及以上版本的操作系統(tǒng)。(7)安全性
系統(tǒng)運(yùn)行應(yīng)該滿足具有一定能夠避免黑客、病毒等惡意攻擊的安全防范措施。但相對如此簡單的平臺,應(yīng)考慮到這些東西。
二、類的設(shè)計
1、類的設(shè)計:
坦克大戰(zhàn)游戲主要涉及到的對象有地圖、坦克、炮彈、血包。因此,整個系統(tǒng)的功能可以由以下幾個類完成:
TankMap類: 此類主要功能是利用java中AWT包來實(shí)現(xiàn)坦克游戲的主窗口,以及對其他類的調(diào)用和實(shí)例化;游戲地圖的初始化,重繪地圖上的其他元素。
Blood類:此類主要是定義玩家坦克的生命值,有可以控制玩家坦克的加血等操作的方法。
Tank類:此類主要定義的是游戲中的坦克,可以實(shí)例化出玩家坦克,在此類中有坦克的移動,開火等方法。
EnemyTank類:此類主要定義的是游戲中的敵方坦克,可以實(shí)例化出敵方坦克,在此類中有敵方坦克的移動,開火等方法。
Shell類:此類主要定義的是游戲中的炮彈類,其中有炮彈的大小以及移動等因素。Explor類:此類定義的是坦克被攻擊后的爆炸,其中有坦克擊毀后爆炸的圖形變化。
2、方法的設(shè)計: TankMap類的方法:
init():初始化地圖以及地圖上的元素
paint():繪制地圖以及地圖上的元素
update():重繪地圖以及地圖上的元素
Main():程序入口,創(chuàng)建TankMap對象 Tank類的方法:
Move():按照指定的方向,實(shí)現(xiàn)坦克的移動
checkDirection():判斷用戶點(diǎn)擊的方向鍵,更新坦克運(yùn)動方向
Fire():當(dāng)用戶單擊F鍵時,發(fā)射炮彈
getRec():獲取坦克當(dāng)前所處位置的矩形
isLive():判斷坦克的生命值是否為0
setLife(int life):設(shè)定坦克生命值
Draw():在指定的地圖上繪制坦克
Tank():構(gòu)造方法,初始化坦克,指定坦克所在地圖 Shell類的方法:
Move():按照發(fā)射該炮彈的坦克的方向移動
getRec():獲取炮彈當(dāng)前所處位置的矩形
Draw():在指定地圖上繪制炮彈
hitTank():打擊指定坦克
Shell():構(gòu)造方法,初始化炮彈 Blood類的方法:
getRec():獲取血包當(dāng)前所處位置的矩形
Draw():在指定地圖上繪制血包
Blood():構(gòu)造方法,初始化血包
三、編碼實(shí)現(xiàn)及說明
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;//城墻數(shù) 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(“當(dāng)前炮彈數(shù)目:”+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(“恭喜你,補(bǔ)血啦啦啦!”);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;//構(gòu)造方法 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;過程收獲 這已經(jīng)是本學(xué)期第二個小程序了,有了第一份的基礎(chǔ),做第二次的時候明顯熟練的很多,效率比之前也提高了很多,求助老師與同學(xué)也少了許多,基本可以獨(dú)自完成坦克大戰(zhàn)這一小游戲 可能是收以前學(xué)習(xí)的知識影響吧,在剛剛學(xué)習(xí)的時候總擺脫不了思維定勢的陰影,總是找不到感覺,老師講的都會,可到自己寫的時候卻完全無從下手,“難道我真的一無是處,什么都做不了?”,我已經(jīng)近乎崩潰了,或許是我的性格原因吧,很快我就說服自己,走出了陰霾,我想起曾聽一位說過的話:我的天資愚鈍,也許別人花一天就能做完的事我肯能要話十天,但我知道,我花一天去做一件事永遠(yuǎn)沒有花十天時間做的好,那樣也就永遠(yuǎn)趕不上別人。所以我不停的看老師的代碼,不停的問助教老師,就這樣不厭其煩的,有了長足的進(jìn)步。 java體系知識點(diǎn)很多,很多東西是要記憶的,可能會學(xué)了后面忘了前面,所以,一定要有“一百萬次理論”的實(shí)踐,那樣沒有什么事是做不好的。這又將是我人生的一筆彌足珍貴的財富,我相信這絕不是一筆意外的財富。在java學(xué)習(xí)過程中出現(xiàn)的不足,在學(xué)習(xí)中由于為了追求學(xué)得快,導(dǎo)致敲的代碼很少,所以很多的知識都不牢固,很容易忘記,每當(dāng)提到有關(guān)的問題是只知道但很難解決;需要通過很多時間去查資料。這樣讓我導(dǎo)致出現(xiàn)了不自信和有了不樂意敲代碼想法。所以我們學(xué)編程的要想滿足別人的要求,必須先滿足自己,多敲代碼,讓自己有實(shí)力有信心。 學(xué)生簽名: 日期:2014年4月15日 坦克大戰(zhàn) 一.教學(xué)目標(biāo):學(xué)習(xí)新的形狀——六邊形,并運(yùn)用六邊形進(jìn)行繪畫。二.教學(xué)準(zhǔn)備:8開素描紙、油性筆、油畫棒。三.教學(xué)重點(diǎn): 重點(diǎn):運(yùn)用六邊形進(jìn)行繪畫。 難點(diǎn):顏色的搭配與填涂。 四.教學(xué)過程: (一)導(dǎo)言:直接揭開主題并板書。 (二)新課教授: 1、老師先在黑板上畫出六邊形,并向?qū)W生講解六邊形是將長方形的四個角裁掉而得來的。 2、示范: ①用油性筆的左邊畫上一個扁扁的六邊形。在這個六邊形上面畫一個小一點(diǎn)的六邊 形,坦克的樣子就出來了。接著再給坦克加上一個蓋子,還有炮筒。最后再在大的六邊形 里面畫出一些圖形,作為輪子,將坦克的履帶部分畫完整。用同樣的方法再在右邊畫出另 一輛坦克。 ②上色。用油畫棒將坦克和背景都涂上顏色。顏色要涂均勻些。 (三)作業(yè)布置:完成一幅以坦克為主題的圖畫。 五、小結(jié):作品展示,相互欣賞,教師引導(dǎo)評價。 實(shí)習(xí)報告 學(xué) 校:學(xué)院:專業(yè)班級:學(xué)號:姓名: 中南大學(xué) 信息科學(xué)與工程信息安全0801 0909080910 李亨 實(shí)習(xí)單位:湖南省軟件評測中心 實(shí)習(xí)內(nèi)容:C++游戲開發(fā) 實(shí)習(xí)時間:2011.9.21-2011.9.9 實(shí)習(xí)心得體會: 一轉(zhuǎn)眼為期3個星期的實(shí)習(xí)生活過去了,現(xiàn)在又開始了緊張的學(xué)校生活。回想自己的實(shí)習(xí)經(jīng)歷,感覺自己真的收獲不少。明年這個時候,我們就已經(jīng)離開校園,去社會上去打拼了。最大的心愿就是好好把握校園里的生活,盡量多的學(xué)習(xí)知識本領(lǐng),為以后的工作做足夠的儲備。而學(xué)校為我們組織安排的實(shí)習(xí),恰恰滿足了我們的需求,為我們提供了很好的鍛煉機(jī)會,使我們能充分有效的利用時間去時間鍛煉。真心感謝學(xué)校??! 實(shí)習(xí)的過程雖然有些辛苦,學(xué)校跟實(shí)習(xí)單位的距離還算是蠻遠(yuǎn)的,每天花在公交車上的時間大概有2個小時,而且每天都要一直呆在機(jī)房里面編程序和聽課。但是,令人欣慰的是,我們從短短3個星期的實(shí)習(xí)中,發(fā)現(xiàn)了很多自身的問題和不足,特別是專業(yè)知識上的匱乏,以及遇到編程問題時候的解決思路與方法。只有通過不斷的實(shí)踐才能知道自己水平的高低。有付出才會有收獲!實(shí)習(xí)單位的老師給人的印象非常好,他們總是不厭其煩的為我們答疑,細(xì)心的向我們傳授各種專業(yè)知識,耐心的給我們做專業(yè)的指導(dǎo)。更為重要的是,他們還為告訴我們一些從業(yè)經(jīng)驗(yàn)和做人的道理。 記得有位老師“咬文嚼字”的為我們分析了“贏”字的含義,上面的“亡”代表死亡,告誡我們要有死亡來臨的危機(jī)感;“口”代表口才,一個人必須要有一定的口才,這樣才能立于不敗之地;“月”代表時間,一寸光陰一寸金,寸金難買寸光陰,這讓我們懂得時間的寶貴性,不要蹉跎歲月,浪費(fèi)寶貴的青春;“貝”代表金錢,金錢不是萬能的,但沒有金錢是萬萬不能的,人必須駕馭于金錢之上,學(xué)會理財,懂得掙錢和花錢;“凡”表示著一顆平凡的心,高調(diào)做事,低調(diào)做人,時刻保持的謙卑平凡的態(tài)度,此所謂“滿招損,謙受益”也。 實(shí)習(xí)期間,我們的主要內(nèi)容就是C++的游戲開發(fā),以前從未做過游戲開發(fā),對游戲的引擎知識從未有過了解,老師認(rèn)真細(xì)致的向我們講解了引擎的知識,從簡到難,逐步帶領(lǐng)我們進(jìn)入游戲開發(fā)的領(lǐng)域。由于時間有限,我們只能做那種簡單的單機(jī)游戲,互聯(lián)網(wǎng)的游戲由于涉及到網(wǎng)絡(luò)模塊,需要花費(fèi)更多的時間跟精力,所以我們主要的研究方向就是2D單機(jī)游戲。游戲開發(fā)都是分組完成,每個小組都是4到6個人,我們這組是6個成員。我們選擇的項(xiàng)目是《坦克大戰(zhàn)》?!短箍舜髴?zhàn)》(Battle City)是一款經(jīng)典的老游戲了。是1985年日本南夢宮Namco游戲公司任天堂FC平臺上,推出的一款多方位平面射擊游戲。游戲以坦克戰(zhàn)斗及保衛(wèi)基地為主題,屬于策略型聯(lián)機(jī)類。同時也是FC平臺上少有的內(nèi)建關(guān)卡編輯器的幾個游戲之一,玩家可自己創(chuàng)建獨(dú)特的關(guān)卡,并通過獲取一些道具使坦克和基地得到強(qiáng)化。 ? 開發(fā)組長管理編程、代碼審查、單元測試、集成測試、缺陷管理 與改錯等活動。 ? 開發(fā)人員依據(jù)計劃編寫代碼,并對自己的代碼進(jìn)行必要的審查和 測試。 ? 開發(fā)人員依據(jù)計劃審查、測試同伴的代碼。 我們分工明細(xì)之后,開始了各自模塊的工作。我要完成的任務(wù)是地圖的設(shè)計和障礙物的設(shè)計。其中涉及到圖片的加載,類的一些繼承知識,總體來說算是簡單。完成自己的內(nèi)容之后,我還協(xié)助組長完成總體框架的設(shè)計。 將游戲畫面底部作為一條數(shù)軸,劃分為22個部分。玩家輸入射擊仰角N,根據(jù)仰角N的不同,出現(xiàn)不同的爆炸效果(包括擊中對方獲勝)。程序給出一個隨機(jī)數(shù)M,作為敵對坦克的設(shè)計仰角,根據(jù)仰角M,出現(xiàn)不同的爆炸效果(包括擊中玩家致使玩家失?。?。 功能函數(shù)設(shè)計: 1.不同的效果畫面,包括背景顏色的輸出。 2.請玩家輸入設(shè)計仰角。 3.爆炸效果的判斷以及調(diào)用相應(yīng)的子函數(shù)。 4.判斷勝負(fù),并輸出相對應(yīng)的效果畫面。 5.游戲未分勝負(fù)時進(jìn)行循環(huán)。 函數(shù)調(diào)用流程 1.調(diào)用開頭畫面子函數(shù) 2.調(diào)用主要背景畫面函數(shù) 3.根據(jù)玩家射擊仰角調(diào)用對應(yīng)的爆炸畫面子函數(shù) 4.根據(jù)隨機(jī)給出的射擊仰角調(diào)用對應(yīng)的敵對的爆炸畫面的子函數(shù) 這次實(shí)習(xí)讓我受益匪淺。 剛開始做這個坦克設(shè)計游戲程序的時候,不知道從何入手,后來經(jīng)過仔細(xì)考慮后,畫了程序設(shè)計分析圖,把游戲的功能、流程和要求等羅列出來,程序才漸漸明晰起來,導(dǎo)致經(jīng)常漏了一些必要的步驟沒有編寫出來。重新安排好位置,使分配合理之后,整個程序需的結(jié)構(gòu)一目了然。使得編寫也變得很輕松。在最后的調(diào)試中,由于鑲嵌了一些小功能的程序語句,使得編寫出現(xiàn)了錯誤,個別功能沒有實(shí)現(xiàn),但是由于程序結(jié)構(gòu)的清晰,錯誤很快就找了出來,并給予更改。所以我認(rèn)為一個清晰明了的程序結(jié)構(gòu)很重要。這也為我以后自己做程序項(xiàng)目打下了基礎(chǔ),而其積累了不少程序設(shè)計的經(jīng)驗(yàn)。以后還要繼續(xù)加強(qiáng)專業(yè)知識的積累??! 坦克大戰(zhàn) 動手寫一個練習(xí)項(xiàng)目: 一.系統(tǒng)分析: 需求分析: 啟動游戲后: 1.展現(xiàn)出一個800*600的游戲界面,游戲界面不可調(diào)整大小,游戲界面點(diǎn)擊右上角的紅叉后關(guān)閉。 2.信息統(tǒng)計功能,在游戲界面左上角,當(dāng)前屏幕子彈數(shù),當(dāng)前敵軍坦克數(shù)。 3.我方坦克,顏色為紅色,形狀為原型,具有一個炮筒,和坦克的移動方向保持一致。 根據(jù)鍵盤的方向鍵,坦克的移動方向分為左、左上、上、右上、右、右下、下、左下。 當(dāng)按住Ctrl鍵的時候,能夠發(fā)送炮彈,多次按鍵,多次發(fā)送。 坦克有血量,滿血為100,每次被擊中,都會掉血10,直到0后,坦克死亡,游戲結(jié)束。 4.敵軍坦克 形狀:原型 顏色:藍(lán)色 移動:隨機(jī)移動 血量:當(dāng)被一發(fā)炮彈擊中的時候,立即死亡消失。 5.碰撞 當(dāng)子彈碰撞坦克時,子彈消失。 當(dāng)敵軍坦克碰撞到我方坦克時,敵軍坦克消失。 當(dāng)子彈碰撞到墻壁時,子彈消失,不可穿透墻壁。 當(dāng)坦克碰撞到坦克時,不可穿越。 當(dāng)坦克碰撞到四周的游戲界面時,不可走出游戲界面。 二.系統(tǒng)設(shè)計 1.目錄規(guī)范: src/com/neusoft 下存放實(shí)體類。 涉及的類有: TankClient:游戲的主類,其中包含了坦克,子彈,墻壁 Tank:坦克類 Missile:炮彈類 2.命名規(guī)范: 類名:首字母大寫,駝峰標(biāo)識。表示動作,要采用動詞。方法名:首字母小寫,駝峰標(biāo)識。靜態(tài)變量:全部大寫 以上,命名簡單含義明確,要做到見名知意。 3.工具及其環(huán)境 采用MyEclipse6.5進(jìn)行開發(fā),JDK1.6,windows2003操作系統(tǒng)。 三.開發(fā)計劃 1.采用迭代式開發(fā) v1.完成游戲界面開發(fā),添加響應(yīng)事件,能夠關(guān)閉窗口。完成 完成 v2.我方坦克開發(fā),展現(xiàn)、移動。完成 v3.炮彈開發(fā),一枚炮彈從我方坦克發(fā)出,向屏幕下方飛去。完成 v4.按鍵發(fā)送炮彈,當(dāng)按住ctrl鍵的時候,炮彈才會發(fā)出去。完成 v5.炮筒開發(fā),隨著坦克的移動方向不同,炮筒的方向不同。完成 v6.基數(shù)統(tǒng)計,在主屏幕的左上角統(tǒng)計當(dāng)前游戲屏幕內(nèi)的炮彈數(shù)。完成 敵軍坦克開發(fā),敵軍坦克隨機(jī)移動,能夠發(fā)送炮彈。添加十輛坦克到游戲界面。v7.碰撞開發(fā),子彈碰到敵軍坦克時,坦克爆炸,消失,子彈消失。 v8.墻壁開發(fā),子彈遇到墻壁,消失,不可穿透,坦克遇到墻壁停止,調(diào)轉(zhuǎn)方向。v9.游戲細(xì)節(jié)限制,坦克之間不可穿越。我方坦克血條。游戲結(jié)束時候提示。 版本: MyProject_001_TankWar版本:完成v1、v2、v3、v4、v5功能。MyProject_002_TankWar版本: 1.修改子彈畫圖方法,由原來的Tank類中移動到TankClient類中,降低耦合度。 2.解決“java.util.ConcurrentModificationException”bug,使用Iterator迭代器對子彈的容器進(jìn)行迭代,并調(diào)用Iterator自身的remove方法,取代容器自身的方法。3.滿足v6、v7 MyProject_003_TankWar版本: 添加十輛坦克到游戲界面。敵軍坦克隨機(jī)移動,能夠發(fā)送炮彈。解決敵軍炮彈自殘的問題。解決邊界問題,坦克無法走出游戲邊界。MyProject_004_TankWar版本: 1.使我方坦克可以被攻擊,被攻擊后掉血,每次掉 十分之一,直到死亡。2.增加血條,初始狀態(tài)滿血,每被攻擊一次,就會掉十分之一的血。MyProject_004_TankWar版本: 計劃完成,一鍵重新開始游戲。游戲結(jié)束提示。坦克大招,隨機(jī)血包。 項(xiàng)目筆記: 雖然工作了幾年,沒有仔細(xì)學(xué)過JAVASE,所以總是感覺自己基礎(chǔ)薄弱,其中的原因有自身的因素,也有外界因素,在大公司沒辦法,可能一個方向就夠你干很多年,機(jī)會少。這是我第一個認(rèn)認(rèn)真真自己寫的項(xiàng)目。 得到的收獲: 1.面向?qū)ο笏枷?,分析問題域,定義對象、方法。 2.開發(fā)的階段性,之前我的做法一般都是瀑布式,說實(shí)在的卻是如書上所說郁悶,干的滿頭大汗,都三而竭了,還沒看到成績,難免垂頭喪氣,影響士氣。感覺到了原型法的好處,寫項(xiàng)目分版本,快速建立原型,在此基礎(chǔ)上逐漸豐富,很好的開發(fā)方式,值得使用。3.了解到了持有對方引用,這種模式,很好,降低了耦合,增強(qiáng)了內(nèi)聚。 心中迷惑: 1.低耦合、高內(nèi)聚,這個概念還是模糊,不知道合適的力度,類與類之間,耦合度多低算低呢?除了持有對方引用,還有其他的辦法降低耦合度么? 2.總是感覺面向?qū)ο筮^程中,對象的確定和方法的確定很靈活、可以說不同的人有不同的看法,那么什么樣的設(shè)計才是完美,最優(yōu)的方案呢? 坦克大戰(zhàn) 明陽天下拓展 項(xiàng)目簡介 團(tuán)隊(duì)的所有成員在規(guī)定的時間和規(guī)則的約束下,進(jìn)行角色分配后,蒙上雙眼依次進(jìn)入模擬戰(zhàn)場,在躲避地雷的同時用炮彈盡可能的擊中對手,最終戰(zhàn)場剩余人數(shù)最多的小組獲勝。 項(xiàng)目規(guī)則 1、每隊(duì)隊(duì)員同時蒙眼進(jìn)入雷區(qū),聽由場外隊(duì)員指揮撿炮彈,中途如有觸碰地雷,該隊(duì)員視為中彈身亡,由下一名隊(duì)員頂替; 2、場內(nèi)隊(duì)員蒙眼聽從場外隊(duì)員的指揮,撿起炮彈,擊中對方隊(duì)員身體任意部位,即可淘汰對方隊(duì)員繼續(xù)存活; 3、場外隊(duì)員只能在限定的區(qū)域內(nèi)活動,不可觸發(fā)到其他組的區(qū)域; 4、最后場外留有人數(shù)最多組獲勝。 項(xiàng)目目標(biāo) 有效溝通,戰(zhàn)略與決策,在特殊的情況下如何和其他學(xué)員進(jìn)行有效溝通; 團(tuán)隊(duì)的力量如何發(fā)揮才能體現(xiàn)最大的力量; 怎樣才能是更合理的指揮方式; 默契程度和信任度的考驗(yàn)。 北京明陽天下拓展培訓(xùn)機(jī)構(gòu)是國內(nèi)體驗(yàn)培訓(xùn)領(lǐng)域的“黃埔軍?!?。在體驗(yàn)式培訓(xùn)、戶外教育理論、專項(xiàng)主題研究、軟件實(shí)操開發(fā)等軟件設(shè)施方面已走在行業(yè)前列;而硬件拓展設(shè)備、拓展器材、拓展設(shè)施設(shè)計建造和大型獨(dú)資實(shí)操基地等硬件設(shè)施方面同樣領(lǐng)先全國。強(qiáng)大的課程研發(fā)隊(duì)伍,與國際接軌的先進(jìn)培訓(xùn)理念,完善的硬件設(shè)備,優(yōu)越的服務(wù)意識,明陽天下拓展始終秉承“專業(yè)致勝,效果為王”的理念,為成千上萬的客戶打造專業(yè)化、高標(biāo)準(zhǔn)的拓展培訓(xùn)方案。第二篇:1情境描寫—坦克大戰(zhàn)
第三篇:計算機(jī)實(shí)習(xí)報告(坦克大戰(zhàn)C++開發(fā))
第四篇:坦克大戰(zhàn)迭代式需求分析
第五篇:拓展項(xiàng)目——坦克大戰(zhàn)