作者 yinowl 於 2005 年 1 月完成的 J2ME 入門首作,雖無電腦 AI(僅雙人對戰),但完整展示 J2ME 流程、按鍵響應、繪圖等核心概念。代碼採「功能區塊式」說明,而非檔案整段給出,助於理解設計思路。
定義 Chesses 類別表示棋子,含 boolean isPlayer1 區分玩家。棋盤用 Chesses[][] 二維陣列,但不預先建立所有物件,而是落子時才在對應位置 new Chesses(),節省記憶體。
依陣列繪製棋盤,玩家落子修改陣列並 repaint() 更新畫面。介面簡化:啟動即進入對戰,邊框顏色指示當前玩家(白/紅),提供「重新開始」、「離開」按鈕。
繼承 MIDlet,管理 GobangCanvas 顯示。
package com.occo.j2me.game.gobang;
import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;
public class Gobang extends MIDlet {
GobangCanvas gobang;
public Gobang() { super(); gobang = new GobangCanvas(this); }
protected void startApp() { Display.getDisplay(this).setCurrent(gobang); }
protected void pauseApp() {}
protected void destroyApp(boolean arg0) {}
}
繼承 Canvas 實作 CommandListener,處理邏輯、繪圖、互動。
public class GobangCanvas extends Canvas implements CommandListener {
protected Gobang gobang;
// 建構子、paint 等方法...
public class Chesses {
boolean isPlayer1;
public Chesses(boolean isPlayer1) { this.isPlayer1 = isPlayer1; }
}
在 GobangCanvas 中分離繪製邏輯:
paintMap():繪製 15x15 棋盤格線,依螢幕短邊計算尺寸並置中。paintSelected():繪製藍色選取框,位置對應陣列索引。paintChesses():遍歷陣列,依 isPlayer1 繪製白/紅圓棋子。paintPlayer():邊框 3 像素寬,顏色指示當前玩家。paint():按順序呼叫上述方法(背景→棋盤→選取框→棋子)。restartCmd(重新開始)、exitCmd(離開),註冊 CommandListener。keyPressed():處理上下左右移動選取框(模數運算實現循環),FIRE 鍵落子並切換玩家。init():重置陣列、玩家、選取位置。預留 checkWin() 方法供擴展,雙人對戰下肉眼可判斷勝負,非必須實作。
完整遊戲僅用 MIDP 1.0 核心功能。可擴展:片頭動畫、音效、電腦 AI、藍牙對戰。歡迎交流(MSN/QQ/Email 見原文)。