C语言趣味小游戏----扫雷游戏

一:扫雷游戏分析和设计

1.扫雷游戏的功能说明

  • 使⽤控制台实现经典的扫雷游戏
  • 游戏可以通过菜单实现继续玩或者退出游戏
  • 扫雷的棋盘是9*9的格⼦
  • 默认随机布置10个雷
  • 可以排查雷
  • 如果位置不是雷,就显⽰周围有⼏个雷
  • 如果位置是雷,就炸死游戏结束
  • 把除10个雷之外的所有⾮雷都找出来,排雷成功,游戏结束

游戏的界⾯:

2.游戏的分析和设计

  • 数据结构的分析

扫雷的过程中,布置的雷和排查出的雷的信息都需要存储,所以我们需要⼀定的数据结构来存储这些 信息。

因为我们需要在9*9的棋盘上布置雷的信息和排查雷,我们⾸先想到的就是创建⼀个9*9的数组来存放 信息

那如果这个位置布置雷,我们就存放1,没有布置雷就存放0.

那如果这个位置布置雷,我们就存放1,没有布置雷就存放0

假设我们排查(2,5)这个坐标时,我们访问周围的⼀圈8个⻩⾊位置,统计周围雷的个数是1

假设我们排查(8,6)这个坐标时,我们访问周围的⼀圈8个⻩⾊位置,统计周围雷的个数时,最下⾯的三 个坐标就会越界,为了防⽌越界,我们在设计的时候,给数组扩⼤⼀圈,雷还是布置在中间的9*9的坐 标上,周围⼀圈不去布置雷就⾏,这样就解决了越界的问题。所以我们将存放数据的数组创建成11*11 是⽐较合适

再继续分析,我们在棋盘上布置了雷,棋盘上雷的信息(1)和⾮雷的信息(0),假设我们排查了某 ⼀个位置后,这个坐标处不是雷,这个坐标的周围有1个雷,那我们需要将排查出的雷的数量信息记录 存储,并打印出来,作为排雷的重要参考信息的。那这个雷的个数信息存放在哪⾥呢?如果存放在布 置雷的数组中,这样雷的信息和雷的个数信息就可能或产⽣混淆和打印上的困难

这⾥我们肯定有办法解决,⽐如:雷和⾮雷的信息不要使⽤数字,使⽤某些字符就⾏,这样就避免冲 突了,但是这样做棋盘上有雷和⾮雷的信息,还有排查出的雷的个数信息,就⽐较混杂,不够⽅便。 这⾥我们采⽤另外⼀种⽅案,我们专⻔给⼀个棋盘(对应⼀个数组mine)存放布置好的雷的信息,再 给另外⼀个棋盘(对应另外⼀个数组show)存放排查出的雷的信息。这样就互不⼲扰了,把雷布置到 mine数组,在mine数组中排查雷,排查出的数据存放在show数组,并且打印show数组的信息给后期 排查参考。 同时为了保持神秘,show数组开始时初始化为字符'*',为了保持两个数组的类型⼀致,可以使⽤同⼀ 套函数处理,mine数组最开始也初始化为字符'0',布置雷改成'1'。如下如:

对应的数组应该是:

char mine[11][11] = {0}; ⽤来存放布置好的雷的信息

char show[11][11] = {0}; ⽤来存放排查出的雷的个数信息

当然上面的数组还可以优化一下,上面是只能存放11个字符,这样的棋盘大小就是11*11的规模,但是当我们需要更大的棋盘的时候,我们只能将11更改,然后才能实现更大的棋盘规模,这样显的非常麻烦,每换一次模式,我们就要改这个数组,于是我们有一个方法可以避免这样麻烦,就是设置参数,将棋盘的行与列分别用row 与 col 来进行传参设置,这样需要什么就要什么,非常的方便

二:扫雷游戏的代码实现

  • ⽂件结构设计

之前学习了多⽂件的形式对函数的声明和定义,这⾥我们实践⼀下,我们设计三个⽂件:

test.c ⽂件中写游戏的测试逻辑

