首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Swing 經典坦克大戰遊戲完整原始碼與架構解析

     編輯:Java 相關知識

專案概覽

運用 Java 集合、Swing GUI、多線程等核心知識點,從零構建一款經典的「坦克大戰」遊戲。專案包含五大核心類別,展示遊戲開發的基礎架構思維。

核心類別職責劃分

類別核心職責
TankClient主視窗、遊戲迴圈、雙緩衝繪圖、鍵盤監聽、物件容器管理
Tank坦克實體(我方/敵方)、移動邏輯、發射子彈、碰撞檢測、血量管理、復活
Missile子彈實體、飛行軌跡、擊中坦克/牆壁判斷、爆炸觸發
Wall障礙物實體、矩形邊界提供碰撞檢測
Explode, Blood特效與道具:爆炸動畫、補血包隨機生成與拾取

關鍵機制深度解析

1. 陣營區分與繪製

Tank 建構子接收 boolean good 參數:true 為我方(紅色),false 為敵方(藍色)。draw() 依此切換顏色,並繪製砲管方向指示線。

2. 移動控制:鍵盤 vs 隨機 AI

  • 我方: KeyMonitor 監聽 WASD/方向鍵,透過四個布林旗標 bL/bU/bR/bD 合成八個方向枚舉 Direction,每幀更新座標。
  • 敵方: move() 內建隨機邏輯:每 step 幀隨機換向,step = random(3~14),並以機率 random(40)>30 觸發開火。

3. 子彈發射與生命週期

按鍵 Z 觸發 fire(),依當前砲管方向 ptDir、坦克中心座標建立 Missile 加入 missiles 集合。Missile.move() 每幀更新座標,超出邊界自動標記 live=false 並在集合中移除。

4. 碰撞檢測機制:矩形相交

所有實體實作 getRect() 回傳 Rectangle。每幀繪製時兩兩檢測:

  • Tank.hitWall(Wall)、Tank.hitTanks(List<Tank>):碰撞則呼叫 stay() 回退上一幀座標。
  • Missile.hitTank(Tank):敵我雙方子彈擊中對方坦克 → 坦克扣血/死亡、子彈消失、產生 Explode。
  • Missile.hitWall(Wall):子彈擊中牆壁 → 子彈消失。
  • Tank.eatBlood(Blood):我方坦克碰到補血包 → 血量回滿、補血包消失。

5. 雙緩衝繪圖消除閃爍

// 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); // 一次性貼上螢幕

6. 遊戲迴圈:固定時間步長

new Thread(() -> {
    while (true) {
        repaint(); // 觸發 update -> paint
        Thread.sleep(50); // ~20 FPS
    }
}).start();

擴充功能熱鍵

  • F2:我方坦克復活(滿血)
  • F3:敵方坦克補充(最多 20 輛)
  • A:超級散彈(八方向齊發)
  • Q:我方滿血
  • E:釋放補血包
  • R:我方位置重置

程式碼結構亮點

  • 單一職責: 每類專注自身繪圖、移動、碰撞邏輯。
  • 集合管理: 子彈、敵坦克、爆炸特效皆以 List 動態增減,遍歷時安全移除死亡物件。
  • 可擴充性: 新增道具、敵人類型、關卡機制只需擴充現有類別或新增子類。

總結

這個坦克大戰雖屬教學級專案,但完整展示了遊戲核心架構:主迴圈、實體管理、輸入處理、碰撞系統、渲染管線。原始碼註解詳盡,適合 Java 進階學習者研讀、修改並延伸為更豐富的遊戲專案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved