// C语言版本扫雷
#include <stdio.h>
#include <stdlib.h>
/*
1(0,0) 1(0,1) 0(0,2) 1(0,3) 1(0,4)
@(1,0) 2(1,1) 1(1,2) 2(1,3) @(1,4)
1(2,0) 2(2,1) @(2,2) 3(2,3) 2(2,4)
0(3,0) 1(3,1) 3(3,2) @(3,3) 2(3,4)
0(4,0) 0(4,1) 2(4,2) @(4,3) 2(4,4)
*/
void bomb(void) {
//扫雷 是一个矩形图形 可以用二维数组存储数据
//存放雷 和 周围雷的个数
int a[5][5] = {};
//记录5*5的矩阵中的坐标 有没有输入过
int b[5][5] = {};
/* 判断输入雷的个数是否正确 不正确继续输入
while (1) {
printf("请输入雷的个数:(1-24)\n");
int bombNumber;
scanf("%d",&bombNumber);
if (bombNumber>=1&&bombNumber<=24) {
break;
}
}
*/
//方法2:
//标签
InPutLabel:
printf("请输入雷的个数:(1-24)\n");
int bombNumber;
scanf("%d",&bombNumber);
if (bombNumber>=1&&bombNumber<=24) {
//输入正确
}else{
//输入的超出范围
goto InPutLabel;//goto 跳转语句
//跳转到InPutLabel标签的位置 开始执行
}
/*
@****
*****
**@**
****@
*****
*/
//摆擂 有多少个雷 那么就随机产生多少个雷(坐标不能一样)
for (int i = 0; i < bombNumber; i++) {
//随机产生坐标 坐标范围(0-4,0-4)
int x = arc4random()%5;
int y = arc4random()%5;
//数字转化为数字字符 1+'0' -->'1'
//判断随机坐标有没有摆过雷
if (a[x][y] != '@'-'0') {
//布擂 '@'-'0'表示雷
a[x][y] = '@'-'0';
//遍历雷的周围 让周围雷数+1 遍历九宫格 的八个方向
//遍历 雷周围的矩阵
for (int m = x-1; m <= x+1; m++) {
for (int n = y-1; n <= y+1; n++) {
//判断边界 和周围是不是雷
if (m<0||m>4||n<0||n>4||a[m][n]=='@'-'0') {//超出边界 或者是雷
//雷数不能+1;
}else{
a[m][n]++;
}
}
}
}else{
//随机的恰好已经布过雷了得坐标
i--;//重新随机
}
}
//布雷之后
//开始玩游戏
//记录输入坐标的个数
int count = 0;
int winOrLose = 1;//1表示成功 0表示失败
//循环输入 坐标
while (1) {
system("clear");
//打印矩阵 5*5
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (1 == b[i][j]) {//判断这个坐标有没有输入过
//1表示输入过 那么就打印雷数 否则打印?
//\t是一个制表符
printf("%c(%d,%d)\t",a[i][j]+'0',i,j);
}else{
printf("?(%d,%d)\t",i,j);
}
}
printf("\n");
}
printf("请输入坐标:例如 2 4\n");
int bombX;
int bombY;
scanf("%d%d",&bombX,&bombY);
//判断是否是雷
if (a[bombX][bombY] == '@'-'0') {
//雷
winOrLose = 0;//失败
break;//跳出循环
}
//不是雷 那么 执行下面
if (b[bombX][bombY] != 1) {//判断坐标有没有输入过
//1表示输入过 0 表示没有
b[bombX][bombY] = 1;//记录输入过
count++;//无重复坐标个数
}
if (count == 5*5-bombNumber) {
//表示扫雷成功
winOrLose = 1;
break;
}
}
//结束之后再打印一次矩阵
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (1 == b[i][j]||winOrLose == 0) {
//如果坐标输入过 或者 失败了 显示出来数字或者是雷
printf("%c(%d,%d)\t",a[i][j]+'0',i,j);
}else{
printf("?(%d,%d)\t",i,j);
}
}
printf("\n");
}
if (winOrLose) {//1
printf("小样!技术不错...再接再厉\n");
}else{
printf("你得游戏是地理老师教得吧!\n");
}
return;
}
int main(int argc, const char * argv[])
{
bomb();
return 0;
}