運用 Java 集合、Swing GUI、多線程等核心知識點,從零構建一款經典的「坦克大戰」遊戲。專案包含五大核心類別,展示遊戲開發的基礎架構思維。
| 類別 | 核心職責 |
|---|---|
TankClient | 主視窗、遊戲迴圈、雙緩衝繪圖、鍵盤監聽、物件容器管理 |
Tank | 坦克實體(我方/敵方)、移動邏輯、發射子彈、碰撞檢測、血量管理、復活 |
Missile | 子彈實體、飛行軌跡、擊中坦克/牆壁判斷、爆炸觸發 |
Wall | 障礙物實體、矩形邊界提供碰撞檢測 |
Explode, Blood | 特效與道具:爆炸動畫、補血包隨機生成與拾取 |
Tank 建構子接收 boolean good 參數:true 為我方(紅色),false 為敵方(藍色)。draw() 依此切換顏色,並繪製砲管方向指示線。
KeyMonitor 監聽 WASD/方向鍵,透過四個布林旗標 bL/bU/bR/bD 合成八個方向枚舉 Direction,每幀更新座標。move() 內建隨機邏輯:每 step 幀隨機換向,step = random(3~14),並以機率 random(40)>30 觸發開火。按鍵 Z 觸發 fire(),依當前砲管方向 ptDir、坦克中心座標建立 Missile 加入 missiles 集合。Missile.move() 每幀更新座標,超出邊界自動標記 live=false 並在集合中移除。
所有實體實作 getRect() 回傳 Rectangle。每幀繪製時兩兩檢測:
Tank.hitWall(Wall)、Tank.hitTanks(List<Tank>):碰撞則呼叫 stay() 回退上一幀座標。Missile.hitTank(Tank):敵我雙方子彈擊中對方坦克 → 坦克扣血/死亡、子彈消失、產生 Explode。Missile.hitWall(Wall):子彈擊中牆壁 → 子彈消失。Tank.eatBlood(Blood):我方坦克碰到補血包 → 血量回滿、補血包消失。// TankClient.update()
Image offScreen = createImage(GAME_WIDTH, GAME_HEIGTH);
Graphics gOff = offScreen.getGraphics();
gOff.setColor(Color.GREEN);
gOff.fillRect(0, 0, GAME_WIDTH, GAME_HEIGTH);
paint(gOff); // 所有繪圖操作導向離屏圖片
g.drawImage(offScreen, 0, 0, null); // 一次性貼上螢幕
new Thread(() -> {
while (true) {
repaint(); // 觸發 update -> paint
Thread.sleep(50); // ~20 FPS
}
}).start();
F2:我方坦克復活(滿血)F3:敵方坦克補充(最多 20 輛)A:超級散彈(八方向齊發)Q:我方滿血E:釋放補血包R:我方位置重置List 動態增減,遍歷時安全移除死亡物件。這個坦克大戰雖屬教學級專案,但完整展示了遊戲核心架構:主迴圈、實體管理、輸入處理、碰撞系統、渲染管線。原始碼註解詳盡,適合 Java 進階學習者研讀、修改並延伸為更豐富的遊戲專案。