掃雷是經典的益智遊戲,本文介紹如何使用純C語言實現其核心邏輯。我們將從預定義常量、全局數據結構、核心算法函數三個方面展開說明。
首先定義棋盤的最大尺寸:
#define MAX_X 100 // 行坐標最大值
#define MAX_Y 100 // 列坐標最大值
全局數組用於存儲地雷分布與棋盤實際大小:
char map[MAX_X][MAX_Y]; // 地雷分布圖:'*' 表示地雷,數字表示周圍地雷數
int m, n; // 當前遊戲的實際行數與列數(由難度等級決定)
注意:MAX_X/MAX_Y 是編譯期常量,決定數組上限;m/n 是運行時變量,表示實際使用的棋盤大小,二者不可混淆。
函數 round_num_mines(int i, int j) 用於返回坐標 (i, j) 周圍 8 格的地雷總數,是遊戲邏輯的核心。
i、j 為當前坐標1~8:周圍有 1~8 個地雷0:周圍無地雷'*':該坐標本身就是地雷函數首先判斷當前格是否為地雷,若是直接返回 '*'。否則需根據坐標位置(角、邊、內部)分情況檢查周圍最多 8 個鄰居。以下展示左上角 (0,0) 的處理邏輯:
char round_num_mines(int i, int j) {
int k = 0; // 計數器
if (map[i][j] == '*') return '*';
if (i == 0) { // 第 0 行
if (j == 0) { // 左上角 (0,0)
if (map[i][j+1] == '*') k++; // 右
if (map[i+1][j] == '*') k++; // 下
if (map[i+1][j+1] == '*') k++; // 右下
}
else if (j == n-1) { // 右上角 (0, n-1)
// 檢查左、左下、下 三個方向
}
else { // 第一行中間格
// 檢查左、右、左下、下、右下 五個方向
}
}
// ... 續處理最後一行、第一列、最後一列、內部格
return k;
}
完整實現需覆蓋 9 種位置類型(4 個角、4 條邊、內部),代碼雖繁瑣但邏輯清晰,是掃雷自動展開與數字提示的基石。
init_mines())dfs_open() 或 BFS)掌握上述核心函數,即可構建一個功能完整的終端版掃雷遊戲。