新闻资讯

新闻资讯 行业动态

C【练习】(扫雷小游戏)

编辑:006     时间:2020-02-12
本页详细解读 C语言控制台小程序 扫雷小游戏。实现使用控制台小程序,完成扫雷小程序(1.0)!!!

话不多说直接贴上效果图接下来开始叙述怎么做出成果
这里我在实现的过程中按照先写骨架,再写功能,最后补全(不够专业的叙述)
Main()

承担小程序的核心运行,使扫雷可以正常的运行 且能在每一盘游戏之后可以选择继续游戏或者退出。

int main(){
    srand((unsigned int)time(NULL));
    while (1){
        int choice = Meau();
        if (choice){
            Game();
        }
        else{
            break;
        }
    }
    system("pause");
    return 0;
}

 

1.为什么这里要使用srand,后面会说
2.while 循环的使用保证我的游戏在结束时可以循环选择
3.int Choice 为我的功能做了一个选择开关这里也可以使用 switch 代替
Game()

Game()函数作为扫雷的主体,主要作用实现扫雷的主体实现,可以完成棋盘的初始化、用户的输入、输入坐标的判定、棋盘为用户的展示

void Game(){
    int Blank_Count = 0;  //记录空白格个数

    char out_map[ROW+2][COL+2];    //给人看的地图
    char mine_map[ROW+2][COL+2];    //地雷的地图

    Init(out_map,mine_map);                            //初始化地图
    
    while (1){
        system("cls");
        Display_Map(out_map);     //展示地图(地雷被隐藏)

        int row, col;
        printf("输入检测的坐标:");
        scanf("%d %d", &row, &col);

        if (row<1 || row>ROW || COL<1 || col>COL){
            printf("坐标非法,重新输入:\n");
            continue;
        }    //检查坐标是否合法

        //检验是否踩到地雷
        if (mine_map[row][col] == '1'){
            printf("踩到地雷GG\n");
            break;          //直接结束Game()
        }

        //验证是否扫雷成功
        ++Blank_Count;
        if (Blank_Count == ROW*COL - MINE_COUNT){
            printf("胜利!!!\n");
            break;
        }

        //更新地图
        Update_Out_Map(out_map,row,col,mine_map);
    }
    Display_Map(mine_map);
}

 

1.使用char 类型初始化 out_map[ROW+2][COL+2]、mine_map[ROW+2][COL+2]一个作为给用户展示的棋盘一个作为存储地雷信息的棋盘
2.while 的作用在游戏中实现 用户输入、棋盘检测、地图打印 循环操作
3.if(row<1 || row>ROW || COL<1 || col>COL) 判定用户输入坐标的合法 不合法则重新输入,保证用户输入的坐标在[1,9]上
4.定义有地雷的地方为‘1’,if (mine_map[row][col] == ‘1’),如果挂掉就 Display_Map 打印所有信息棋盘
5.当活着走到这一步证明之前都是正确操作没有踩雷所以 空白格子数量 ++Blan_Count
6,将这里的所有信息更新进入地图信息,
Init()

按照Game()提供的思路我们当然先初始化数组
分两种情况
out_map 为用户展示的地图当然初始化全为空格
mine_map 地雷我在这里定义两种情况0/1 初始化无雷全为0

int Init(char out_map[ROW+2][COL+2], char mine_map[ROW+2][COL+2]){
    //out_map初始化全为 空格
    for (int row = 0; row < ROW + 2; row++){
        for (int col = 0; col < COL + 2; col++){
            out_map[row][col] = ' ';
        }
    }
     // 2.把mine_map初始化全是 '0'
    for (int row = 0; row < ROW + 2; row++){
        for (int col = 0; col < COL + 2; col++){
            mine_map[row][col] = '0';
        }
    }
    //3.随机种地雷
    int mine_count = MINE_COUNT;
    while (mine_count>0){
        int row = rand() % ROW + 1;
        int col = rand() % COL + 1;
        if (mine_map[row][col] == '1'){
            continue;
        }
        else{
            mine_map[row][col] = '1';
            --mine_count;
        }
    }
    return 0;
}  



1.通过 #define MINE_COUNT定义地雷数作为限制条件
2.while(mine_count) 种雷的限制条件
3.采用随机数种雷 rand%ROW+1;
%ROW的结果为0-8 但是为了适应我们的棋盘所以+1
4.注意在种雷时 的种种影响 比如 该位置不能有雷
Display_Map()

打印地图
按照我们的需求打印整个map
我这里放 代码方便 以后使用
void Display_Map(char out_map[ROW+2][COL+2]){
//打印地图 与对应坐标
printf(" ||");
//打印列坐标
for (int i = 1; i <= ROW; i++){
printf(" %d “, i);
}
printf(”\n");
//打印横线
for (int i = 0; i <= ROW; i++){
printf("===", i);
}
printf("\n");
for (int row = 1; row <= ROW; row++){
printf(" %d||",row);
for (int col = 1; col <= COL; col++){
printf(" %c “, out_map[row][col]);
}
printf(”\n");
}
}
Update_Out_Map()

实现 检测空白格周围地雷的个数并且将它展示给用户

void Update_Out_Map(char out_map[ROW+2][COL+2],int row,int col,char mine_map[ROW+2][COL+2]){
     //统计当前位置周围格子地雷数字 将数字更新 out_map
    // row 1-9 col 1-9  row-1不会越界
    //加入边框 防止 数组越界
    int count = 0; //发现的地雷数字
    /*if (mine_map[row-1][col - 1] == '1'){
        ++count;
    }

    if (mine_map[row-1][col] == '1'){
        ++count;
    }

    if (mine_map[row-1][col + 1] == '1'){
        ++count;
    }

    if (mine_map[row][col - 1] == '1'){
        ++count;
    }


    if (mine_map[row][col + 1] == '1'){
        ++count;
    }

    if (mine_map[row+1][col - 1] == '1'){
        ++count;
    }

    if (mine_map[row+1][col] == '1'){
        ++count;
    }

    if (mine_map[row+1][col + 1] == '1'){
        ++count;
    }*/

    count = (mine_map[row - 1][col - 1] - '0')
        + (mine_map[row - 1][col] - '0')
        + (mine_map[row - 1][col + 1] - '0')
        + (mine_map[row][col - 1] - '0')
        + (mine_map[row][col + 1] - '0')
        + (mine_map[row + 1][col - 1] - '0')
        + (mine_map[row + 1][col] - '0')
        + (mine_map[row + 1][col + 1] - '0');

    out_map[row][col] ='0'+count;  //整形转换为字符型 0-9
}



1.这里集中解释一下为什么我要给 map +2,这个行为称之为加边框 就是为了在这里解决这个特殊的问题,当安全的空白格在(1,1)(1,9)…这些特殊的位置他周围有一些或部分假如我们没有+2就会发生数组越界

用图看代码一看就懂!!!

生命不息!!奋斗不止!!

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

回复列表

相关推荐