解析见注释!
1.程序的主体
int main() {
int n = 0;
srand((unsigned int)time(NULL));
do {
menu();
cin >> n;
switch (n) {
case 0:
printf("######## 退出游戏 #####\n");
break;
case 1:
printf("######## 开始游戏 #####\n");
play();
break;
default:
printf("######## 选择无效 #####\n");
break;
}
} while (n);
return 0;
}
2.主要函数
//游戏主体函数
void play() {
init_board(mine, '0');//初始化含炸弹的棋盘
init_board(look, '*');//初始化观看的棋盘
set_mine();//设置炸弹
//display(mine);//查看炸弹的分布情况
display(look);//默认打印一次棋盘
find_bomb();//排雷
}
3.全部程序
#include <iostream>
#include<algorithm>
using namespace std;
//扫雷游戏代码
#define row 9//棋盘的行数
#define col 9//棋盘的列数
#define rows row+2//实际整个棋盘的行数
#define cols col+2//实际整个棋盘的列数
#define bomb 10//炸弹数
char mine[rows][cols];//这个数组是存放炸弹的数组,我们是看不见的
char look[rows][cols];//这个数组是我们实际看的数组
int x, y,win=0;
//初始选项菜单
void menu(){
printf("#####请选择状态:########\n");
printf("##### 0:退出游戏 #####\n");
printf("##### 1:开始游戏 #####\n");
}
//根据给定的str来规定棋盘的初始化
void init_board(char arr[rows][cols],char str) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
arr[i][j] = str;
}
}
}
//通过随机函数来随机分布炸弹
void set_mine() {
int count = bomb;
while (count) {
int mine_x = rand() % 9 + 1;
int mine_y = rand() % 9 + 1;
if (mine[mine_x][mine_y] != '1') {
mine[mine_x][mine_y] = '1';
count--;
}
}
}
//计算当前坐标的附近共8个位置的炸弹总数
int get_bomb(char arr[rows][cols],int x,int y) {
return mine[x - 1][y - 1] +
mine[x][y - 1] +
mine[x + 1][y - 1] +
mine[x][y - 1] +
mine[x][y] +
mine[x][y + 1] +
mine[x + 1][y - 1] +
mine[x + 1][y] +
mine[x + 1][y + 1] - 8 * '0';
}
//输出棋盘
void display(char arr[rows][cols]) {
printf("-------- 扫雷棋盘 -----\n");
for (int i = 0; i <= row; i++) {
printf("%d ", i);
}
printf("\n");
for (int i = 1; i <= row; i++) {
printf("%d ", i);
for (int j = 1; j <= col; j++) {
printf("%c ", arr[i][j]);
}
printf("\n");
}
printf("-------- 扫雷棋盘 -----\n");
}
//排雷函数
void find_bomb() {
while (win <= row * col - bomb) {
printf("-------- 请输入检查地址-\n");
cin >> x >> y;
if (mine[x][y] == '1') {
printf("-------- 这是炸弹,你输了-\n");
break;
}
else {
int c = get_bomb(mine, x, y);
look[x][y] = (char)c;
display(look);
}
}
if (win == row * col - bomb) {
printf("-------- 全部找到,你赢了-\n");
}
}
//游戏主体函数
void play() {
init_board(mine, '0');//初始化含炸弹的棋盘
init_board(look, '*');//初始化观看的棋盘
set_mine();//设置炸弹
//display(mine);//查看炸弹的分布情况
display(look);//默认打印一次棋盘
find_bomb();//排雷
}
int main() {
int n = 0;
srand((unsigned int)time(NULL));
do {
menu();
cin >> n;
switch (n) {
case 0:
printf("######## 退出游戏 #####\n");
break;
case 1:
printf("######## 开始游戏 #####\n");
play();
break;
default:
printf("######## 选择无效 #####\n");
break;
}
} while (n);
return 0;
}
4.拓展
这个程序只能一次查看一个坐标的炸弹情况,不能一次查看多个左边。我现在比较忙,关于程序的拓展有一个想法。就是我们在find_bomb函数中,当c不为0时,置look数组当前坐标值为c值;当c为0时,我们就使用一个递归函数,依次查看该坐标附近8个坐标的含雷情况即c的值,如果为0,就重复上面过程;如果不为0,就只显示当前c的值并结束递归函数。
int c = get_bomb(mine, x, y);
look[x][y] = (char)c;
display(look);