C语言实现扫雷游戏
扫雷是一款经典的单人益智游戏,玩家需要根据周围雷的数量来推断出每个格子是否有雷,并将所有没有雷的格子全部翻开。本文将介绍如何使用C语言实现扫雷游戏。
游戏规则
扫雷游戏的规则如下:
-
游戏面板由一定数量的格子组成,其中一些格子中有地雷,其余格子为空。
-
玩家需要翻开所有没有地雷的格子,以揭示其内容。
-
翻开一个格子后,如果其周围八个格子中有地雷,则该格子上会显示雷的数量。
-
如果翻开的格子中有地雷,则游戏失败。
-
如果所有没有地雷的格子都被翻开,则游戏胜利。
实现步骤
下面是使用C语言实现扫雷游戏的步骤:
-
定义游戏面板。可以使用二维数组来表示游戏面板,其中0表示空格,1表示有地雷的格子。
-
随机生成地雷。可以使用随机数生成器来随机生成地雷的位置,保证每个格子被选中的概率相等。
-
计算周围雷的数量。对于每个非地雷格子,遍历其周围八个格子,统计周围雷的数量,并将该数量显示在该格子上。
-
实现翻开格子的功能。当玩家点击一个格子时,根据该格子是否有地雷来判断游戏是否结束。如果该格子周围没有地雷,则递归翻开周围八个格子。
-
实现游戏胜利和失败的判断。当所有没有地雷的格子都被翻开时,游戏胜利。当玩家翻开一个地雷格子时,游戏失败。
示例代码
下面是使用C语言实现扫雷游戏的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 10
#define COL 10
#define MINE_NUM 10
int board[ROW][COL]; // 游戏面板
int visited[ROW][COL]; // 标记是否已经访问过
int mine_num; // 地雷数量
// 随机生成地雷
void generate_mine() {
int i, j, count = 0;
while (count < mine_num) {
i = rand() % ROW;
j = rand() % COL;
if (board[i][j] != 1) {
board[i][j] = 1;
count++;
}
}
}
// 计算周围雷的数量
int count_mine(int row, int col) {
int i, j, count = 0;
for (i = row - 1; i <= row + 1; i++) {
for (j = col - 1; j <= col + 1; j++) {
if (i >= 0 && i < ROW && j >= 0 && j < COL && board[i][j] == 1) {
count++;
}
}
}
return count;
}
// 显示游戏面板
void display_board() {
int i, j;
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
if (visited[i][j] == 0) {
printf("X ");
} else if (board[i][j] == 1) {
printf("* ");
} else {
printf("%d ", count_mine(i, j));
}
}
printf("\n");
}
}
// 翻开格子
void flip(int row, int col) {
visited[row][col] = 1;
if (board[row][col] == 1) {
printf("Game Over!\n");
exit(0);
}
if (count_mine(row, col) == 0) {
int i, j;
for (i = row - 1; i <= row + 1; i++) {
for (j = col - 1; j <= col + 1; j++) {
if (i >= 0 && i < ROW && j >= 0 && j < COL && visited[i][j] == 0) {
flip(i, j);
}
}
}
}
}
// 判断游戏是否胜利
int check_win() {
int i, j;
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
if (board[i][j] == 0 && visited[i][j] == 0) {
return 0;
}
}
}
return 1;
}
int main() {
srand(time(NULL));
mine_num = MINE_NUM;
generate_mine();
display_board();
while (1) {
int row, col;
printf("Please enter row and col: ");
scanf("%d %d", &row, &col);
if (row < 0 || row >= ROW || col < 0 || col >= COL) {
printf("Invalid input!\n");
continue;
}
flip(row, col);
display_board();
if (check_win()) {
printf("You win!\n");
break;
}
}
return 0;
}
在这个示例代码中,使用二维数组board
表示游戏面板,其中0表示空格,1表示有地雷的格子。使用二维数组visited
表示是否已经访问过该格子。使用generate_mine
函数随机生成地雷的位置,使用count_mine
函数计算周围雷的数量,使用display_board
函数显示游戏面板,使用flip
函数翻开格子,使用check_win
函数判断游戏是否胜利。