请用C语言编写一个扫雷游戏,并标明注释
时间: 2024-04-23 19:24:11 浏览: 8
由于扫雷游戏的实现涉及到图形界面等复杂的操作,因此我提供一个基于控制台的简易版扫雷游戏的C语言代码,如下所示:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 10 // 行数
#define COL 10 // 列数
#define MINE_NUM 10 // 地雷数量
int main()
{
int board[ROW][COL]; // 记录格子的状态,0表示未打开,1表示已打开,-1表示地雷
int mine_num = MINE_NUM; // 剩余地雷数量
// 初始化随机数种子
srand((unsigned)time(NULL));
// 初始化棋盘,所有格子都未打开,地雷随机分布
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
board[i][j] = 0;
}
}
while (mine_num > 0)
{
int i = rand() % ROW;
int j = rand() % COL;
if (board[i][j] != -1)
{
board[i][j] = -1;
mine_num--;
}
}
// 游戏循环
while (1)
{
// 打印当前棋盘
printf(" ");
for (int j = 0; j < COL; j++)
{
printf("%2d ", j);
}
printf("\n");
for (int i = 0; i < ROW; i++)
{
printf("%2d ", i);
for (int j = 0; j < COL; j++)
{
if (board[i][j] == 0)
{
printf("[] ");
}
else if (board[i][j] == 1)
{
printf("%2d ", get_neighbor_mine_num(board, i, j));
}
else
{
printf("X ");
}
}
printf("\n");
}
// 判断游戏是否结束
if (is_game_over(board))
{
printf("You win!\n");
break;
}
// 玩家输入操作
printf("Please input an operation (open|flag): ");
char operation[10];
int row, col;
scanf("%s %d %d", operation, &row, &col);
// 执行操作
if (strcmp(operation, "open") == 0)
{
if (board[row][col] == -1)
{
printf("Game over!\n");
break;
}
else if (board[row][col] == 1)
{
printf("This cell has been opened!\n");
}
else
{
board[row][col] = 1;
}
}
else if (strcmp(operation, "flag") == 0)
{
if (board[row][col] == 1)
{
printf("This cell has been opened!\n");
}
else if (board[row][col] == -1)
{
mine_num++;
board[row][col] = 0;
}
else
{
mine_num--;
board[row][col] = -1;
}
}
else
{
printf("Invalid operation!\n");
}
}
return 0;
}
/**
* 获取指定格子周围地雷的数量
*/
int get_neighbor_mine_num(int board[][COL], int row, int col)
{
int num = 0;
for (int i = row - 1; i <= row + 1; i++)
{
for (int j = col - 1; j <= col + 1; j++)
{
if (i >= 0 && i < ROW && j >= 0 && j < COL && board[i][j] == -1)
{
num++;
}
}
}
return num;
}
/**
* 判断游戏是否结束
*/
int is_game_over(int board[][COL])
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
if (board[i][j] == 0 || board[i][j] == -1)
{
return 0;
}
}
}
return 1;
}
```
以上代码实现了一个简单的扫雷游戏,玩家可以通过在控制台输入操作来打开格子或者标记地雷。游戏的核心逻辑在 `main` 函数中,包括随机地雷分布、打印棋盘、执行操作等。其中,`get_neighbor_mine_num` 函数用于获取指定格子周围地雷的数量,`is_game_over` 函数用于判断游戏是否结束。需要注意的是,由于 C 语言不支持多维数组作为参数传递,因此在函数声明中需要明确指定第二维的长度。