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

雙人掃雷 1.0 完整實現(一):核心邏輯與介面架構設計

     編輯:J2ME

前言與開發理念

延續《五子棋》文章,本文記錄真實開發過程,而非為寫作而寫作。採用《J2ME Game Programming》風格,按功能模組分段給出程式碼,幫助讀者理解從設計到完成的完整思路。

平台與移植說明

  • 基於 Nokia 平台,使用 FullCanvas,針對 7650 (176×208) 設計。
  • 稍作修改可移植至 Siemens C65、Nokia 7210 及所有支援 MIDP 1.0/2.0、螢幕 128×128 的手機。

遊戲規則:雙人掃雷新玩法

源自 MSN 聯機小遊戲。16×16 共 256 格,藏 52 顆地雷。雙方輪流挖雷,挖到得 1 分;未挖到則顯示周圍 8 格雷數(同經典掃雷),若周圍無雷則自動展開連通安全區。先挖到超過半數(>26 顆)者獲勝。

遊戲畫面1 遊戲畫面2 遊戲畫面3 遊戲畫面4

核心邏輯設計

  • 資料結構:Bomb 類別描述每個格點——isBomb(是否為雷)、hasFound(是否已挖)、isPlayer1(哪位玩家挖到)、bombaround(周圍雷數)。二維陣列 Bomb[][] 完整描述雷區狀態。
  • 遊戲流程:單一 FullCanvas,單一 gamestate 狀態變量配合 switch 控制畫面切換,單執行緒運行。
  • 玩家切換:布林變量標記當前玩家,以外框顏色與右下角旗幟顏色提示。

主要類別架構

MiningMIDlet

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(); }
}

Bomb(地雷資料類別)

public class Bomb {
    int bombaround;
    boolean isPlayer1, hasFound, isBomb;
    public Bomb() { bombaround=0; isBomb=false; hasFound=false; isPlayer1=true; }
}

MiningCanvas 框架

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 跳轉對應畫面。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved