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

J2ME 遊戲開發實戰:華容道移植全過程(二)需求分析與概要設計

     編輯:Java 程式設計入門

華容道 J2ME 版:需求規範與系統架構設計 (第 2 部分)

接上篇技術調研,本文完成需求分析 (明確做什麼、不做什麼) 與概要設計 (模塊劃分、接口契約、數據流),為詳細設計與編碼奠定基礎。

需求分析:功能邊界與核心邏輯

遊戲規則確認

  • 棋盤:4×5 網格 (20 格)
  • 角色棋子 (佔格數):
    • 曹操 (2×2, 4 格) — 目標:移動到底部中間出口
    • 關羽 (2×1, 2 格, 豎向) ×1
    • 張飛 (1×2, 2 格, 橫向) ×1
    • 趙雲/黃忠/馬超 (1×1, 1 格) ×4 (共 5 個小兵)
  • 移動規則:棋子只能在空格中上下左右滑動,不可旋轉、不可重疊、不可超出邊界
  • 勝利條件:曹操 2×2 區域移動到第 4 行第 2-3 列 (出口位置)

操作交互設計

階段玩家動作視覺反饋鍵盤映射
選擇棋子方向鍵移動光標黑框高亮當前光標位置UP/DOWN/LEFT/RIGHT
確認選中按確認鍵綠框鎖定選中棋子主格FIRE (SELECT)
選擇目標位置方向鍵移動光標紅框高亮目標區域UP/DOWN/LEFT/RIGHT
執行移動按確認鍵棋子平滑移動 (幀動畫)、框消失FIRE
取消選中再次按確認鍵或軟鍵綠/紅框消失、回到選擇階段FIRE / BACK

四大核心概念區分 (記入數據字典):
選擇區域 (光標所在格) ≠ 選中區域 (已按 FIRE 鎖定的棋子主格) ≠ 要移動區域 (同選中區域) ≠ 要移動到區域 (目標空白區域)

非功能性需求

  • 包大小:< 50KB (Nokia 7210 限制),含代碼、圖片、數據
  • 幀率:關鍵動畫 ≥ 15fps,靜態界面無感知延遲
  • 內存:運行時 < 200KB 堆內存
  • 兼容性:MIDP 2.0 / CLDC 1.1,適配 128×128 至 240×320 螢幕
  • 持久化:RMS 存儲當前關卡進度、移動步數、最佳記錄

範圍外功能 (本版本不實現)

  • 過關動畫、慶祝特效 (需 TimerTask/Thread 實現,後續系列講解)
  • 多關卡切換邏輯 (當前僅單關卡演示)
  • 暫停/存檔/讀檔菜單 (RMS API 較簡單,文檔豐富,略過)
  • 音效/振動反饋 (MMAPI 廠商差異大,非核心)

概要設計:模塊劃分與職責

五大核心類,單一職責原則:

類名繼承/實現核心職責關鍵接口
MIDlet1extends MIDlet應用生命週期、屏幕切換總控、退出處理startApp(), quitApp()
Imagesfinal class圖片資源常量定義、加載、常量 (顏色、尺寸、角色 ID)init(), 常量字段
Drawclass通用繪圖工具:drawImage、drawRect、drawString 封裝paint(Graphics, ...)
Mapclass地圖數據結構、外部文件讀取、邏輯坐標↔繪圖坐標轉換read_map(level), draw_map(Graphics), Grid[][]
Displayable1extends Canvas implements CommandListener遊戲主視圖、輸入處理、遊戲狀態機、繪圖調度paint(), keyPressed(), commandAction(), 內部輔助方法

關鍵數據結構設計

// Images.java 常量定義
public final class Images {
    public static final byte CAOCAO = 1, GUANYU = 2, ZHANGFEI = 3, 
                             ZHAOYUN = 4, HUANGZHONG = 5, MACHAO = 6, ZU = 7;
    public static final byte BLANK = 0, DLEFT = -1, DUP = -2, DLEFTUP = -3; // 合併格標記
    public static final int WIDTH = 4, HEIGHT = 5; // 棋盤邏輯寬高
    public static final int UNIT = 30; // 每格像素大小 (運行時動態計算)
    public static Image image_Frame; // 背景圖
    public static void init() { image_Frame = Image.createImage("/frame.png"); }
}

// Map.java 核心結構
public class Map {
    public byte[][] Grid = new byte[HEIGHT][WIDTH]; // 邏輯棋盤
    public int[] read_map(int level) { // 返回曹操初始位置 [x,y]
        // 從 /map/level1.dat 讀取字節流填充 Grid
        // 合併格標記:曹操左上格=CAOCAO, 右上=DLEFT, 左下=DUP, 右下=DLEFTUP
    }
    public void draw_map(Graphics g) { // 遍歷 Grid 調用 Draw.paint 繪製
    }
}

Displayable1 核心方法契約 (詳細設計預留)

  • paint(Graphics g):雙緩衝繪製入口,分發 drawMap/drawCursor/drawPieces
  • keyPressed(int keyCode):getGameAction 映射 → 分發 moveCursor/selectPiece/movePiece
  • setRange():光標移動後,根據 Grid 合併格標記修正光標到棋子主格、計算選中區域寬高
  • setMoveRange():目標位置合法性檢查 (邊界、非空格、非選中區域內)
  • Move():執行棋子移動,更新 Grid,處理合併格拆分/合併
  • win():檢查曹操是否到達出口位置 Grid[HEIGHT-2][WIDTH-3] == CAOCAO

接口契約:Map ↔ Displayable1

// Displayable1 持有 Map 實例
private Map myMap = new Map();
// 初始化
int[] cursorPos = myMap.read_map(currentLevel); // 返回曹操左上角坐標
// 繪製
myMap.draw_map(g); // 內部遍歷 Grid 調用 Draw.paint
// 邏輯判斷
byte cell = myMap.Grid[y][x]; // 直接訪問公共數組 (簡化設計)
// 移動操作
// Displayable1 直接修改 myMap.Grid[][],移動後調用 repaint()

下一階段預告

下篇進入詳細設計:Displayable1 完整狀態機圖、setRange/setMoveRange/Move 算法偽代碼、Map.read_map 文件格式規範、RMS 存儲鍵值設計、異常情況處理矩陣。

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