iT邦幫忙

2025 iThome 鐵人賽

DAY 13
2

🎯 主題

昨天我們已經整理了踩地雷遊戲的規則與玩法,今天我們要進一步規劃 程式中的資料結構。遊戲設計要能清楚表達出「棋盤、方格、地雷分布、遊戲狀態」,這樣未來在邏輯實作上才會乾淨俐落。

📌 每日重點

設計格子結構(是否有雷、是否揭開、是否標旗、周圍雷數)、建立二維盤面資料結構

一、核心資料結構設計思路

踩地雷遊戲最重要的元素有三個:

  1. 棋盤 (Board)
  • 定義遊戲整體大小 (rows × cols)
  • 儲存所有的方格 (Cell)
  1. 方格 (Cell)
  • 每個格子可能是「地雷」或「安全區」
  • 需要紀錄玩家互動狀態,例如:是否翻開、是否標記旗子
  1. 遊戲狀態 (Game State)
  • 控制遊戲是否進行中、勝利或失敗
  • 可以附帶紀錄:剩餘未翻開的格數、旗子的數量

二、Golang 結構體設計

以下是初步的 Go 資料結構:

// 單一格子 (Cell)
type Cell struct {
	IsMine    bool // 是否為地雷
	Revealed  bool // 是否被翻開
	Flagged   bool // 是否被插旗
	AdjacentMines int // 周圍地雷數
}

// 棋盤 (Board)
type Board struct {
	Rows int
	Cols int
	Cells [][]*Cell
}

// 遊戲狀態 (Game)
type Game struct {
	Board      *Board
	IsGameOver   bool
	IsPlayerWin    bool
	Remaining  int // 剩餘需要翻開的格子數
}

三、設計重點與好處

1. 單一責任原則

  • Cell 單純表達一個格子的狀態
  • Board 處理整體地圖與格子陣列
  • Game 控制流程與遊戲邏輯

2. 可擴充性

  • 未來若要支援不同難度(初級、中級、高級),只需要調整 Board.Rows 與 Board.Cols。
  • 可以額外加入計時功能或排行榜,而不會影響核心邏輯。

3. 乾淨的 API 設計

  • RevealCell(row, col int):翻開格子
  • ToggleFlag(row, col int):插旗或取消旗子
  • CheckVictory():判斷是否勝利

四 透過 gemini cli 生成 sample 資料

gemini cli 生成的 prompt

gemini -p "請根據以下 Golang struct,生成一份踩地雷遊戲的 sample data。
資料需包含:
- 棋盤大小 (Rows, Cols) = 5x5
- 固定 5 顆地雷
- 各 Cell 需填上 IsMine, Revealed, Flagged, AdjacentMines
- GameOver = false, Victory = false, Remaining = 未翻開且非地雷格數

請輸出 JSON 格式,符合以下 struct 定義:

// 單一格子 (Cell)
type Cell struct {
    IsMine    bool
    Revealed  bool
    Flagged   bool
    AdjacentMines int
}

// 棋盤 (Board)
type Board struct {
    Rows int
    Cols int
    Cells [][]Cell
}

// 遊戲狀態 (Game)
type Game struct {
    Board      *Board
    IsGameOver   bool
    IsPlayerWin    bool
    Remaining  int
}
"

sample data

{
  "Board": {
    "Rows": 5,
    "Cols": 5,
    "Cells": [
      [
        {"IsMine": false, "Revealed": false, "Flagged": false, "AdjacentMines": 0},
        {"IsMine": false, "Revealed": false, "Flagged": false, "AdjacentMines": 1},
        {"IsMine": true,  "Revealed": false, "Flagged": false, "AdjacentMines": 0},
        {"IsMine": false, "Revealed": false, "Flagged": false, "AdjacentMines": 2},
        {"IsMine": false, "Revealed": false, "Flagged": false, "AdjacentMines": 1}
      ],
      [
        {"IsMine": false, "Revealed": false, "Flagged": false, "AdjacentMines": 1},
        {"IsMine": false, "Revealed": false, "Flagged": false, "AdjacentMines": 2},
        {"IsMine": false, "Revealed": false, "Flagged": false, "AdjacentMines": 1},
        {"IsMine": false, "Revealed": false, "Flagged": false, "AdjacentMines": 2},
        {"IsMine": true,  "Revealed": false, "Flagged": false, "AdjacentMines": 0}
      ],
      [
        {"IsMine": true,  "Revealed": false, "Flagged": false, "AdjacentMines": 0},
        {"IsMine": false, "Revealed": false, "Flagged": false, "AdjacentMines": 1},
        {"IsMine": false, "Revealed": false, "Flagged": false, "AdjacentMines": 1},
        {"IsMine": false, "Revealed": false, "Flagged": false, "AdjacentMines": 2},
        {"IsMine": false, "Revealed": false, "Flagged": false, "AdjacentMines": 2}
      ],
      [
        {"IsMine": false, "Revealed": false, "Flagged": false, "AdjacentMines": 2},
        {"IsMine": false, "Revealed": false, "Flagged": false, "AdjacentMines": 2},
        {"IsMine": false, "Revealed": false, "Flagged": false, "AdjacentMines": 2},
        {"IsMine": true,  "Revealed": false, "Flagged": false, "AdjacentMines": 0},
        {"IsMine": false, "Revealed": false, "Flagged": false, "AdjacentMines": 1}
      ],
      [
        {"IsMine": false, "Revealed": false, "Flagged": false, "AdjacentMines": 1},
        {"IsMine": true,  "Revealed": false, "Flagged": false, "AdjacentMines": 0},
        {"IsMine": false, "Revealed": false, "Flagged": false, "AdjacentMines": 2},
        {"IsMine": false, "Revealed": false, "Flagged": false, "AdjacentMines": 1},
        {"IsMine": false, "Revealed": false, "Flagged": false, "AdjacentMines": 1}
      ]
    ]
  },
  "IsGameOver": false,
  "IsPlayerWin": false,
  "Remaining": 20
}

圖示

https://ithelp.ithome.com.tw/upload/images/20250828/20111580wuwLjZPe3P.png

github action 測試驗證

https://github.com/leetcode-golang-classroom/mine-sweeper-game/actions/runs/17274131269

五、明日預告

在定義好資料結構後,明天我們將會進一步探討 棋盤初始化邏輯:

  • 如何隨機分布地雷
  • 如何計算每個格子的周圍地雷數

上一篇
採地雷遊戲:規則與玩法理解
下一篇
踩地雷遊戲: 隨機布雷與周圍雷數計算
系列文
在 ai 時代 gopher 遊戲開發者的 30 天自我養成20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言