game.c ⽂件中写游戏中函数的实现等

game.h ⽂件中写游戏需要的数据类型和函数声明等

game.h文件

代码如下:

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>



//函数的定义(我们可以随便设置棋盘的大小)

// show棋盘
#define ROW 9  //9行  玩游戏的时候显示出来的棋盘大小
#define COL 9  //9列  

//mine棋盘
#define ROWS ROW+2   //11行   我们实际设置的棋盘大小
#define COLS COL+2   //11列

//设置10个雷
#define EASY_COUNT 10




//函数的声明
void InitBoard(char arr[ROWS][COLS], int rows  , int cols  ,char set);  //棋盘初始化的函数
                                        //11格棋盘

void DisplayBoard(char arr[ROWS][COLS], int row, int col);  //打印棋盘的函数
                                        // 9格棋盘   

void  Set_mine(char arr[ROWS][COLS], int row, int col);     //在mine棋盘里面布置雷的位置


void  Find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);    //排查出9*9mine棋盘周围所存在的雷
int Get_mine_count(char mine[ROWS][COLS], int x, int y);

现在我们将上面的代码一一的给大家解释一下

下面的头文件大家应该很熟悉了

使用printf函数的时候用的头文件

#include<stdio.h>

rand函数(生成随机数) 与srand函数(生成随机数种子)需要的头文件

#include<stdlib.h>

time函数需要的头文件

#include<time.h>

srand((unsigned int)time(NULL)); //这里需要使用time定义

下面的代码就是设置我们的棋盘规模大小与设置雷的个数所需要的函数的定义

show棋盘

#define ROW 9 //9行 玩游戏的时候显示出来的棋盘大小

#define COL 9 //9列

mine棋盘

#define ROWS ROW+2 //11行 我们实际设置的棋盘大小

#define COLS COL+2 //11列

设置10个雷

#define EASY_COUNT 10 //后面的中文意思:雷的数量10个

函数的声明,就是我们的主要写代码的那个文件里面需要这个函数的时候,又因为这个函数我们写在了其他文件里面,所以我们想要在多个文件里面使用函数的时候,就必须要函数的声明

棋盘初始化的函数

oid InitBoard(char arr[ROWS][COLS], int rows , int cols ,char set);

打印棋盘的函数

void DisplayBoard(char arr[ROWS][COLS], int row, int col);

在mine棋盘里面布置雷的位置

void Set_mine(char arr[ROWS][COLS], int row, int col);

排查出9*9mine棋盘周围所存在的雷 这里的函数名字可以随便设置的,这里为了方便看懂代码,所以我们设置函数名字的时候用英文缩写就行了,就比如Get_mine_count中文意思:获得mine的数量,这里的数量是指雷的数量

void Find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

int Get_mine_count(char mine[ROWS][COLS], int x, int y);

game.c文件

代码如下:

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

//棋盘初始化
void InitBoard(char arr[ROWS][COLS], int rows, int cols, int set)//11*11的棋盘
{
    int i = 0;
    for (i = 0; i < rows; i++)//行
    {
        int j = 0;
        for (j=0; j < cols; j++)//列
        {
            arr[i][j] = set;//将棋盘的参数设置为随机数,方便后面的设置棋盘的大小
        }
    }
}

 //打印棋盘       
void DisplayBoard(char arr[ROWS][COLS], int row, int col)//11*11的棋盘,但是游戏只会显示9*9的棋盘
{
    int i = 0;
   
    printf("----扫雷游戏----\n");

    //打印出第一列(横着的)的0-10的数字
    for (i = 0; i <= col; i++)//列循环(横着的)
    {
        printf("%d ", i);
    }
    printf("\n");


    //打印出第一行(竖着的)的1-10的数字
    for (i = 1; i <= row; i++)//行循环(竖着的)
    {

        int j = 0;
        printf("%d ", i);//将第一行(竖着的)打印出来

        for (j = 1; j <= col; j++)//列(横着的)
        {
            printf("%c ", arr[i][j]);//将行和列的星号打印出来
        }
        printf("\n");
    }
}

