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

J2ME 掃雷遊戲完整實作:從核心演算法到 UI 交互的教學級原始碼解析

     編輯:J2ME

專案概覽

本專案完整復刻 Windows 經典掃雷遊戲於 J2ME 平台,採用 MIDlet 入口控制 + Canvas 自繪 + 遞迴展開演算法 架構,展示行動遊戲開發核心知識點:陣列操作、事件監聽、多執行緒、幾何座標轉換、狀態機管理。

核心類別架構

gameStart extends MIDlet implements CommandListener

  • 單例模式持有自身參考(gameStart.midlet = this),供 Canvas 回調控制生命週期
  • 管理 myCanvas 實例建立/銷毀與顯示切換
  • 處理「退出」命令,正確呼叫 destroyApp(false); notifyDestroyed();

myCanvas extends Canvas

遊戲邏輯與渲染核心,關鍵成員:

  • int[][] map = new int[8][8]:地圖狀態矩陣(0=未揭開, 10=空白, 1-8=數字, 20=地雷)
  • Image offScreen + Graphics offg:雙緩衝離屏繪圖,消除閃爍
  • int px, py:游標像素座標(格子大小 20px)
  • boolean gameOver, gameWin:遊戲結束狀態旗標

核心演算法詳細解析

地圖初始化與佈雷

void initMap() {
    for (int n = 0; n < mineNumber; n++) {
        int tmp = Math.abs(r1.nextInt() % 64);
        int row = tmp / 8, col = tmp % 8;
        if (map[row][col] != 20) map[row][col] = 20;
        else n--; // 重試避免重複佈雷
    }
}

周邊地雷計數

checkNum(int r, int c) 遍歷 8 方向鄰居,統計值為 20 的格子數。邊界檢查使用硬編碼 0 與 7(8x8 固定棋盤)。

遞迴展開(洪水填充)

void check(int row, int col) {
    if (map[row][col] == 20) { gameOver = true; return; }
    int k = checkNum(row, col);
    if (k > 0) { map[row][col] = k; return; }
    // k == 0:遞迴展開 8 鄰居
    map[row][col] = 10; // 標記為已揭開空白
    // 8 方向遞迴呼叫 check()...
}

關鍵點:以 map[r][c] < 10 判斷「未揭開」狀態,避免重複遞迴導致堆疊溢位。

勝利判定

void checkWin() {
    int count = 0;
    for (所有格子) if (map[i][j] > 0) count++; // 已揭開格子數
    if (count + mineNumber == 64) gameWin = true;
}

輸入處理與座標映射

void keyPressed(int n) {
    // 導航鍵移動游標(20px/格)
    int action = getGameAction(n);
    switch (action) {
        case Canvas.UP: if (py >= 20) py -= 20; break;
        case Canvas.DOWN: if (py <= 120) py += 20; break;
        case Canvas.LEFT: if (px >= 20) px -= 20; break;
        case Canvas.RIGHT: if (px <= 120) px += 20; break;
        case Canvas.FIRE: // 確認鍵
            int row = py / 20, col = px / 20;
            check(row, col);
            checkWin();
            break;
    }
    repaint(); serviceRepaints();
}

渲染管線

paint(Graphics g) 呼叫順序:drawMap() → drawCricle()(游標) → 結束畫面覆蓋 → g.drawImage(offScreen, 0, 0, 0) 一次性呈現。

教學價值總結

知識點本專案體現形式
雙緩衝繪圖Image.createImage() + getGraphics() 離屏合成
狀態機gameOver/gameWin 控制渲染分支
遞迴演算法洪水填充展開空白區域
座標系統轉換像素座標 ⇄ 格子索引 互轉
資源管理try-catch 載入 PNG 圖片資源

此專案為 J2ME 遊戲開發入門極佳範例,程式碼結構清晰、邏輯自包含,適合作為教學參考或快速原型基礎。

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