值此農曆新年來臨之際,祝願各位開發者:龍年行大運,代碼無 Bug,架構穩如磐石,薪資漲不停! 🧧
趁著年前整理硬碟,翻出多年收藏的 10 款 Java SE 小遊戲原始碼(基於 AWT Frame 或 Applet),均為國外技術部落格作者開源作品,經反編譯整理為 Eclipse 專案,無混淆、可直接閱讀修改。現打包分享,供初學者研習遊戲迴圈、碰撞檢測、雙重緩衝等核心技術。
| 遊戲名稱 | 類型 | 核心技術 | 學習價值 |
|---|---|---|---|
| 貪食蛇 | 經典街機 | 陣列佇列、鍵盤事件、定時器驅動 | 遊戲主迴圈、狀態機、身體跟隨邏輯 |
| 打磚塊 | 彈球類 | 矩形碰撞檢測、物理反射、磚塊陣列管理 | 碰撞偵測、向量反射、關卡資料結構 |
| 俄羅斯方塊 | 消除類 | 方塊旋轉矩陣、行消除演算法、下一塊預覽 | 矩陣變換、網格佔用檢查、分數系統 |
| 飛機大戰 | 射擊類 | 子彈池、敵機生成器、碰撞分組、血條顯示 | 物件池模式、波次設計、多型敵人行為 |
| 推箱子 | 解謎類 | 地圖陣列、BFS 可達性檢查、撤銷重做堆疊 | 狀態空間搜尋、關卡編輯器雛形 |
| 記憶翻牌 | 益智類 | 卡片隨機洗牌、翻開狀態機、配對邏輯 | 記憶遊戲核心邏輯、計時器、分數計算 |
| 五子棋 | 棋類對戰 | 棋盤陣列、勝負判定(四方向掃描)、AI 極小化極大 | 棋類 AI 基礎、啟發式評估函數 |
| 貪吃球 | 休閒類 | 圓形碰撞、食物生成、分身合併動畫 | 圓形幾何碰撞、平滑移動插值 |
| 簡易賽車 | 競速類 | 偽 3D 光柵渲染、彎道偏移算法、對手 AI | 軟體渲染管線、視角投影基礎 |
| 塔防雛形 | 策略類 | 路徑尋找(A*)、塔座升級、怪物波次腳本 | 塔防核心架構、導航網格、資源經濟 |
JavaGamesCollection/ ├── Snake/ # 貪食蛇 - Frame 架構 ├── Breakout/ # 打磚塊 - Applet 架構 ├── Tetris/ # 俄羅斯方塊 - 雙重緩衝優化 ├── PlaneWar/ # 飛機大戰 - 物件池模式 ├── Sokoban/ # 推箱子 - 關卡編輯器支援 ├── MemoryMatch/ # 記憶翻牌 - 狀態機設計 ├── Gomoku/ # 五子棋 - AI 對戰 ├── SlitherIO/ # 貪吃球 - 平滑插值動畫 ├── SimpleRacer/ # 簡易賽車 - 偽 3D 渲染 ├── TowerDefense/ # 塔防雛形 - A* 寻路 └── README.md # 統一說明文件
public abstract class GameLoop extends Canvas implements Runnable {
private Thread gameThread;
private volatile boolean running = false;
private final int targetFPS = 60;
private final long frameTimeNanos = 1_000_000_000L / targetFPS;
public synchronized void start() {
if (running) return;
running = true;
gameThread = new Thread(this, "GameLoop");
gameThread.start();
}
public synchronized void stop() {
if (!running) return;
running = false;
try { gameThread.join(); } catch (InterruptedException ignored) {}
}
@Override
public void run() {
long lastTime = System.nanoTime();
double delta = 0;
while (running) {
long now = System.nanoTime();
delta += (now - lastTime) / (double) frameTimeNanos;
lastTime = now;
while (delta >= 1) {
update(); // 邏輯更新
delta--;
}
render(); // 畫面渲染
try { Thread.sleep(1); } catch (InterruptedException ignored) {}
}
}
protected abstract void update();
protected abstract void render(Graphics2D g2d);
// 雙重緩衝渲染
@Override
public void paint(Graphics g) {
render((Graphics2D) g);
}
}
public final class CollisionUtils {
public static boolean rectIntersects(Rectangle a, Rectangle b) {
return a.intersects(b);
}
public static boolean circleIntersects(Point2D c1, double r1, Point2D c2, double r2) {
double dx = c1.getX() - c2.getX();
double dy = c1.getY() - c2.getY();
return dx*dx + dy*dy <= (r1 + r2) * (r1 + r2);
}
public static boolean pointInRect(Point2D p, Rectangle r) {
return r.contains(p);
}
}
public class ObjectPool<T> {
private final Stack<T> available = new Stack<>();
private final Supplier<T> factory;
public ObjectPool(Supplier<T> factory) { this.factory = factory; }
public T acquire() { return available.isEmpty() ? factory.get() : available.pop(); }
public void release(T obj) { available.push(obj); }
}
// 使用範例
ObjectPool<Bullet> bulletPool = new ObjectPool<>(Bullet::new);
Bullet b = bulletPool.acquire(); b.fire(x, y, angle);
bulletPool.release(b); // 回收而非 GC
下載連結: https://down.51cto.com/data/324246
Main 類別,直接執行即可遊玩「程式碼是邏輯的詩篇,遊戲是互動的藝術。」
願各位在新的一年:
✨ 重構舊專案,消除技術債
🚀 掌握新框架,拓寬技術棧
💰 遇見好專案,實現財富自由
🏠 代碼寫得好,早日買大樓
再次祝大家:龍騰四海,碼到成功!🐉🎉