用c语言写一个扫雷小游戏
时间: 2023-12-29 13:18:00 浏览: 39
以下是一个简单的扫雷游戏的C语言代码,其中包括了随机生成地雷、计算周围地雷数、递归展开空白格子等功能:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROWS 10
#define COLS 10
#define MINES 10
int board[ROWS][COLS];
int revealed[ROWS][COLS];
void init_board() {
int i, j;
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
board[i][j] = 0;
revealed[i][j] = 0;
}
}
}
void place_mines() {
int i, j, k;
srand(time(NULL));
for (k = 0; k < MINES; k++) {
i = rand() % ROWS;
j = rand() % COLS;
if (board[i][j] != -1) {
board[i][j] = -1;
for (int ii = i-1; ii <= i+1; ii++) {
for (int jj = j-1; jj <= j+1; jj++) {
if (ii >= 0 && ii < ROWS && jj >= 0 && jj < COLS && board[ii][jj] != -1) {
board[ii][jj]++;
}
}
}
} else {
k--;
}
}
}
void print_board() {
int i, j;
printf(" ");
for (j = 0; j < COLS; j++) {
printf("%d ", j);
}
printf("\n");
for (i = 0; i < ROWS; i++) {
printf("%d ", i);
for (j = 0; j < COLS; j++) {
if (revealed[i][j]) {
if (board[i][j] == -1) {
printf("* ");
} else {
printf("%d ", board[i][j]);
}
} else {
printf("? ");
}
}
printf("\n");
}
}
void reveal(int row, int col) {
if (row >= 0 && row < ROWS && col >= 0 && col < COLS && !revealed[row][col]) {
revealed[row][col] = 1;
if (board[row][col] == 0) {
reveal(row-1, col-1);
reveal(row-1, col);
reveal(row-1, col+1);
reveal(row, col-1);
reveal(row, col+1);
reveal(row+1, col-1);
reveal(row+1, col);
reveal(row+1, col+1);
}
}
}
int main() {
init_board();
place_mines();
print_board();
int row, col;
while (1) {
printf("Enter row and column: ");
scanf("%d%d", &row, &col);
if (row < 0 || row >= ROWS || col < 0 || col >= COLS) {
printf("Invalid input.\n");
} else if (revealed[row][col]) {
printf("This cell has already been revealed.\n");
} else {
reveal(row, col);
print_board();
if (board[row][col] == -1) {
printf("You lose!\n");
break;
}
int count = 0;
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
if (!revealed[i][j]) {
count++;
}
}
}
if (count == MINES) {
printf("You win!\n");
break;
}
}
}
return 0;
}
```
在这个代码中,我们定义了一个 `board` 数组用于表示扫雷游戏的地图,其中地雷用 `-1` 表示,其他数字表示周围地雷的数量。我们还定义了一个 `revealed` 数组用于表示每个格子是否已经被揭开。在初始化函数 `init_board` 中,我们将所有格子的状态都设置为未揭开。在放置地雷的函数 `place_mines` 中,我们使用随机数生成器随机放置地雷,并且在放置地雷的同时计算周围地雷的数量。在打印函数 `print_board` 中,我们根据 `revealed` 数组来决定每个格子应该显示什么内容。在递归函数 `reveal` 中,我们根据当前格子周围的地雷数量来递归展开空白格子。最后,在主函数中,我们不断读取用户输入的行列坐标,展开当前格子,并判断游戏是否结束。
请注意,这只是一个基本的扫雷游戏实现,还有很多可以改进的地方。例如,可以添加计时器、计算分数、添加更多游戏设置等等。