#扫雷游戏,简单易懂,精细讲解

扫雷游戏大家肯定都玩过,每排出一个雷,那个地方就会显示周围有几个雷。

下面我附上代码给大家细讲:

这个是头文件和自己define的行数,列数,我写的是9*9的扫雷游戏,其中呢,有10个雷,定义的ROWS和COLS的作用之后会讲到

#include<stdio.h>
//#include"asaolei.h"
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9

#define ROWS ROW+2
#define COLS COL+2
#define Count 10
void initially(char arr[ROWS][COLS],int r,int c,char ch);
void DisplayBoard(char a[ROWS][COLS],int row,int col);
void setmine(char a[ROWS][COLS],int row,int col);

主函数:巨简单,游戏的完成是分成了多个函数

int main()
{
    test();
    
    
    return 0;
}

我们先来看看test函数:test函数呢给出了游戏的大致思路,我们开始游戏得有菜单,然后选择开始游戏或者退出,菜单很简单,就是简单的打印(附在了test函数底下)。该函数用力do-while循环,其中加了switch分支,选1开始游戏,选0结束游戏,选其他的重新输入,我们为什么case1后面加了一个n=0呢,因为一次游戏结束了程序就得结束了,如果n!=0,do-while循环不会停止。OK,这个明白了我们来看看真正发挥作用的game函数。

void test()
{
    int n;
    srand((unsigned int)time(NULL));
    do
    {
        menu();
        printf("请选择->");
        scanf("%d",&n);
        switch(n)
        {
            case 1 :
                game();
                n=0;
                break;
            case 0 :
                printf("游戏结束,退出游戏\n");
                break;
            default :
                printf("选择错误,请重新选择\n");
                break;

        }
    } while (n);
}
void menu()//游戏的菜单
{
    printf("********************\n");
    printf("******1、PLAY*******\n");
    printf("******0、exit*******\n");
    printf("********************\n");
}

game函数:函数里注释的都是在测试代码的时候用的,咱们测试正确性都可以试一试,当我们玩游戏的时候,埋下的雷肯定不能让别人看到呀,所以有一个埋雷的数组,一个展示给读者的“雷组”,那我们要怎么样埋雷呢,在mine数组’0‘代表不是雷,’1‘代表是雷(踩到你就要噶啦),所以我们先将两个数组初始化,mine数组为’0‘,show数组是’*‘,继续往下看initially函数

void game()//完成扫雷游戏
{
    char mine[ROWS][COLS] = {0};//全部初始化为‘0’
    char show[ROWS][COLS] = {0};// 全部初始化为‘*’
    //定义一个初始化函数完成初始化
    initially(mine,ROWS,COLS,'0');
    initially(show,ROWS,COLS,'*');
    //打印棋盘
    //DisplayBoard(mine,ROW,COL);
    //DisplayBoard(show,ROW,COL);
    //布置雷,在9*9的棋盘上随机布置10个雷
    setmine(mine,ROW,COL);
    //DisplayBoard(mine,ROW,COL);
    DisplayBoard(show,ROW,COL);
    //排查雷
    Findmine(mine,show,ROW,COL);

}

initially函数:initially(mine,ROWS,COLS,'0');
                            initially(show,ROWS,COLS,'*');我们要清楚型参和实参,是将全部数组初始化

下面要讲为神马define ROWS和COLS,当我们玩游戏的时候,查某个坐标周围有几个雷,该坐标在边界时就会有越界的情况(这样还需要我们判断),为了减少自己的麻烦,直接分别给行和列都加一行,这样就不存在越界的情况。

void initially(char a[ROWS][COLS],int row,int col,char ch)
{
    int i,j;
    for(i=0;i<row;i++)
    {
        j=0;
        for(j=0;j<col;j++)
        {
            a[i][j]=ch;
        }
    }

}

下面我们就要埋雷炸人了,setmine函数:

void setmine(char a[ROWS][COLS],int row,int col)
    {
        int count = Count;
        while(count)
        {
            int x=rand()%row+1;
            int y=rand()%col+1;//将雷的坐标控制在1~9之内
            if(a[x][y]=='0')
            {
                a[x][y]='1';
                count --;
            }

        }
    }

埋雷肯定要在9*9的棋盘中随机埋雷,rand()产生随机数,要将雷的坐标控制在1~9之内,就直接x=rand()%row+1,y同理。

埋好雷下一步要干什么呢,当然是让别人找雷,我先说一说Findmine函数:

我们要先让用户输入一个所要排查雷的坐标,win就是所排查出的不是雷的个数,如果排查的那个地方是‘1’,那就被炸死了,程序结束,如果是‘0’那就要统计该坐标雷的个数了,Getmine_count就是统计坐标周围雷的个数的函数。当你看到这里先去吧Getmine_count函数理解了。我们要知道‘1’是雷,‘0’不是雷,那么这个函数很容易理解。

当我们排查了一个坐标,用户屏幕上要显示出他排查该坐标后的结果,show数组就要打印给用户看,用户要看到被排查的那个坐标周围雷的个数n+'0',排查一个结果win++。

void Findmine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
    {
        int x;
        int y;
        int win=0;
        printf("请输入要排查的坐标\n");
        while(win<row*col-Count)
        {
            scanf("%d %d",&x,&y);
            if(x>=1&&x<=row&&y>=1&&y<=col)
        {
            if(mine[x][y]=='1')
            {
                printf("很遗憾,你被我埋的雷炸死咯哈哈哈\n");
                printf("小趴菜,让你看看我的雷在哪\n");
                DisplayBoard(mine,ROW,COL);
                break;
            }
            else
            {
                //统计该坐标周围一共有多少个雷
                int n=Getmine_count(mine,x,y);
                show[x][y]=n+'0';
                DisplayBoard(show,ROW,COL);
                win++;
            }
        }
        else{
            printf("坐标非法请重新输入\n");
        }
        if(win==row*col-Count)
        {
            printf("铁子实力有的呢,拆弹专家,排雷成功\n");
            break;
        }
        }
    }
int Getmine_count(char mine[ROWS][COLS],int x,int y)
    {
        int count=0,i,j;
        for(i=x-1;i<=x+1;i++)
        {
            for(j=y-1;j<=y+1;j++)
            {
                if(mine[i][j]=='1')
                {
                    count++;
                }
            }
        }
        return count;
    }

下面是DisplayBoard函数:​​​​​​​这个函数很简单测试到自己想要的结果就行

void DisplayBoard(char a[ROWS][COLS],int row,int col)
    {
        int i,j;
        printf("-------扫雷游戏------\n");
        printf("--------start-------\n");
        for(i=0;i<=col;i++)
        {
            printf("%-2d",i);
        }
        printf("\n");
        for(i=1;i<=row;i++)
        {
            printf("%d",i);
            for(j=1;j<=col;j++)
            {
                printf("%2c",a[i][j]);
            }
            printf("\n");
        }
    }

每写一个函数我们都要去测试一下,达到咱们想要的结果之后再写下一个函数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值