//在棋盘里面布置雷
void  Set_mine(char arr[ROWS][COLS], int row, int col)//布置雷的位置
{
    int count = EASY_COUNT;//布置雷的数量,这里我们先布置10个雷 并将它存放在count里面
    while (count)
    {
        int x = rand() % row + 1;//横 着的1-9格随机放置雷  rand函数是生成随机数   rand() % row余下0-8,加上1就是1-9了

        int y = rand() % col + 1;//竖 着的1-9格随机放置雷  使用rand函数之前要调用srand函数生成种子
        if (arr[x][y] == '0')//如果该位置没有布置雷,则为0 并且进入布置雷的循环
        {
            arr[x][y] = '1';  //将上面那个不是0的位置(没有雷)填上1个雷
            count--;  //每布置完1个雷就减少一次我们布置雷的个数,一直到将我们的10个雷布置完为止
        }
    }
}

//找出周围的雷
void  Find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
    int x = 0;
    int y = 0;
    int win = 0;
    while (win < row * col - EASY_COUNT)//row*col是81个格子,然后我们放了10个雷,所以还有71个格子不是雷,win< 是当我们把剩下71个格子全部点完之后,游戏就赢了,然后结束游戏
    {
        printf("请输入你要排查的坐标:");
        scanf("%d %d", &x, &y);

        if (x >= 1 && x <= row && y >= 1 && y <= col)//设置坐标的范围,row范围1-9   col范围1-9
        {

            if (show[x][y] == '*')//如果这个格子没有被排查,就是一个*号,那么则可以排查这个格子,否则就会让你重新输入
            {


                if (mine[x][y] == '1')//踩到雷的情况,就游戏结束
                {
                    printf("很遗憾,你被炸死了\n");
                    DisplayBoard(mine, ROW, COL);//被炸死后,显示出棋盘里面所有的雷
                    break;
                }
                else//不是雷的情况,我们就排查周围的雷
                {
                    int count = Get_mine_count(mine, x, y);//在mine棋盘中,将周围存在雷的数量存放到count里面
                    show[x][y] = count + '0';//将9*9棋盘的雷信息放到11*11棋盘里面去,加'0'是转换为雷的个数,1 2 3 4这样的,之前那是ASCOLL值的数字
                    DisplayBoard(show, ROW, COL);//将周围雷的熟练的信息显示出来,比如显示1,则说明周围有1个雷
                    win++;//当我们每排查一个数之后就加1,来记录我们已经排查了多少个格子,我们要一直排查到小于EASY_COUNT(10个雷)为止,然后跳出循环,游戏结束
                }


            }
            else
            {
                printf("你已经排查了这个坐标,请输入其他的坐标\n");
            }


        }
        else
        {
            printf("超出坐标范围,请在范围内重新输入\n");
        }
   }
    if (win == row * col - EASY_COUNT)//当我们把71个不是雷的格子排查完以后,就只剩下了10个雷在棋盘上,最终游戏胜利,结束游戏
    {
        printf("恭喜你,排雷成功,游戏结束\n");
        DisplayBoard(mine, ROW, COL);//游戏结束后,显示出剩下10个雷的具体位置
    }
}

找出周围8个格子里面的雷的个数
(计算原理:将周围8个格子全部加起来,然后得出的值就是我们周围雷的数量,如果加起来是3,说明周围有3个雷
int Get_mine_count(char mine[ROWS][COLS], int x, int y)
{
    return mine[x - 1][y] +
        mine[x - 1][y + 1] +
        mine[x][y - 1] +
        mine[x + 1][y - 1] +
        mine[x + 1][y] +
        mine[x + 1][y + 1] +
        mine[x][y + 1] +
        mine[x - 1][y + 1] - 8 * '0';

}

这里我给大家一一解释一下代码的意思

引用game.h文件里面的代码,

#include"game.h"

引用代码1:棋盘初始化

void InitBoard(char arr[ROWS][COLS], int rows, int cols, int set)

引用代码2:打印出棋盘

void DisplayBoard(char arr[ROWS][COLS], int row, int col)

引用代码3:在棋盘里面布置雷

void Set_mine(char arr[ROWS][COLS], int row, int col)

引用代码4:找出周围的雷

void Find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)

  • 棋盘初始化的代码如下:

