• 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)
    ");
            int bombNumber;
            scanf("%d",&bombNumber);
            if (bombNumber>=1&&bombNumber<=24) {
                break;
            }
        }
     */
        //方法2:
    //标签
    InPutLabel:
        printf("请输入雷的个数:(1-24)
    ");
        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表示输入过 那么就打印雷数 否则打印?
                        //	是一个制表符
                        printf("%c(%d,%d)	",a[i][j]+'0',i,j);
                    }else{
                        printf("?(%d,%d)	",i,j);
                    }
                }
                printf("
    ");
            }
            printf("请输入坐标:例如 2 4
    ");
            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)	",a[i][j]+'0',i,j);
                }else{
                    printf("?(%d,%d)	",i,j);
                }
            }
            printf("
    ");
        }
        if (winOrLose) {//1
            printf("小样!技术不错...再接再厉
    ");
        }else{
            printf("你得游戏是地理老师教得吧!
    ");
        }
        return;
    }
    
    int main(int argc, const char * argv[])
    {
        bomb();
        return 0;
    }
    
  • 相关阅读:
    阿里云Centos7安装和启动nginx
    mysql安装配置、主从复制配置详解
    php 文件大小计算转换
    tp5.0 生成二维码 + 合并海报图
    iTerm2 + Oh My Zsh
    linux 安装 卸载 命令
    php两个时间日期相隔的天数,时,分,秒.
    PhpStorm下载 + 破解
    php 地区三级联动
    PhpSpreadsheet 引入类库 导出 excel
  • 原文地址:https://www.cnblogs.com/markstray/p/5607789.html
Copyright © 2020-2023  润新知