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;
}

 

posted on 2016-06-22 16:58  流浪_先生  阅读(199)  评论(0编辑  收藏  举报

导航