这里的row 和 col分别是行和列的意思

arr[i][j] = set; 将棋盘的参数设置为随机数,方便后面的设置棋盘的大小

cpp 复制代码
//棋盘初始化
void InitBoard(char arr[ROWS][COLS], int rows, int cols, int set)//11*11的棋盘
{
    int i = 0;
    for (i = 0; i < rows; i++)//行
    {
        int j = 0;
        for (j=0; j < cols; j++)//列
        {
            arr[i][j] = set;//将棋盘的参数设置为随机数,方便后面的设置棋盘的大小
        }
    }
}

利用函数的传参来进行设置棋盘的规模大小

char arr[ROWS][COLS], int rows, int cols, int set)//11*11的棋盘

  • 打印棋盘的代码如下:
cpp 复制代码
//打印棋盘       
void DisplayBoard(char arr[ROWS][COLS], int row, int col)//11*11的棋盘,但是游戏只会显示9*9的棋盘
{
    int i = 0;
   
    printf("----扫雷游戏----\n");

    //打印出第一列(横着的)的0-10的数字
    for (i = 0; i <= col; i++)//列循环(横着的)
    {
        printf("%d ", i);
    }
    printf("\n");

    //打印出第一行(竖着的)的1-10的数字
    for (i = 1; i <= row; i++)//行循环(竖着的)
    {

        int j = 0;
        printf("%d ", i);//将第一行(竖着的)打印出来

        for (j = 1; j <= col; j++)//列(横着的)
        {
            printf("%c ", arr[i][j]);//将行和列的星号打印出来
        }
        printf("\n");
    }
}
  • 在棋盘里面布置雷的代码如下:
cpp 复制代码
//在棋盘里面布置雷
void  Set_mine(char arr[ROWS][COLS], int row, int col)//布置雷的位置
{
    int count = EASY_COUNT;//布置雷的数量,这里我们先布置10个雷 并将它存放在count里面
    while (count)
    {
        int x = rand() % row + 1;//横 着的1-9格随机放置雷  rand函数是生成随机数   rand() % row余下0-8,加上1就是1-9了

        int y = rand() % col + 1;//竖 着的1-9格随机放置雷  使用rand函数之前要调用srand函数生成种子
        if (arr[x][y] == '0')//如果该位置没有布置雷,则为0 并且进入布置雷的循环
        {
            arr[x][y] = '1';  //将上面那个不是0的位置(没有雷)填上1个雷
            count--;  //每布置完1个雷就减少一次我们布置雷的个数,一直到将我们的10个雷布置完为止
        }
    }
}

函数名字的意思:设置地雷

Set_mine

布置雷的数量,这里我们先布置10个雷 并将它存放在count里面

int count = EASY_COUNT;

横 着的1-9格随机放置雷 rand函数是生成随机数 rand() % row余下0-8,加上1就是1-9了

int x = rand() % row + 1;

竖 着的1-9格随机放置雷 使用rand函数之前要调用srand函数生成种子

int y = rand() % col + 1;

如果该位置没有布置雷,则为0 并且进入布置雷的循环(利用坐标来定义格子的位置)

cpp 复制代码
if (arr[x][y] == '0')//如果该位置没有布置雷,则为0 并且进入布置雷的循环
        {
            arr[x][y] = '1';  //将上面那个不是0的位置(没有雷)填上1个雷
            count--;  //每布置完1个雷就减少一次我们布置雷的个数,一直到将我们的10个雷布置完为止
        }

每布置完1个雷就减少一次我们布置雷的个数,一直到将我们的10个雷布置完为止

count--;

将上面那个不是0的位置(没有雷)填上1个雷

arr[x][y] = '1';

  • 找出周围的雷的代码
