延續《五子棋》文章,本文記錄真實開發過程,而非為寫作而寫作。採用《J2ME Game Programming》風格,按功能模組分段給出程式碼,幫助讀者理解從設計到完成的完整思路。
FullCanvas,針對 7650 (176×208) 設計。源自 MSN 聯機小遊戲。16×16 共 256 格,藏 52 顆地雷。雙方輪流挖雷,挖到得 1 分;未挖到則顯示周圍 8 格雷數(同經典掃雷),若周圍無雷則自動展開連通安全區。先挖到超過半數(>26 顆)者獲勝。

Bomb 類別描述每個格點——isBomb(是否為雷)、hasFound(是否已挖)、isPlayer1(哪位玩家挖到)、bombaround(周圍雷數)。二維陣列 Bomb[][] 完整描述雷區狀態。FullCanvas,單一 gamestate 狀態變量配合 switch 控制畫面切換,單執行緒運行。public class MiningMIDlet extends MIDlet {
MiningCanvas miningCanvas;
public MiningMIDlet() {
display = Display.getDisplay(this);
miningCanvas = new MiningCanvas(this);
}
protected void startApp() { display.setCurrent(miningCanvas); }
protected void pauseApp() {}
protected void destroyApp(boolean arg0) { notifyDestroyed(); }
}
public class Bomb {
int bombaround;
boolean isPlayer1, hasFound, isBomb;
public Bomb() { bombaround=0; isBomb=false; hasFound=false; isPlayer1=true; }
}
public class MiningCanvas extends FullCanvas implements Runnable {
MiningMIDlet miningMIDlet;
int gamestate;
static final int GAMESTATE_SPLASH=0, GAMESTATE_MENU=1, GAMESTATE_GAMEING=2,
GAMESTATE_HELP=3, GAMESTATE_SETTING=4, GAMESTATE_ABOUT=5,
GAMESTATE_GAMEMENU=6, GAMESTATE_COUNT=7;
public MiningCanvas(MiningMIDlet midlet) {
this.miningMIDlet = midlet;
gamestate = 0; // 啟動畫面
// 初始化字體、選單項目、螢幕尺寸等...
thread = new Thread(this);
thread.start();
}
protected void paint(Graphics g) {
g.setColor(0xFFFFFF); g.fillRect(0,0,canvasW,canvasH);
switch(gamestate) {
case GAMESTATE_SPLASH: paintSplashScreen(g); break;
case GAMESTATE_MENU: paintMenuScreen(g); break;
case GAMESTATE_HELP: paintHelpScreen(g); break;
case GAMESTATE_GAMEING: paintGameScreen(g); break;
case GAMESTATE_GAMEMENU: paintGameMenuScreen(g); break;
default: paintMenuScreen(g);
}
}
public void run() {
try { Thread.sleep(splashDelayTime); }
catch (InterruptedException e) {}
gamestate = GAMESTATE_MENU;
repaint();
}
protected synchronized void keyPressed(int keyCode) {
int action = getGameAction(keyCode);
switch(gamestate) { /* 各狀態按鍵處理 */ }
}
}
/occo.png,主執行緒 sleep(3000) 後切換至主選單。menuIdx 追蹤選項,FIRE 鍵切換 gamestate 跳轉對應畫面。