1、初始化棋盘
initializeBoard()
函数创建一个大小为 ROWS x COLS 的棋盘,初始状态下所有格子都未揭开,且无地雷。
#include <stdio.h> #include <stdlib.h> #include <time.h> #define ROWS 10 #define COLS 10 #define MINES 10 typedef struct { int revealed; int mine; int adjacentMines; } Cell; Cell board[ROWS][COLS]; // 初始化棋盘 void initializeBoard() { for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { board[i][j].revealed = 0; board[i][j].mine = 0; board[i][j].adjacentMines = 0; } } } int main() { printf("Hello, World!"); return 0; }
2、布置地雷
placeMines()
随机在棋盘上放置 MINES 个地雷。
#include <stdio.h> #include <stdlib.h> #include <time.h> #define ROWS 10 #define COLS 10 #define MINES 10 typedef struct { int revealed; int mine; int adjacentMines; } Cell; Cell board[ROWS][COLS]; // 随机布置地雷 void placeMines() { srand(time(NULL)); int minesPlaced = 0; while (minesPlaced < MINES) { int row = rand() % ROWS; int col = rand() % COLS; if (board[row][col].mine == 0) { board[row][col].mine = 1; minesPlaced++; } } } int main() { printf("Hello, World!"); return 0; }
3、计算周围地雷数
calculateAdjacentMines()
计算每个格子周围的地雷数,用于提示玩家。
#include <stdio.h> #include <stdlib.h> #include <time.h> #define ROWS 10 #define COLS 10 #define MINES 10 typedef struct { int revealed; int mine; int adjacentMines; } Cell; Cell board[ROWS][COLS]; // 计算每个格子周围的地雷数 void calculateAdjacentMines() { for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { if (board[i][j].mine == 1) continue; int count = 0; for (int x = -1; x <= 1; x++) { for (int y = -1; y <= 1; y++) { int ni = i + x; int nj = j + y; if (ni >= 0 && ni < ROWS && nj >= 0 && nj < COLS && board[ni][nj].mine) { count++; } } } board[i][j].adjacentMines = count; } } } int main() { printf("Hello, World!"); return 0; }
4、游戏循环
playGame()
是游戏的主循环,每次玩家输入想揭开的格子坐标,并调用 revealCell()
函数揭开格子。若玩家揭开地雷,游戏结束;若揭开所有非雷区格子,则游戏胜利。
#include <stdio.h> #include <stdlib.h> #include <time.h> #define ROWS 10 #define COLS 10 #define MINES 10 typedef struct { int revealed; int mine; int adjacentMines; } Cell; Cell board[ROWS][COLS]; // 显示棋盘 void displayBoard() { printf(" "); for (int j = 0; j < COLS; j++) { printf("%2d ", j); } printf("\n"); for (int i = 0; i < ROWS; i++) { printf("%2d ", i); for (int j = 0; j < COLS; j++) { if (board[i][j].revealed) { if (board[i][j].mine) { printf(" * "); } else { printf(" %d ", board[i][j].adjacentMines); } } else { printf(" . "); } } printf("\n"); } } // 揭开一个格子 int revealCell(int row, int col) { if (row < 0 || row >= ROWS || col < 0 || col >= COLS || board[row][col].revealed) { return 0; } board[row][col].revealed = 1; if (board[row][col].mine) { return 1; // 踩到雷 } // 如果周围没有地雷,自动揭开周围格子 if (board[row][col].adjacentMines == 0) { for (int x = -1; x <= 1; x++) { for (int y = -1; y <= 1; y++) { revealCell(row + x, col + y); } } } return 0; } // 检查游戏是否胜利 int checkWin() { for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { if (!board[i][j].revealed && !board[i][j].mine) { return 0; } } } return 1; } // 主游戏循环 void playGame() { int gameOver = 0; int win = 0; while (!gameOver && !win) { displayBoard(); int row, col; printf("请输入要揭开的格子 (行 列): "); scanf("%d %d", &row, &col); if (revealCell(row, col)) { gameOver = 1; printf("你踩到了雷,游戏结束!\n"); } else if (checkWin()) { win = 1; printf("恭喜你,成功避开了所有地雷!\n"); } } displayBoard(); } int main() { printf("Hello, World!"); return 0; } int main() { printf("Hello, World!"); return 0; }
5、完整代码
一个简易的扫雷游戏,可以根据自己的需求进行扩展和完善。
#include <stdio.h> #include <stdlib.h> #include <time.h> #define ROWS 10 #define COLS 10 #define MINES 10 typedef struct { int revealed; int mine; int adjacentMines; } Cell; Cell board[ROWS][COLS]; // 初始化棋盘 void initializeBoard() { for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { board[i][j].revealed = 0; board[i][j].mine = 0; board[i][j].adjacentMines = 0; } } } // 随机布置地雷 void placeMines() { srand(time(NULL)); int minesPlaced = 0; while (minesPlaced < MINES) { int row = rand() % ROWS; int col = rand() % COLS; if (board[row][col].mine == 0) { board[row][col].mine = 1; minesPlaced++; } } } // 计算每个格子周围的地雷数 void calculateAdjacentMines() { for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { if (board[i][j].mine == 1) continue; int count = 0; for (int x = -1; x <= 1; x++) { for (int y = -1; y <= 1; y++) { int ni = i + x; int nj = j + y; if (ni >= 0 && ni < ROWS && nj >= 0 && nj < COLS && board[ni][nj].mine) { count++; } } } board[i][j].adjacentMines = count; } } } // 显示棋盘 void displayBoard() { printf(" "); for (int j = 0; j < COLS; j++) { printf("%2d ", j); } printf("\n"); for (int i = 0; i < ROWS; i++) { printf("%2d ", i); for (int j = 0; j < COLS; j++) { if (board[i][j].revealed) { if (board[i][j].mine) { printf(" * "); } else { printf(" %d ", board[i][j].adjacentMines); } } else { printf(" . "); } } printf("\n"); } } // 揭开一个格子 int revealCell(int row, int col) { if (row < 0 || row >= ROWS || col < 0 || col >= COLS || board[row][col].revealed) { return 0; } board[row][col].revealed = 1; if (board[row][col].mine) { return 1; // 踩到雷 } // 如果周围没有地雷,自动揭开周围格子 if (board[row][col].adjacentMines == 0) { for (int x = -1; x <= 1; x++) { for (int y = -1; y <= 1; y++) { revealCell(row + x, col + y); } } } return 0; } // 检查游戏是否胜利 int checkWin() { for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { if (!board[i][j].revealed && !board[i][j].mine) { return 0; } } } return 1; } // 主游戏循环 void playGame() { int gameOver = 0; int win = 0; while (!gameOver && !win) { displayBoard(); int row, col; printf("请输入要揭开的格子 (行 列): "); scanf("%d %d", &row, &col); if (revealCell(row, col)) { gameOver = 1; printf("你踩到了雷,游戏结束!\n"); } else if (checkWin()) { win = 1; printf("恭喜你,成功避开了所有地雷!\n"); } } displayBoard(); } int main() { initializeBoard(); placeMines(); calculateAdjacentMines(); playGame(); return 0; }