注:這是馬老師講的坦克大戰的具體功能及其實現步驟,非常適合初學者剛學完java想根據需求練練手。
版本0
功能:
- 創建一個指定大小的窗口
掌握:
- 通過eclipse建立一個新的項目
- 爲新的項目指定不同的源代碼和輸出目錄
- 指定項目所用的版本
- 通過eclipse建立新的類
版本0.1
功能:
- 添加關閉窗口的事件
- 不允許窗口大小改變
掌握:
- 匿名類的用法(應用場合)
- 通eclipse重寫父類的方法
版本0.2
功能:
- 畫出代表坦克的實心圓
掌握:
- 如何重寫paint方法
版本0.3
功能:
- 讓坦克運動起來
步驟:
- 將位置改變爲變量;
- 啓動線程不斷重複畫;
- 每次重畫改變坦克位置
掌握:
- 內部類的使用(好處,什麼時候用)
- 可以方便的訪問包裝類的方法;不方便公開的,只爲包裝類服務的類應當定義爲內部類
版本0.31
功能:
- 使用雙緩衝消除閃爍現象
原因:
- 刷新重畫頻率太快,paint方法還沒完成
- 逐條顯示
解決:
- 將所有東西畫在虛擬圖片上,一次性顯示出來
版本0.4
功能:
- 代碼重構
步驟:
- 將以後可能需要多處改變的量定義爲常量
- 一般用public static final
- 常量名一般大寫
版本0.5
功能:
- 鍵盤控制坦克
步驟:
- 鍵盤監聽類KeyMonitor
- 內部類
- 注意:switch case語句的使用和break的運用
版本0.6——重要版本
功能:
- 將坦克單獨封裝成爲一個類
步驟:
- 建立Tank類
- 爲Tank類天界成員變量和構造方法
- 添加draw方法,使得Tank類可以單獨控制自己的畫法
- 添加Tank類處理按鍵的方法
- 根據Tank修改TankClient類
掌握:
- 面向對象的思想
- 細節隱藏,構建單獨的類,首先考慮系統中有哪些類
- 合適的方法應該出現在合適的類中
版本0.7——重要版本
功能:
- 讓坦克向8個方向走
步驟:
- 添加記錄按鍵狀態的布爾量
- 添加代表方向的量(使用枚舉)
- 根據按鍵狀態確定Tank的方向
- 方向進行下一步的移動(move)
版本0.8
功能:
- 讓坦克向8個方向走(2)
步驟:
- 處理鍵擡起的消息
- 修改TankClient相關代碼
版本0.9
功能:
- 添加子彈類
步驟:
- 添加Missile類
- 添加x,y,dir等屬性以及常量
- 添加構造方法
- 根據不同方向,進行不同的運動
- 在TankClient中模擬一顆子彈
注意:
- 不一定一次寫到位
- 進行多次試驗
- 將步驟分解開來逐一進行調試
版本1.0
功能:
- 根據主戰坦克的方向和位置,打出子彈
步驟:
- 增加對Ctrl鍵的按鍵處理
- 根據坦克打出一發子彈這個話,來確定Tank中的方法fire,其返回值爲Missle
- 根據Tank方向和位置設定子彈的方向和位置x、y出來,然後返回fire方法的實現
版本1.1
功能:
- 爲了解決坦克停下也能打出炮彈的問題——畫出炮筒
步驟:
- Tank類增加新的屬性ptDir
- 每次move後根據Tank新的方向確定炮筒的方向
- 將炮筒用直線的形式表示出來
版本1.2
功能:
- 打出多發炮彈
步驟:
- 使用容器裝炮彈
- 每當擡起ctrl鍵就網容器中加入新的炮彈
- 逐一畫出每一發炮彈
注意:
- 泛型的使用
- 將TankClient的實例傳遞到Tank中
- this的運用類的初始化過程
版本1.3
功能:
- 解決炮彈不消亡的問題
- 解決坦克出界的問題
步驟:
- 加入控制炮彈生死的量bLive(Missile)
- 當炮彈已經死去就不需要對其重畫
- 當炮彈死亡就從容器炒中去除
- 當炮彈飛出邊界就死亡
Debug的運用
- 一步一步跟蹤代碼
- 爲代碼設置斷點
- Step into和step over的概念
- 學會在運行過程中觀察變量的值
版本1.4
功能:
- 畫一輛敵人的坦克
步驟:
- 加入區別敵我的量good
- 根據敵我的不同設置不同的顏色
- 更新Tank的構造函數,加入good
- TanClient中new出敵人的坦克並畫出
版本1.5
功能:
- 將敵人的坦克擊斃
分析:
- 一顆子彈擊中敵人的坦克
步驟:
- Missile中加入hitTank(Tank)方法,返回布爾類型
- 碰撞檢測的輔助類Rectangle
- 爲Tank和Missile都加入getRect方法
- 當擊中敵人坦克時候,坦克被打死,子彈也死去
- 增加控制tank生死的量live
- 如果死去就不畫了
版本1.6
功能:
- 加入爆炸的感覺
步驟:
- 添加爆炸類(加入不同直徑的圓模擬爆炸,加入live,加入位置屬性,加入draw方法)
- 爆炸應該存在於集合類中(TankClient加入集合,將集合中的爆炸逐一畫出)
- 擊斃一輛坦克後應產生爆炸(hitTank是應產生爆炸,不能直接訪問爆炸集合,加入TankClient引用Missile類,當new Missile時候應該指定哪裏畫出哪個TankClient,修改Tank類fire方法,當new Missile時候將保存好的TankClient變量傳遞給Missile
版本1.7
功能:
- 添加多量坦克
步驟:
- 用容器類來裝敵人的Tank
- 向容器中裝入多輛敵人Tank
- 畫出來
- 運行,不能打掉(添加hitTanks方法,打一系列Tank,TankClient裏面每發子彈都打tanks)
版本1.8
功能:
- 讓敵方坦克更加智能
步驟:
- 讓敵方坦克動起來(構造方法中可以指定方向,new敵方坦克的時候指定敵方坦克的方向)
- 然敵方坦克向隨機方向移動(Tank是靜態的,添加隨機數產生器java.util.Random,move完成後如果是敵方坦克的隨機產生一個數,來設定坦克的下一個方向,Direction.values();)
- 讓敵方坦克向隨機方向移動隨機步數(添加變量,記錄隨機步數,當==0時,改變方向,否則知識隨機步數遞減)
- 讓敵方坦克發射炮彈(我方坦克炮彈不大我方坦克,炮彈添加好壞bGood,根據好壞畫不同顏色,修改炮彈的構造方法,修改Tank的fire方法,修改hitTank方法,好不能打好,壞不能打壞)
- 敵方炮火不能太猛烈
版本1.9
功能:
- 添加兩堵牆
步驟:
- 建立一個Wall類,建立Wall對象,畫出來
- 讓每一顆子彈打擊每一堵牆(hitWall()方法,子彈速度不能太快,否則容易穿過牆);
- 讓坦克不能穿過牆(記錄上一次的位置oldx,oldy,修改構造函數,每次move之前記錄上一次的位置,添加stay方法,記錄移動前的位置,當撞到時回到移動前的位置,當碰到牆的時候stay());
版本2.0
功能:
- 坦克不能相互穿越
步驟:
- 當坦克撞到Tank的時候stay();
版本2.1
功能:
- 超級炮彈
步驟:
- 處理按鍵A
版本2.2
功能:
- 主坦克的生命值
步驟:
- 加入fire變量
- 在窗口顯示生命值
版本2.3
功能:
- 圖形化表示主戰坦克的生命值
步驟:
- 根據不同的life值進行不同的顯示
版本2.4
功能:
- 添加血塊
步驟:
- 添加blood類
- 添加必要的方法
- 讓blood對象固定軌跡運動,並在一定時間後消失
版本2.5
功能:
- 敵人死光了重新加入
- 主戰坦克死了按F2開始復活