C 碎片十一 扫雷源码
// 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; }