c语言编写扫雷游戏代码并扫雷运行(简单)

什么是扫雷?

在这里插入图片描述

这是一款棋盘类型的游戏,系统会根据当前游戏的任务难度在棋盘内随机设置雷(雷是隐藏的)玩家需要通过分析排除雷的位置避免踩到雷,当我们排完后只剩下雷之后,游戏结束-玩家胜利,反之玩家游戏失败,重新游戏。
**当然理解完这些之前我们可以先创建了三个文件 夹,Game.c\Game.h\main.c。以便于代码的观赏性。当我们把这些工作完成后我们就可以理一下整体游戏的一个思路.
1.如何设置一个进入扫雷游戏的菜单(这里的话三字棋中有写过)
2.如何创建棋盘
3.如何将雷随机设置到棋盘上
4.如何让玩家排除雷
5.判断玩家输赢

**

1.创建扫雷的菜单栏

创建扫雷的菜单栏和井字棋的菜单栏相同,所以这里我直接把代码放上去了。
井字棋链接

菜单栏代码:

#include"Game.c"
void menu()
{
    printf("------------   扫雷   -------------\n");
    printf("***********************************\n");
    printf("*********    0.exit     ***********\n");
    printf("*********    1.enter    ***********\n");
    printf("***********************************\n");
    printf("------------   扫雷   --------------\n");
}

int main()
{
    int input = 0;
    do
    {
      menu();
    printf("Please_Choose:>>>>>>>>>");
    scanf("%d", &input);
    switch(input)
    {
        case 0:
            printf("program is quiting\n");
            break;
        case 1:
            printf("Start\n");
            break;
        default:
            printf("Please_Choose_all over again:>>\n");
        }
    } while (input);
    
    return 0;
}
运行一下看看程序是否可以可以跑起来

2.创建游戏中的棋盘

从switch语录中的cese 1中调用Game函数,可以将我们的printf替换掉

case 1:
            // printf("Start\n");
            Game();//调用Game函数
            break;

在我们的Game函数中创建两个数组mine数组用来系统布置雷,show数组为排除雷,玩家看不到系统布置的雷

void Game()
{
    char mine[ROWS][COLS] = {0};
    char show[ROWS][COLS] = {0};

}

首先我们先设置一个简单的模式,设置十个雷,在Game.h中deinfe 定义十个雷,而十个雷的话需要9x9的棋盘来置雷,我们define 定义row(行)和col(列)为9
而我们打印出来的是9x9的棋盘,但是我们在排雷时需要多置入两行两列来为我们开展后续的工作,所以define ROWS COLS为数组里的行列
main.c代码:
Game.h代码:

#include<stdio.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define mines 10

2.1初始化棋盘

我们来初始化棋盘mine中存放‘0’,方便进行埋雷,show中存放*隐藏雷的位置
main.c代码:

Init_board(mine, ROWS, COLS, '0'); 
Init_board(show, ROWS, COLS, '*'); 
Game.h代码:

> void Init_board(char board[ROWS][COLS],int rows,int cols,char set);
> //因为我们是初始化棋盘需要初始化为12X12棋盘

Game.c代码:

#include"Game.h"
void Init_board(char board[ROWS][COLS],int rows,int cols,char set)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < rows;i++)
    {
        for (j = 0; j < cols;j++)
        {
            board[i][j] = set;
            //这里的set为我们初始化的mine和show
        }
    }
}

2.2 打印棋盘内容

Display_board来打印棋盘的内容,打印的棋盘我们只需要打印9x9
main.c代码:

 Display_board(mine, ROW, COL);
 Display_board(show, ROW, COL);

Game.h

void Display_board(char board[ROWS][COLS],int row,int col);

Game.c

void Display_board(char board[ROWS][COLS],int row,int col)
{
    int i = 0;
    int j = 0;
    printf("----------------游戏开始------------------\n");
     for (j = 0; j <= col; j++)
        {
            printf("%d ",j);//打印y轴数,从0开始因为算上我们的x
        }
        printf("\n");//换行
        for (i = 1; i <= row; i++)
        {
            printf("%d ", i);//打印x轴数
            for (j = 1; j <= col; j++)
            {
                printf("%c ", board[i][j]);
            }
            printf("\n");//换行
        }
    printf("----------------游戏开始------------------\n");
//运行查看一下我们的运行结果是否正常
}

3.随机布置雷

埋雷的函数,需要埋到9x9的棋盘中
main.c代码:

   Buried_mine(mine, ROW, COL);

Game.h代码:

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

Game.c代码:
这里我们需要用到随机数,需要调用库函数包中的time函数和stdlib函数,原井字棋游戏有具体步骤
井字棋

