本文帶領讀者從零開始,使用 Java Swing 建立一款經典的「狩獵射擊」小遊戲。遊戲畫面包含會飛行的鳥與跑動的豬,玩家透過滑鼠點擊射擊,命中加分,彈藥有限需裝填,錯過目標會扣分。完整原始碼包含背景面板、遊戲角色、主視窗與執行緒控制,適合作為 Swing 入門實戰專案。
JPanel,負責繪製背景圖片。JLabel 並實作 Runnable,代表從右向左飛行的鳥,支援滑鼠點擊擊中邏輯。JLabel 並實作 Runnable,代表從左向右奔跑的豬,同樣支援點擊互動。JFrame,遊戲主視窗,管理分數、彈藥、角色生成執行緒與全域滑鼠事件。BackgroundPanel 覆寫 paintComponent(Graphics g),利用 drawImage 將背景圖拉伸填滿面板,並設定 setOpaque(false) 避免重繪閃爍。
BirdLabel 與 PigLabel 各自持有一個 Thread,在 run() 中透過 setLocation(x, y) 更新位置,並以隨機 sleepTime 控制速度,模擬自然移動。執行緒啟動觸發條件為 ComponentListener.componentResized,確保父容器尺寸就緒後再開始移動。
MouseAdapter,mousePressed 時檢查 MainFrame.readyAmmo(),若有彈藥則呼叫 useAmmo() 扣減並加分,最後呼叫 destory() 從面板移除自身。分數 score 與彈藥數 ammoNum 宣告為 static,並提供 synchronized static 方法 appScore()、useAmmo()、readyAmmo() 確保多執行緒存取安全。
MainFrame 內部類別 BirdThread、PigThread 以無限迴圈定期 new BirdLabel()/new PigLabel() 加入背景面板,間隔時間隨機 500~3500ms,形成持續湧現的遊戲節奏。
package Game;
// BackgroundPanel.java
public class BackgroundPanel extends JPanel { ... }
// BirdLabel.java
public class BirdLabel extends JLabel implements Runnable { ... }
// PigLabel.java
public class PigLabel extends JLabel implements Runnable { ... }
// MainFrame.java
public class MainFrame extends JFrame {
// 靜態分數、彈藥、UI 元件
// 建構子初始化視窗、背景、標籤、滑鼠監聽
// 靜態同步方法:appScore, useAmmo, readyAmmo
// 內部執行緒類別:BirdThread, PigThread
// main 啟動入口
}
background.jpg、bird.gif、pig.gif)放在 Game 套件同層級目錄。MainFrame.main() 啟動遊戲。這個小專案展示了 Swing 元件繼承、自定繪製、多執行緒動畫、事件驅動與共享狀態同步等核心 GUI 程式設計技巧。程式碼結構清晰,適合初學者研讀並作為更複雜遊戲開發的起點。