《坦克大戰》作為經典街機遊戲,承載了無數人的童年回憶。本文將深入解析如何運用 Java 集合框架、Swing 圖形界面、多線程等核心技術,從零構建一個功能完整的坦克大戰遊戲。無論你是 Java 初學者還是想鞏固 OOP 思想的開發者,這個專案都是絕佳的實戰練習。
遊戲採用經典的 MVC 思想:TankClient 作為主控制器,負責遊戲循環、畫面渲染與事件分發;Tank、Missile、Wall、Blood、Explode 分別封裝各自行為與繪製邏輯,實現高內聚低耦合。
在 Tank 類中引入 boolean good 標識陣營,構造時注入。繪製時根據該標識動態切換顏色(我方紅色、敵方藍色),並為我方坦克專門繪製血條(BloodBar 內部類),直觀展示生命值。
Direction),每幀根據方向更新座標。step 控制持續步數,dirs 數組隨機抽取方向,實現「隨機漫步」行為;並以 2.5% 概率隨機開火,增加不可預測性。按鍵觸發發射時,將炮口方向、坦克座標、陣營標識封裝為 Missile 物件加入 List<Missile> 集合。主迴圈每幀遍歷集合調用 draw(),子彈超出邊界或擊中目標即標記 live=false 並從集合移除,實現高效對象池模式。
所有實體統一實作 getRect() 返回 Rectangle 邊界盒。碰撞邏輯分層處理:
Tank:檢測牆壁、其他坦克碰撞,觸發 stay() 回退上一幀座標Missile:檢測牆壁(子彈消失)、敵我坦克(扣血/銷毀 + 生成爆炸特效)Blood:檢測我方坦克拾取,回滿血量並銷毀血包按 E 鍵觸發 Blood.fh() 在隨機位置重生血包;我方陣亡後按 F2 原地滿血復活,敵方按 F3 批量補充至 20 輛(自動避開牆壁),極大豐富遊戲策略深度。
PaintThread 線程每 50ms 調用 repaint() → update() → paint()。關鍵在 update() 中實現雙緩衝:創建離屏 Image,先在記憶體繪製完整幀,再一次性 drawImage 到螢幕,徹底消除閃爍。
| 類別 | 核心職責 |
|---|---|
TankClient | 主視窗、遊戲循環、鍵盤監聽、對象管理 |
Tank | 移動、開火、碰撞、血條、AI 行為 |
Missile | 飛行軌跡、邊界檢測、多目標碰撞 |
Wall | 靜態阻擋物,提供矩形邊界 |
Explode | 16 幀直徑漸變動畫,自動清理 |
Blood | 隨機重生、拾取判定 |
AudioClip)增強沉浸感完整原始碼已在文中給出(TankClient.java、Tank.java、Missile.java、Wall.java、Explode.java、Blood.java),建議下載後在 IDE 中逐行除錯,體會「邊寫邊跑」的成就感。這不只是一個遊戲,更是 Java 面向對象精髓的生動教材。