简单版:1. 9*9棋盘
2. 随机生成10个雷
3. 所有雷都排查出来即扫雷成功(将所有非雷坐标排查出来,避免排到雷)
运行逻辑:
输入要排查的坐标后,显示该坐标周围雷的个数,(若该坐标为雷即炸死,游戏失败),找到哪个坐标为雷后避免排查,直到将所有非雷坐标排查出来,即游戏成功。
一、显示菜单栏
//菜单
void menu()
{
printf("********************\n");
printf("****** 1.play ******\n");
printf("****** 0.exit ******\n");
printf("********************\n");
}
二、进行游戏选择(1:进入游戏,0:退出游戏)
//游戏运行逻辑
void text()
{
srand((unsigned int)time(NULL));
int input = 0; //菜单选项
do
{
menu();
printf("请选择:");//1,0,其它
scanf("%d", &input);
switch (input)
{
case 1:
game(); //进入游戏
break;
case 0:
printf("退出游戏\n");
break;
default :
printf("选择错误,请重新选择\n");
break;
}
} while (input);
}
三、设置函数game()完成游戏运行
//game完成扫雷游戏
void game()
{
char mine[ROWS][COLS] = { 0 }; //棋盘mine初始化为字符‘0’
char show[ROWS][COLS] = { 0 }; //棋盘show初始化为字符‘*’
//初始化棋盘
Initboard(mine, ROWS, COLS, '0');
Initboard(show, ROWS, COLS, '*');
//打印棋盘
//Displayboard(mine, ROW, COL);
Displayboard(show, ROW, COL);
//布置雷
SetMine(mine, ROW, COL);
//Displayboard(mine, ROW, COL);
//排查雷
FindMine(mine, show, ROW, COL);
}
1、要设置两个棋盘:mine、show
mine棋盘:用来保存布置好的雷(棋盘中全为字符‘0’、‘1’,其中‘1’为雷)
show棋盘:用来排查雷(输入要排查的坐标后,在show棋盘上显示该坐标周围雷的个数)
//打印棋盘
void Displayboard(char arr[ROWS][COLS], int row, int col)
{
printf("------扫雷游戏-----\n");
for (int i = 0; i <= col; 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]);//错误:要用%c输出(字符)
}
printf("\n");
}
}
注意:因为在排查坐标周围雷的个数时,棋盘四周的坐标不足8个,因此在设置棋盘时为11*11棋盘,比原本的棋盘多一圈,并将这一圈设置为‘0’(非雷),便于排查。在打印棋盘时只打印9*9
2、布置雷(随机在棋盘上生成10个雷)
//布置雷
//生成随机的坐标 在9*9的棋盘内布置
void SetMine(char arr[ROWS][COLS], int row, int col)
{
int count = EASY_COUNT;//雷的个数
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (arr[x][y] == '0')
{
arr[x][y] = '1';
count--;
}
}
}
注:这里的x、y 的范围均在1~9,意为在11*11的棋盘中的9*9内布置雷。
3、排查雷(输入要排查的坐标,后显示其周围雷的个数)
如上图:输入坐标(2,4)后该坐标上显示1,即表示在其周围的8个坐标中有1个雷。
//排查雷
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
return (mine[x-1][y]+mine[x-1][y-1]+ mine[x - 1][y+1] + mine[x][y-1] + mine[x][y+1] + mine[x+1][y] + mine[x+1][y-1] + mine[x+1][y+1] - 8*'0');
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
while(win < row*col-EASY_COUNT)
{
printf("请输入排查的坐标x y:\n");
scanf("%d %d", &x, &y);
if (x > 0 && x <= row && y > 0 && y <= col)
{
if (mine[x][y] == '1')
{
printf("很遗憾,你被炸死了");
Displayboard(mine, ROW, COL);
break;
}
else
{
//统计该坐标周围雷的个数
int count = GetMineCount(mine, x, y);
show[x][y] = count + '0';
Displayboard(show, ROW, COL);
win++;
}
}
else
printf("坐标非法,请重新输入\n");
}
if (win == row * col - EASY_COUNT)
{
printf("恭喜你,排雷成功!!!");
Displayboard(mine, ROW, COL);
}
}