第一篇:計算機實習報告(坦克大戰C++開發)
實習報告
學
校:學院:專業班級:學號:姓名:
中南大學
信息科學與工程信息安全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.根據隨機給出的射擊仰角調用對應的敵對的爆炸畫面的子函數
這次實習讓我受益匪淺。
剛開始做這個坦克設計游戲程序的時候,不知道從何入手,后來經過仔細考慮后,畫了程序設計分析圖,把游戲的功能、流程和要求等羅列出來,程序才漸漸明晰起來,導致經常漏了一些必要的步驟沒有編寫出來。重新安排好位置,使分配合理之后,整個程序需的結構一目了然。使得編寫也變得很輕松。在最后的調試中,由于鑲嵌了一些小功能的程序語句,使得編寫出現了錯誤,個別功能沒有實現,但是由于程序結構的清晰,錯誤很快就找了出來,并給予更改。所以我認為一個清晰明了的程序結構很重要。這也為我以后自己做程序項目打下了基礎,而其積累了不少程序設計的經驗。以后還要繼續加強專業知識的積累!!
第二篇:坦克大戰大報告
大作業題目:坦克大戰程序
一、需求分析
功能需求
坦克大戰其中包括對主戰坦克的編寫、坦克的初始位置的編寫、坦克的移動方向的編寫、坦克的速度的編寫、坦克的子彈速度的編寫、敵軍的子彈速度的編寫、設置游戲難度的編寫、子彈的編寫、敵軍坦克的編寫、構造函數的編寫,初始化敵軍坦克的位置和狀態的編寫、鍵盤控制坦克的移動的編寫、發彈的編寫、判斷是否被擊中的編寫、判斷是否擊中敵軍的編寫等。通過上下左右鍵進行對坦克的移動,通過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.展現出一個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.總是感覺面向對象過程中,對象的確定和方法的確定很靈活、可以說不同的人有不同的看法,那么什么樣的設計才是完美,最優的方案呢? 坦克大戰 明陽天下拓展 項目簡介 團隊的所有成員在規定的時間和規則的約束下,進行角色分配后,蒙上雙眼依次進入模擬戰場,在躲避地雷的同時用炮彈盡可能的擊中對手,最終戰場剩余人數最多的小組獲勝。 項目規則 1、每隊隊員同時蒙眼進入雷區,聽由場外隊員指揮撿炮彈,中途如有觸碰地雷,該隊員視為中彈身亡,由下一名隊員頂替; 2、場內隊員蒙眼聽從場外隊員的指揮,撿起炮彈,擊中對方隊員身體任意部位,即可淘汰對方隊員繼續存活; 3、場外隊員只能在限定的區域內活動,不可觸發到其他組的區域; 4、最后場外留有人數最多組獲勝。 項目目標 有效溝通,戰略與決策,在特殊的情況下如何和其他學員進行有效溝通; 團隊的力量如何發揮才能體現最大的力量; 怎樣才能是更合理的指揮方式; 默契程度和信任度的考驗。 北京明陽天下拓展培訓機構是國內體驗培訓領域的“黃埔軍校”。在體驗式培訓、戶外教育理論、專項主題研究、軟件實操開發等軟件設施方面已走在行業前列;而硬件拓展設備、拓展器材、拓展設施設計建造和大型獨資實操基地等硬件設施方面同樣領先全國。強大的課程研發隊伍,與國際接軌的先進培訓理念,完善的硬件設備,優越的服務意識,明陽天下拓展始終秉承“專業致勝,效果為王”的理念,為成千上萬的客戶打造專業化、高標準的拓展培訓方案。第三篇:1情境描寫—坦克大戰
第四篇:坦克大戰迭代式需求分析
第五篇:拓展項目——坦克大戰