用C语言写一个扫雷游戏
时间: 2023-07-01 16:19:21 浏览: 72
好的,以下是一个简单的扫雷游戏的 C 语言代码,供你参考:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 9 // 行数
#define COL 9 // 列数
#define MINE_NUM 10 // 地雷数
int mine_map[ROW][COL]; // 地雷地图
int game_map[ROW][COL]; // 游戏地图
void init_map() {
// 初始化地图
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
mine_map[i][j] = 0;
game_map[i][j] = -1;
}
}
}
void init_mine() {
// 初始化地雷
int n = MINE_NUM;
while (n > 0) {
int x = rand() % ROW;
int y = rand() % COL;
if (mine_map[x][y] == 0) {
mine_map[x][y] = 1;
n--;
}
}
}
void print_map() {
// 打印地图
printf(" ");
for (int j = 0; j < COL; j++) {
printf("%d ", j + 1);
}
printf("\n");
for (int i = 0; i < ROW; i++) {
printf("%d ", i + 1);
for (int j = 0; j < COL; j++) {
if (game_map[i][j] == -1) {
printf(". ");
} else if (game_map[i][j] == 0) {
printf("O ");
} else {
printf("%d ", game_map[i][j]);
}
}
printf("\n");
}
}
int count_mine(int x, int y) {
// 计算一个位置周围的地雷数
int count = 0;
for (int i = x - 1; i <= x + 1; i++) {
for (int j = y - 1; j <= y + 1; j++) {
if (i >= 0 && i < ROW && j >= 0 && j < COL && mine_map[i][j] == 1) {
count++;
}
}
}
return count;
}
void expand_map(int x, int y) {
// 扩展地图
if (x < 0 || x >= ROW || y < 0 || y >= COL || game_map[x][y] != -1) {
return;
}
int count = count_mine(x, y);
game_map[x][y] = count;
if (count == 0) {
expand_map(x - 1, y - 1);
expand_map(x - 1, y);
expand_map(x - 1, y + 1);
expand_map(x, y - 1);
expand_map(x, y + 1);
expand_map(x + 1, y - 1);
expand_map(x + 1, y);
expand_map(x + 1, y + 1);
}
}
int check_win() {
// 检查是否胜利
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
if (mine_map[i][j] == 0 && game_map[i][j] == -1) {
return 0;
}
}
}
return 1;
}
int main() {
srand(time(NULL));
init_map();
init_mine();
while (1) {
print_map();
int x, y;
printf("请输入要扫的位置(x y): ");
scanf("%d%d", &x, &y);
if (mine_map[x - 1][y - 1] == 1) {
printf("你输了!\n");
break;
}
expand_map(x - 1, y - 1);
if (check_win()) {
printf("你赢了!\n");
break;
}
}
return 0;
}
```
这只是一个简单的实现,还有很多可以改进的地方,比如添加计时、记录最高分等功能。