本系列教程通過「坦克大戰」遊戲的五個迭代版本,系統講解 Java 基礎與多線程核心知識。代碼覆蓋 Swing 圖形界面、鍵盤事件監聽、線程同步、集合框架、文件持久化等實戰技能,適合有一定 Java 基礎但缺乏項目經驗的開發者。
JFrame + JPanel 繪圖架構paint(Graphics g) 重繪機制KeyListener 鍵盤事件處理Tank → Heroclass MyPanel extends JPanel {
Hero hero = new Hero(100, 100);
public void paint(Graphics g) {
super.paint(g);
g.fillRect(0, 0, 800, 600);
drawTank(hero.getX(), hero.getY(), g, 0, 0);
}
void drawTank(int x, int y, Graphics g, int direct, int type) {
// 根據 type 設置顏色,根據 direct 繪製四個方向坦克
}
}
Runnable 實現子彈飛行線程Runnable 實現定時重繪class MyPanel extends JPanel implements KeyListener, Runnable {
Vector<EnemyTank> ets = new Vector<>();
public void run() {
while (true) {
Thread.sleep(100);
repaint(); // 定時觸發重繪
}
}
// 子彈類實現 Runnable,獨立線程控制飛行軌跡
class Shot implements Runnable { /* ... */ }
}
hitTank())isLive 狀態標記Vector 動態管理子彈集合,死對象及時移除void hitTank(Shot s, EnemyTank et) {
switch (et.direct) {
case 0: case 2: // 上/下
if (s.x > et.x && s.x < et.x+20 && s.y > et.y && s.y < et.y+30) {
s.isLive = false; et.isLive = false;
}
break;
case 1: case 3: // 左/右
if (s.x > et.x && s.x < et.x+30 && s.y > et.y && s.y < et.y+20) {
s.isLive = false; et.isLive = false;
}
}
}
EnemyTank implements Runnable)Bomb 類 + 多幀圖片切換)class EnemyTank extends Tank implements Runnable {
public void run() {
while (true) {
// 隨機方向移動、邊界檢測、碰撞避讓
// 定概率發射子彈
if (Math.random() > 0.75 && ss.size() < 5) { /* 發射 */ }
if (!isLive) break;
}
}
boolean isTouchOtherEnemy() { /* 矩形碰撞檢測 */ }
}
Recorder 類管理敵方數量、我方生命、總戰果BufferedReader/Writer 實現遊戲狀態序列化(坐標、方向、類型)ImageIO.read() 替代 Toolkit 獲取圖片et.getClass() == EnemyTank.class// myRecording.txt
總擊殺數
敵方坦克1_x 敵方坦克1_y 方向 0
敵方坦克2_x 敵方坦克2_y 方向 0
我方坦克_x 我方坦克_y 方向 1
建議配合韓順平 Java 教程視頻學習,邊敲代碼邊分析線程交互、鎖機制、集合選型等細節。五個版本代碼均含詳細註釋,可作為 Java 基礎到實戰的完整遷移教材。