C語言掃雷游戲設計(完整版)
游戲背景
掃雷是一款經典的益智類單人電腦游戲,最早出現在1960年代,并在1990年代隨著Windows操作系統而廣為人知。游戲目標是在不觸發任何地雷的情況下,揭開所有非地雷的格子。玩家需要根據數字提示(表示周圍地雷數量)來推理安全區域,并使用標記功能記錄可疑的地雷位置。
游戲規則
-
游戲區域:由SIZE×SIZE的方格矩陣組成(默認為10×10)
-
地雷分布:隨機分布著MINES個地雷(默認為15個)
-
游戲操作:
-
揭開格子:查看該格內容
-
標記格子:標記可能的地雷位置
-
-
格子內容:
-
空白:周圍8個格子無地雷
-
數字1-8:周圍8個格子中的地雷數量
-
地雷:游戲結束
-
-
勝利條件:所有非地雷格子均被揭開
-
失敗條件:揭開含有地雷的格子
函數詳細說明
1. initialize_board()
void initialize_board()
功能:初始化游戲板,包括:
-
重置所有格子狀態
-
隨機放置地雷
-
計算每個非地雷格子周圍的地雷數量
實現細節:
-
使用雙重循環初始化所有格子狀態
-
使用隨機數生成地雷位置,確保不重復
-
對每個非地雷格子,檢查周圍8個方向的地雷數量
2. print_board(bool show_mines)
void print_board(bool show_mines)
功能:打印當前游戲狀態
參數:
-
show_mines:為true時顯示所有地雷位置(用于游戲結束時)
顯示符號說明:
-
.:未揭開的格子
-
F:被標記的格子
-
*:地雷(僅在游戲結束或show_mines為true時顯示)
-
1-8:周圍地雷數量
實現細節:
-
打印列坐標標題
-
遍歷每個格子,根據狀態選擇適當符號
-
行首打印行坐標
3. reveal(int x, int y)
void reveal(int x, int y)
功能:揭開指定位置的格子
參數:
-
x, y:要揭開的格子坐標
遞歸邏輯:
-
如果揭開的是空白格子(周圍無地雷),自動遞歸揭開周圍8個格子
-
遇到數字格子或邊界時停止遞歸
注意事項:
-
會檢查坐標有效性
-
已揭開或被標記的格子不會被處理
-
揭開地雷會設置game_over標志
4. flag(int x, int y)
void flag(int x, int y)
功能:切換指定格子的標記狀態
參數:
-
x, y:要標記的格子坐標
實現細節:
-
僅對未揭開的格子有效
-
標記狀態可以切換(標記/取消標記)
5. check_win()
bool check_win()
功能:檢查游戲是否勝利
返回值:
-
true:所有非地雷格子均被揭開
-
false:仍有未揭開的非地雷格子
6. main()
功能:游戲主循環
流程:
-
初始化隨機數生成器和游戲板
-
打印游戲說明
-
進入主循環:
-
顯示當前游戲狀態
-
獲取玩家輸入
-
處理指令(揭開/標記/退出)
-
檢查游戲狀態
-
-
游戲結束時顯示最終結果
游戲指令說明
指令 | 格式 | 示例 | 說明 |
---|---|---|---|
揭開 | r x y | r 3 4 | 揭開第3行第4列的格子 |
標記 | f x y | f 5 2 | 標記/取消標記第5行第2列的格子 |
退出 | q | q | 退出游戲 |
代碼結構
掃雷游戲
├── 常量定義
│ ├── SIZE - 游戲區域大小
│ └── MINES - 地雷數量
├── 數據結構
│ └── Cell - 格子狀態結構體
├── 全局變量
│ ├── board - 游戲板
│ ├── game_over - 游戲結束標志
│ └── game_won - 游戲勝利標志
└── 函數
├── initialize_board() - 初始化游戲板
├── print_board() - 顯示游戲狀態
├── reveal() - 揭開格子
├── flag() - 標記格子
├── check_win() - 檢查勝利條件
└── main() - 游戲主流程
擴展功能建議
-
難度系統:
#define EASY_SIZE 8
#define EASY_MINES 10
#define MEDIUM_SIZE 12
#define MEDIUM_MINES 20
#define HARD_SIZE 16
#define HARD_MINES 40 -
計時功能:
#include <time.h>
clock_t start_time;
double elapsed_time;
// 游戲開始時
start_time = clock();
// 游戲結束時
elapsed_time = (double)(clock() - start_time) / CLOCKS_PER_SEC;
-
保存/加載游戲:
void save_game() {
FILE *file = fopen("minesweeper.save", "wb");
if (file) {
fwrite(&board, sizeof(board), 1, file);
fclose(file);
}
}
void load_game() {
FILE *file = fopen("minesweeper.save", "rb");
if (file) {
fread(&board, sizeof(board), 1, file);
fclose(file);
}
}
編譯器說明
編譯器是什么
編譯器(Compiler)是一種將高級編程語言(如C、C++、Java等)編寫的源代碼翻譯成計算機能直接執行的機器語言(二進制代碼)的程序。它是軟件開發過程中不可或缺的工具。
編譯器的作用
-
翻譯代碼
-
將人類可讀的源代碼(如C語言)轉換為機器可執行的二進制指令(如.exe或.out文件)。
-
例如:你的掃雷游戲代碼(.c文件) → 編譯器 → 可執行程序(.exe或無后綴的可執行文件)。
-
-
語法檢查
-
在編譯過程中,編譯器會檢查代碼是否符合語法規則,如果發現錯誤(如缺少分號、括號不匹配等),會報錯并停止編譯。
-
-
優化代碼
-
部分編譯器會對代碼進行優化,使得生成的機器碼運行更快或占用更少內存。
-
常見的C語言編譯器
編譯器名稱 | 適用平臺 | 特點 |
---|---|---|
GCC (GNU Compiler Collection) | Linux/macOS/Windows | 開源、強大,支持多種語言(C/C++/Fortran等) |
Clang | macOS/Linux/Windows | LLVM 后端,錯誤提示友好,Xcode 默認編譯器 |
MSVC (Microsoft Visual C++) | Windows | Visual Studio 自帶,適合Windows開發 |
TCC (Tiny C Compiler) | 跨平臺 | 輕量級,編譯速度快,適合小型項目 |
編譯過程(以GCC為例)
假設你的掃雷游戲代碼保存為 minesweeper.c,編譯運行步驟如下:
1. 編譯(Compile)
gcc minesweeper.c -o minesweeper
-
gcc:調用GCC編譯器
-
minesweeper.c:你的C源代碼文件
-
-o minesweeper:指定輸出可執行文件名(Windows下可能是 minesweeper.exe)
2. 運行(Execute)
-
Linux/macOS:
./minesweeper -
Windows:
minesweeper.exe
如果編譯出錯怎么辦?
編譯器會提示錯誤信息,例如:
minesweeper.c:15:5: error: expected ';' before '}' token
-
這表示第15行缺少分號 ;,你需要檢查代碼并修正錯誤后重新編譯。
總結
-
編譯器的作用:把C代碼變成計算機能運行的機器碼。
-
常用C編譯器:GCC(Linux)、Clang(macOS)、MSVC(Windows)。
-
編譯命令:gcc 源代碼.c -o 輸出文件名。
-
運行命令:./輸出文件名(Linux/macOS)或 輸出文件名.exe(Windows)。