void Buried_mine(char mine[ROWS][COLS],int row,int col)
{
    int x = 0;//x轴代表我们的行
    int y = 0;//y轴代表我们的列
    int count = mines;//我们define定义的十个雷
    while (count) // 这里我们需要一个循环来随机埋雷
    {
    int x = rand() % row + 1;//这里我们需要将随机数%row+1;因为row为9,而取模的随机数不能是本身,需要+1得到9行
    int y = rand() % col + 1;//和行相同
    if(mine[x][y]=='0')//如果mine[x][y]中的数为0
    {
        mine[x][y] = '1';//将其布置为1
        count--;//布置一个雷--,埋完10个雷跳出循环
    }
    }
}
//写完后我们运行一下,看是否可以看到随机布置的十个雷

这里我们需要看一下布置的十个雷,所以需要刚才的Display函数来显示出来
这里我查看一下运行的结果
在这里插入图片描述
10个雷已经布置到了mine棋盘中(当然这个棋盘是只有我们才可以看到)

4.排雷

main.c代码:
这里我们需要排雷,并显示到棋盘上,使用show显示

 Find_mine(mine, show, ROW, COL); 排雷,这里我们需要两个棋盘中的数据,将两个棋盘合并

Game.h代码:

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

Game.c代码:
Find_mine为我们排雷的函数
Get_Mine为我们在排雷过程中检查周围八个坐标是否有雷

int Get_Mine(char mine[ROWS][COLS], int x, int y)
{
    return (mine[x-1][y-1]+
            mine[x][y - 1] +
            mine[x + 1][y - 1] +
            mine[x - 1][y] +
            mine[x + 1][y] +
            mine[x - 1][y + 1] +
            mine[x][y + 1] +
            mine[x + 1][y + 1] - 8 * '0');//因为有八个坐标我们要将
}
void Find_mine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{
    int x = 0;//行
    int y = 0; //列
    int count = 0;//为排查的坐标,初始化0;
    //这里我们需要判断几种结果,坐标设置好,如果超出坐标范围怎么办,在坐标范围内,如果坐标被占怎么办,想好这些。我们就可以进行排雷了
    while (count<row*col-mines)//count<81-10
    {
        printf("请输入坐标排雷:>>>>>>>>");
        scanf("%d %d", &x,&y);
        if (x >= 1 && x <= row && y >= 1 && y <= col)//设置x,y中的范围
        {
            if(show[x][y]!='*')//如果show[x][y]不为*被占用
            {
                printf("该坐标被占据,重新输入:>>>>>>>>>\n");
            }
            else
            {
                if(mine[x][y]=='1')//如果为1,踩到雷,被炸死
                {
                    printf("排雷失败,请重新游戏\n");
                 	Display_board(mine, ROW, COL);
                 	//这里打印mine棋盘,让玩家看一下具体情况.
                    break;
                }
                else
                {
                    count++; // 排查出一个结果count++;
                    int sum = Get_Mine(mine, x, y);
                 //当我们下了一个坐标之后,我们需要检查周围的八个坐标是否有雷,rec来接收值
                    show[x][y] = sum + '0';//改为char类型
                    Display_board(show, ROW, COL);//排除后打印棋盘

                }
            }
        }
        else
        {
            printf("坐标超出范围请重新输入:>>>>>>>>>\n");//超出范围,就重新输入
        }
    }
    if(count==row*col-mines)
    {
        printf("排雷成功(。ì _ í。)!!!!!\n");
        Display_board(mine, ROW, COL);
    }
}
//整体的扫雷基础已经布置完成,完成后我们进行运行,查看是否有bug。

5.整体代码

main.c

#include"Game.c"
void Game()
{
    //创建两个数组mine数组用来系统布置雷,show数组为排除雷,玩家看不到系统布置的雷
    char mine[ROWS][COLS] = {0};
    char show[ROWS][COLS] = {0};
    Init_board(mine, ROWS, COLS, '0'); // 我们来初始化棋盘mine中存放‘0’,方便进行埋雷,show中存放*隐藏雷的位置
    Init_board(show, ROWS, COLS, '*');
    // Display_board(mine, ROW, COL);
    // Display_board(show, ROW, COL);
    Buried_mine(mine, ROW, COL);//埋雷的函数,需要埋到9x9的棋盘中
    Display_board(show, ROW, COL);
    Find_mine(mine, show, ROW, COL); // 排雷,这里我们需要两个棋盘中的数据,将两个棋盘合并
}
void menu()
{
    printf("------------   扫雷   -------------\n");
    printf("***********************************\n");
    printf("*********    0.exit     ***********\n");
    printf("*********    1.enter    ***********\n");
    printf("***********************************\n");
    printf("------------   扫雷   --------------\n");
}

