C 碎片十一 扫雷源码

来源:互联网 发布:python金融实战 编辑:程序博客网 时间:2024/06/11 01:41
// 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;}

 

原创粉丝点击