cpp 复制代码
//找出周围的雷
void  Find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
    int x = 0;
    int y = 0;
    int win = 0;
    while (win < row * col - EASY_COUNT)//row*col是81个格子,然后我们放了10个雷,所以还有71个格子不是雷,win< 是当我们把剩下71个格子全部点完之后,游戏就赢了,然后结束游戏
    {
        printf("请输入你要排查的坐标:");
        scanf("%d %d", &x, &y);

        if (x >= 1 && x <= row && y >= 1 && y <= col)//设置坐标的范围,row范围1-9   col范围1-9
        {

            if (show[x][y] == '*')//如果这个格子没有被排查,就是一个*号,那么则可以排查这个格子,否则就会让你重新输入
            {


                if (mine[x][y] == '1')//踩到雷的情况,就游戏结束
                {
                    printf("很遗憾,你被炸死了\n");
                    DisplayBoard(mine, ROW, COL);//被炸死后,显示出棋盘里面所有的雷
                    break;
                }
                else//不是雷的情况,我们就排查周围的雷
                {
                    int count = Get_mine_count(mine, x, y);//在mine棋盘中,将周围存在雷的数量存放到count里面
                    show[x][y] = count + '0';//将9*9棋盘的雷信息放到11*11棋盘里面去,加'0'是转换为雷的个数,1 2 3 4这样的,之前那是ASCOLL值的数字
                    DisplayBoard(show, ROW, COL);//将周围雷的熟练的信息显示出来,比如显示1,则说明周围有1个雷
                    win++;//当我们每排查一个数之后就加1,来记录我们已经排查了多少个格子,我们要一直排查到小于EASY_COUNT(10个雷)为止,然后跳出循环,游戏结束
                }


            }
            else
            {
                printf("你已经排查了这个坐标,请输入其他的坐标\n");
            }


        }
        else
        {
            printf("超出坐标范围,请在范围内重新输入\n");
        }
   }
    if (win == row * col - EASY_COUNT)//当我们把71个不是雷的格子排查完以后,就只剩下了10个雷在棋盘上,最终游戏胜利,结束游戏
    {
        printf("恭喜你,排雷成功,游戏结束\n");
        DisplayBoard(mine, ROW, COL);//游戏结束后,显示出剩下10个雷的具体位置
    }
}