int main()
{
    srand((int unsigned)time(NULL));
    int input = 0;
    do
    {
      menu();
    printf("Please_Choose:>>>>>>>>>");
    scanf("%d", &input);
    switch(input)
    {
        case 0:
            printf("program is quiting\n");
            break;
        case 1:
            // printf("Start\n");
            Game();//调用Game函数
            break;
        default:
            printf("Please_Choose_all over again:>>\n");
        }
    } while (input);
    
    return 0;
}

Game.h

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define mines 10
void Init_board(char board[ROWS][COLS],int rows,int cols,char set);
void Display_board(char board[ROWS][COLS],int row,int col);
void Buried_mine(char mine[ROWS][COLS],int row,int col);
void Find_mine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);

Game.c

#include"Game.h"
void Init_board(char board[ROWS][COLS],int rows,int cols,char set)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < rows;i++)
    {
        for (j = 0; j < cols;j++)
        {
            board[i][j] = set;
        }
    }
}
void Display_board(char board[ROWS][COLS],int row,int col)
{
    int i = 0;
    int j = 0;
    printf("----------------游戏开始------------------\n");
     for (j = 0; j <= col; j++)
        {
            printf("%d ",j);
        }
        printf("\n");//换行
        for (i = 1; i <= row; i++)
        {
            printf("%d ", i);
            for (j = 1; j <= col; j++)
            {
                printf("%c ", board[i][j]);
            }
            printf("\n");//换行
        }
    printf("----------------游戏开始------------------\n");

}
void Buried_mine(char mine[ROWS][COLS],int row,int col)
{
    int x = 0;//x轴代表我们的行
    int y = 0;//y轴代表我们的列
    int count = mines;//我们define定义的十个雷
    while (count) // 这里我们需要一个循环来随机埋雷
    {
    int x = rand() % row + 1;//这里我们需要将随机数%row+1;因为row为9,而取模的随机数不能是本身,需要+1得到9行
    int y = rand() % col + 1;//和行相同
    if(mine[x][y]=='0')//如果mine[x][y]中的数为0
    {
        mine[x][y] = '1';//将其布置为1
        count--;//布置一个雷--,埋完10个雷跳出循环
    }
    }
}
int Get_Mine(char mine[ROWS][COLS], int x, int y)
{
    return (mine[x-1][y-1]+
            mine[x][y - 1] +
            mine[x + 1][y - 1] +
            mine[x - 1][y] +
            mine[x + 1][y] +
            mine[x - 1][y + 1] +
            mine[x][y + 1] +
            mine[x + 1][y + 1] - 8 * '0');//因为有八个坐标我们要将
}
void Find_mine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{
    int x = 0;//行
    int y = 0; //列
    int count = 0;//为排查的坐标,初始化0;
    //这里我们需要判断几种结果,坐标设置好,如果超出坐标范围怎么办,在坐标范围内,如果坐标被占怎么办,想好这些。我们就可以进行排雷了
    while (count<row*col-mines)//count<81-10
    {
        printf("请输入坐标排雷:>>>>>>>>");
        scanf("%d %d", &x,&y);
        if (x >= 1 && x <= row && y >= 1 && y <= col)//设置x,y中的范围
        {
            if(show[x][y]!='*')//如果show[x][y]不为*被占用
            {
                printf("该坐标被占据,重新输入:>>>>>>>>>\n");
            }
            else
            {
                if(mine[x][y]=='1')//如果为1,踩到雷,被炸死
                {
                    printf("排雷失败,请重新游戏\n");
                    Display_board(mine, ROW, COL);//这里打印mine棋盘,让玩家看一下具体情况.
                    break;
                }
                else
                {
                     count++; // 排查出一个结果count++;
                     int sum = Get_Mine(mine, x, y);//当我们下了一个坐标之后,我们需要检查周围的八个坐标是否有雷,rec来接收值
                     show[x][y] = sum + '0';//改为char类型
                     Display_board(show, ROW, COL);//排除后打印棋盘

                }
            }
        }
        else
        {
            printf("坐标超出范围请重新输入:>>>>>>>>>\n");//超出范围,就重新输入
        }
    }
    if(count==row*col-mines)
    {
        printf("排雷成功(。ì _ í。)!!!!!\n");
        Display_board(mine, ROW, COL);
    }
}

总结:以上为扫雷基础的代码,简单的扫雷还是会相对来说简单很多,当然还有很多的功能需要完善,刚开始写博客可能写的不好希望大家见谅!!!谢谢大家的观看(o),希望大家的代码能力越来越厉害

  • 23
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值