如何用C语言编程扫雷游戏
时间: 2024-05-12 13:14:23 浏览: 8
以下是一个简单的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 show_map[ROW][COL]; // 显示地图
// 初始化地图
void init_map()
{
int i, j, count;
srand((unsigned int)time(NULL)); // 初始化随机数种子
// 先将地图全部置为0
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
mine_map[i][j] = 0;
show_map[i][j] = -1;
}
}
// 随机生成雷
count = 0;
while (count < MINE_NUM) {
i = rand() % ROW;
j = rand() % COL;
if (mine_map[i][j] == 0) {
mine_map[i][j] = 1;
count++;
}
}
}
// 统计周围雷的数量
int count_mines(int row, int col)
{
int count = 0, 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 && mine_map[i][j] == 1) {
count++;
}
}
}
return count;
}
// 显示地图
void show()
{
int i, j;
printf(" ");
for (j = 0; j < COL; j++) {
printf("%d ", j + 1);
}
printf("\n");
for (i = 0; i < ROW; i++) {
printf("%d ", i + 1);
for (j = 0; j < COL; j++) {
if (show_map[i][j] == -1) {
printf("* ");
}
else if (show_map[i][j] == 0) {
printf("- ");
}
else {
printf("%d ", show_map[i][j]);
}
}
printf("\n");
}
}
// 扫雷
void sweep(int row, int col)
{
if (mine_map[row][col] == 1) {
printf("You lose!\n");
show_map[row][col] = 9;
show();
exit(0);
}
else {
show_map[row][col] = count_mines(row, col);
if (show_map[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 && show_map[i][j] == -1) {
sweep(i, j);
}
}
}
}
}
}
int main()
{
int row, col;
init_map();
show();
while (1) {
printf("Please input the row and col: ");
scanf("%d %d", &row, &col);
if (row < 1 || row > ROW || col < 1 || col > COL) {
printf("Invalid input, please input again!\n");
continue;
}
row--;
col--;
if (show_map[row][col] != -1) {
printf("This cell has been opened, please choose another one!\n");
continue;
}
sweep(row, col);
show();
printf("\n");
}
return 0;
}
```
这个程序使用了两个二维数组,`mine_map` 用于存储地图上雷的位置,1 表示有雷,0 表示没有雷;`show_map` 用于存储玩家可见的地图,-1 表示未翻开的方格,0 表示周围没有雷,1-8 表示周围雷的数量,9 表示踩到了雷。
程序中的 `init_map` 函数用于初始化地图,首先将所有格子都置为0,然后随机生成10个雷的位置。`count_mines` 函数用于统计某个格子周围雷的数量,它遍历了这个格子周围的8个格子,如果这个格子是雷,则计数器加1。
主函数中的循环用于不断接受玩家的输入,每次输入一个格子的行列坐标,程序判断该格子是否已经被翻开,如果已经翻开,则提示玩家重新选择一个未翻开的格子。否则,程序调用 `sweep` 函数对这个格子进行扫雷操作,如果踩到了雷,则游戏结束,否则显示地图。