找出周围8个格子里面的雷的个数
(计算原理:将周围8个格子全部加起来,然后得出的值就是我们周围雷的数量,如果加起来是3,说明周围有3个雷
int Get_mine_count(char mine[ROWS][COLS], int x, int y)
{
    return mine[x - 1][y] +
        mine[x - 1][y + 1] +
        mine[x][y - 1] +
        mine[x + 1][y - 1] +
        mine[x + 1][y] +
        mine[x + 1][y + 1] +
        mine[x][y + 1] +
        mine[x - 1][y + 1] - 8 * '0';

}

函数名字的意思:找出地雷

Find_mine

row*col是81个格子,然后我们放了10个雷,所以还有71个格子不是雷,win< 是当我们把剩下71个格子全部点完之后,游戏就赢了,然后结束游戏

while (win < row * col - EASY_COUNT)

设置坐标的范围,row范围1-9 col范围1-9

if (x >= 1 && x <= row && y >= 1 && y <= col)

如果这个格子没有被排查,就是一个*号,那么则可以排查这个格子,否则就会让你重新输入

if (show[x][y] == ' * ' )

进入踩到雷的循环情况,就游戏结束

if (mine[x][y] == '1')

在mine棋盘中,将周围存在雷的数量存放到count里面

int count = Get_mine_count(mine, x, y);

将9*9棋盘的雷信息放到11*11棋盘里面去,加'0'是转换为雷的个数,1 2 3 4这样的,之前那是ASCOLL值的数字

show[x][y] = count + '0';

将周围雷的熟练的信息显示出来,比如显示1,则说明周围有1个雷

DisplayBoard(show, ROW, COL);

当我们每排查一个数之后就加1,来记录我们已经排查了多少个格子,我们要一直排查到小于EASY_COUNT(10个雷)为止,然后跳出循环,游戏结束

win++;

当我们把71个不是雷的格子排查完以后,就只剩下了10个雷在棋盘上,最终游戏胜利,结束游戏

if (win == row * col - EASY_COUNT)

找出周围8个格子里面的雷的个数

计算原理:将周围8个格子全部加起来,然后得出的值就是我们周围雷的数量,如果加起来是3,说明周围有3个雷

int Get_mine_count是获得地雷数量的意思

int Get_mine_count(char mine[ROWS][COLS], int x, int y)

{

return mine[x - 1][y] +

mine[x - 1][y + 1] +

mine[x][y - 1] +

mine[x + 1][y - 1] +

mine[x + 1][y] +

mine[x + 1][y + 1] +

mine[x][y + 1] +

mine[x - 1][y + 1] - 8 * '0';

}

  • 主函数代码如下(我们一开始写的main函数)
cpp 复制代码
void menu()//简单的创建游戏的界面,不用返回什么值,所以用void
{
	printf("************************\n");
	printf("*****  1.play   ********\n");
	printf("*****  0.exit   ********\n");
	printf("************************\n");
}

void game()//将扫雷的游戏内容存入到这个函数里面去,不用进行任何的返回,因此用void
{
	char mine[ROWS][COLS] = { 0 };//数组全部初始化为 0
	//11*11的棋盘大小,用来存放已经布置好雷的信息,简单来说就是雷的位置

	char show[ROWS][COLS] = { 0 };//数字全部初始化为 *
	//11*11的棋盘大小,用来存放已经排查出的雷的个数信息,简单来说就是,你点了一个格子,然后它显示出了1或则2 3 4等,说明它周围有1 2 3 4等个雷

	InitBoard(mine, ROWS, COLS, '0');//InitBoard中文是 '初始化棋盘'的意思 
	InitBoard(show, ROWS, COLS, '*');//将show以及后面的进行传参到game.c和game.h的文件里面去

	Set_mine(mine , ROW , COL);//【给mine棋盘布置好雷】
	DisplayBoard(mine, ROW, COL);

	DisplayBoard(show, ROW, COL);// DisplayBoard中文意思是【打印棋盘】的意思

	Find_mine(mine, show, ROW, COL);//排查出9*9mine棋盘周围的雷

}

void test()//不用返回什么值,所以用void
{
	int input = 0;//存放输出值的地方

	srand((unsigned int)time(NULL));//生成随机数种子  使用srand函数要加头文件#include<stdlib.h>
	                                                //使用time函数要加头文件#include<time.h>
	do
	{
		menu();//将游戏界面分装到这个函数里面去
		printf("请选择:>");
		scanf("%d", &input);//输出1或则0或则其他,并且将输出值存放到input
		switch (input)
		{
		case 1 ://输出1的情况
			printf("扫雷\n");
			game();//将扫雷的游戏内容分装到这个函数里面去
			break;
		case 0://输出0的情况
			printf("游戏结束,退出游戏\n");
			break;
		default://输出其他值的情况
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);//1为真,会继续游戏  0为假,则结束游戏  非0则重新开始,这样形成了一个循环
}

int main()
{
	test();//分装函数,为了避免主函数的冗长

	return 0;
}

现在我们一一解释一下上面的代码

最开始的代码,梦的开始,这里我写的代码是倒着的,所以大家想要看的话,建议从下往上来看,这样可能好理解

这里的test()是分装函数,为了避免主函数的冗长,其实我们的主函数就这三行,所有的内容全部都分装到了test函数里面去了

cpp 复制代码
int main()
{
	test();//分装函数,为了避免主函数的冗长

	return 0;
}

上面代码开始进入test函数后的代码如下:

cpp 复制代码
void test()//不用返回什么值,所以用void
{
	int input = 0;//存放输出值的地方

	srand((unsigned int)time(NULL));//生成随机数种子  使用srand函数要加头文件#include<stdlib.h>
	                                                //使用time函数要加头文件#include<time.h>
	do
	{
		menu();//将游戏界面分装到这个函数里面去
		printf("请选择:>");
		scanf("%d", &input);//输出1或则0或则其他,并且将输出值存放到input
		switch (input)
		{
		case 1 ://输出1的情况
			printf("扫雷\n");
			game();//将扫雷的游戏内容分装到这个函数里面去
			break;
		case 0://输出0的情况
			printf("游戏结束,退出游戏\n");
			break;
		default://输出其他值的情况
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);//1为真,会继续游戏  0为假,则结束游戏  非0则重新开始,这样形成了一个循环
}

这里我们进入 menu(); 将游戏界面分装到这个函数里面去,简单的创建游戏的界面,不用返回什么值,所以用void

代码如下:

cpp 复制代码
void menu()//简单的创建游戏的界面,不用返回什么值,所以用void
{
	printf("************************\n");
	printf("*****  1.play   ********\n");
	printf("*****  0.exit   ********\n");
	printf("************************\n");
}

上面最基本的代码执行完之后我们就开始进入游戏环节,game()函数,整个扫雷游戏的核心地方

game()函数代码如下:

下面的函数名字设置都是有意义的InitBoard中文意思是 ' 初始化棋盘 '

DisplayBoard是 ' 显示棋盘 ' 的意思

Find_mine是 "找出地雷"的意思

下面所有的函数都是利用传参来将我们的数据传到我们对应的函数里面去

cpp 复制代码
void game()//将扫雷的游戏内容存入到这个函数里面去,不用进行任何的返回,因此用void
{
	char mine[ROWS][COLS] = { 0 };//数组全部初始化为 0
	//11*11的棋盘大小,用来存放已经布置好雷的信息,简单来说就是雷的位置

	char show[ROWS][COLS] = { 0 };//数字全部初始化为 *
	//11*11的棋盘大小,用来存放已经排查出的雷的个数信息,简单来说就是,你点了一个格子,然后它显示出了1或则2 3 4等,说明它周围有1 2 3 4等个雷

	InitBoard(mine, ROWS, COLS, '0');//InitBoard中文是 '初始化棋盘'的意思 
	InitBoard(show, ROWS, COLS, '*');//将show以及后面的进行传参到game.c和game.h的文件里面去

	Set_mine(mine , ROW , COL);//【给mine棋盘布置好雷】
	DisplayBoard(mine, ROW, COL);

	DisplayBoard(show, ROW, COL);// DisplayBoard中文意思是【打印棋盘】的意思

	Find_mine(mine, show, ROW, COL);//排查出9*9mine棋盘周围的雷

}

现在我们来实现一下扫雷的游戏

输出结果如下:按1进入游戏

这里我们选择我们要排查的坐标,2-2

结果如下:

这里我们显示的是1,说明周围有1个雷在这里

然后我们继续:这里我们选择2-3

是个0,说明周围没有雷

好了,上面就是我们所有的扫雷的代码了

相关推荐
71-33 小时前
C语言——关机小程序(有system()和strcmp()函数的知识点)
c语言·笔记·学习
_Hansen_4 小时前
【C】利用GCC扩展属性进行格式化字符串的静态检查
c语言·产品安全
云知谷10 小时前
【C++基本功】C++适合做什么,哪些领域适合哪些领域不适合?
c语言·开发语言·c++·人工智能·团队开发
.小小陈.15 小时前
数据结构2:单链表
c语言·开发语言·数据结构·笔记·学习方法
小莞尔16 小时前
【51单片机】【protues仿真】基于51单片机送带计数器系统
c语言·单片机·嵌入式硬件·物联网·51单片机
云知谷17 小时前
【嵌入式基本功】单片机嵌入式学习路线
linux·c语言·c++·单片机·嵌入式硬件
Word码18 小时前
[排序算法]希尔排序
c语言·数据结构·算法·排序算法
来生硬件工程师19 小时前
【STM32笔记】:P03 ISP 一键下载电路详解
c语言·笔记·stm32·嵌入式硬件·硬件工程·接口隔离原则·硬件设计
biter down20 小时前
c语言14:字符指针
c语言·开发语言