基于C语言控制台实现扫雷游戏

**

基于C语言控制台实现扫雷游戏

**
前言:第一次纯靠手撸自己完成了个能玩的小游戏,在这里记录一下,代码写的还是繁冗,不清晰。不过好在还是在不断的修bug的过程下实现了功能。好了,处女贴献上。

设计思路:

将整个游戏的实现过程分解为
1.在1010的二维int数组a中埋下雷,有雷为1,无雷为0。
2.另创建一个10
10char数组b,使b的每个元素为‘-’,以表示未进行操作。 ‘*’表示雷,‘0’~‘8’表示周围方格有雷的个数。
3.写下两个函数 探索函数 以及 标记函数。
4.控制游戏结束,第一种,探索方格为雷。第二种,所有地雷均被标记,且标记数量等于地雷数量。

分块代码实现

Ps:吐了,直接粘代码卡死了4次了,每次都得重新编辑,然后查了一下得用chrome浏览器才行,但是这次为了保证稳定,我还是选择分块儿粘吧。
1.头函数

#include<stdio.h>
#include<stdlib.h>
#include <time.h>
#define size 10

2.主函数

int main()
{
    printf("游戏开始!!!!\n");
    int i,j;
    int judge=1;

    //1.种雷
    int leipan[size][size];
    mailei(leipan);

    //2.盖布,将10*10的雷盘蒙上‘-’的布 ‘-’代表无雷,‘*’代表有雷);
    char gaibu[size][size];
    for(i=0;i<size;i++)
        for(j=0;j<size;j++)
            {
                gaibu[i][j]='-';
                printf("%c ",gaibu[i][j]);
                if(j==size-1)
                    printf("\n");
            }

    //3.选择位置
    while(judge)
    {
        printf("请输入将点开的图标位置!\n");
        printf("选择标记'o'与探索 标记:1,探索:2\n");
        int x,y;
        int chose;
        scanf("%d %d %d",&x,&y,&chose);
        if(chose==1)
        {
            biaoji(leipan,gaibu,x-1,y-1);
            for(i=0;i<size;i++)
                for(j=0;j<size;j++)
                {
                    printf("%c ",gaibu[i][j]);
                    if(j==size-1)
                        printf("\n");
                }
            if(biaoji(leipan,gaibu,x-1,y-1))
            {
                printf("You are so NB!!!!!!!\n");
                judge=0;
            }

        }
        else if(chose==2)
        {
            tansuo(leipan,gaibu,x-1,y-1);
            for(i=0;i<size;i++)
                for(j=0;j<size;j++)
                {
                    printf("%c ",gaibu[i][j]);
                    if(j==size-1)
                        printf("\n");
                }
            if(gaibu[x-1][y-1]=='*')
            {
                printf("你tmd真菜!!!\n");
                judge=0;
            }
        }
        else
        {
            printf("error!!!!\n");
        }
        for(i=0;i<size;i++)
            for(j=0;j<size;j++)
            {
                printf("%d ",leipan[i][j]);
                if(j==size-1)
                    printf("\n");
            }
    }
    return 0;
}

主函数比较简单,写一个大骨架,比较细节的一点是因为我功能函数写的时候带入的x行y行,而介于平时人们常用的计数方法是1-10,而非0-9,因此函数带入参数为x-1,y-1.

3.埋雷函数

//种雷函数
//在10*10的矩阵上种雷 1为雷 0为无雷
int mailei(int leipan[][size])
{
    srand((unsigned)time(NULL));
    int count=0;
    int i,j;
    for(i=0;i<size;i++)
        for(j=0;j<size;j++)
            leipan[i][j]=0;
    for(i=0;i<size;i++)
    {
        for(j=0;j<size;j++)
        {
            leipan[i][j]=rand()%2;
            if(leipan[i][j])
            {
                count++;
            }
        }
    }
    printf("雷数为%d\n",count);
    return leipan;
}

埋雷函数目前有一下需要改进的地方
1.埋雷个数无法确定
2.埋雷个数给定范围值区间的随机数,例如10-20之间随机个数的雷
3.设置难度梯度,以给定不同规格的雷盘大小和地雷个数区间。

4.标记函数

//标记函数
//用符号‘o’来标记
int biaoji(int leipan[][size],char gaibu[][size],int x,int y)
{
    int i,j;
    int count=0,num=0;
    gaibu[x][y]='o';
    for(i=0;i<size;i++)
    {
        for(j=0;j<size;j++)
        {
            if(leipan[i][j]==1)
                num++;
            if(gaibu[i][j]=='o'&&leipan[i][j]==1)
                count++;
        }
    }
    if(num==count)
        return 1;
    else
        return 0;
}

5.探索函数

void tansuo(int leipan[][size],char gaibu[][size],int x,int y)
{
    int i,j;
    int sum=0;
    char Sum;
    if(x>=1&&x<=size-2&&y>=1&&y<=size-2)
    {
        for(i=x-1;i<=x+1;i++)
            for(j=y-1;j<=y+1;j++)
            {
                sum+=leipan[i][j];
            }
        Sum=sum+48;
        if(leipan[x][y])
            gaibu[x][y]='*';
        else if(!leipan[x][y]&&sum)
            gaibu[x][y]=Sum;
        else
        {
            gaibu[x][y]='0';
            if(gaibu[x-1][y-1]=='-')
                tansuo(leipan,gaibu,x-1,y-1);
            if(gaibu[x][y-1]=='-')
                tansuo(leipan,gaibu,x,y-1);
            if(gaibu[x+1][y-1]=='-')
                tansuo(leipan,gaibu,x+1,y-1);
            if(gaibu[x-1][y]=='-')
                tansuo(leipan,gaibu,x-1,y);
            if(gaibu[x+1][y]=='-')
                tansuo(leipan,gaibu,x+1,y);
            if(gaibu[x-1][y+1]=='-')
                tansuo(leipan,gaibu,x-1,y+1);
            if(gaibu[x][y+1]=='-')
                tansuo(leipan,gaibu,x,y+1);
            if(gaibu[x+1][y+1]=='-')
                tansuo(leipan,gaibu,x+1,y+1);
        }
    }
    else if(x==0)
    {
        if(y==0)
            {
                for(i=x;i<=x+1;i++)
                    for(j=y;j<=y+1;j++)
                    {
                        sum+=leipan[i][j];
                    }
                Sum=sum+48;
                if(leipan[x][y])
                    gaibu[x][y]='*';
                else if(!leipan[x][y]&&sum)
                    gaibu[x][y]=Sum;
                else
                {
                    gaibu[x][y]='0';
                    if(gaibu[x+1][y]=='-')
                        tansuo(leipan,gaibu,x+1,y);
                    if(gaibu[x+1][y+1]=='-')
                        tansuo(leipan,gaibu,x+1,y+1);
                    if(gaibu[x][y+1]=='-')
                        tansuo(leipan,gaibu,x,y+1);
                }
            }
        else if(y==size-1)
            {
                for(i=x;i<=x+1;i++)
                    for(j=y-1;j<=y;j++)
                    {
                        sum+=leipan[i][j];
                    }
                Sum=sum+48;
                if(leipan[x][y])
                    gaibu[x][y]='*';
                else if(!leipan[x][y]&&sum)
                    gaibu[x][y]=Sum;
                else
                {
                    gaibu[x][y]='0';
                    if(gaibu[x][y-1]=='-')
                        tansuo(leipan,gaibu,x,y-1);
                    if(gaibu[x+1][y-1]=='-')
                        tansuo(leipan,gaibu,x+1,y-1);
                    if(gaibu[x+1][y]=='-')
                        tansuo(leipan,gaibu,x+1,y);
                }
            }
        else
        {
            for(i=x;i<=x+1;i++)
                    for(j=y-1;j<=y+1;j++)
                    {
                        sum+=leipan[i][j];
                    }
                Sum=sum+48;
                if(leipan[x][y])
                    gaibu[x][y]='*';
                else if(!leipan[x][y]&&sum)
                    gaibu[x][y]=Sum;
                else
                {
                    gaibu[x][y]='0';
                    if(gaibu[x][y-1]=='-')
                        tansuo(leipan,gaibu,x,y-1);
                    if(gaibu[x][y+1]=='-')
                        tansuo(leipan,gaibu,x,y+1);
                    if(gaibu[x+1][y+1]=='-')
                        tansuo(leipan,gaibu,x+1,y+1);
                    if(gaibu[x+1][y]=='-')
                        tansuo(leipan,gaibu,x+1,y);
                    if(gaibu[x+1][y-1]=='-')
                        tansuo(leipan,gaibu,x+1,y-1);
                }
        }
    }
    else if(x==size-1)
    {
        if(y==0)
        {
            for(i=x;i>=x-1;i--)
                for(j=y;j<=y+1;j++)
                {
                    sum+=leipan[i][j];
                }
            Sum=sum+48;
            if(leipan[x][y])
                gaibu[x][y]='*';
            else if(!leipan[x][y]&&sum)
                gaibu[x][y]=Sum;
            else
            {
                gaibu[x][y]='0';
                if(gaibu[x][y+1]=='-')
                    tansuo(leipan,gaibu,x,y+1);
                if(gaibu[x-1][y+1]=='-')
                    tansuo(leipan,gaibu,x-1,y+1);
                if(gaibu[x-1][y]=='-')
                    tansuo(leipan,gaibu,x-1,y);
            }
        }
        else if(y==size-1)
        {
            for(i=x;i>=x-1;i--)
                for(j=y;j>=y-1;j--)
                {
                    sum+=leipan[i][j];
                }
            Sum=sum+48;
            if(leipan[x][y])
                gaibu[x][y]='*';
            else if(!leipan[x][y]&&sum)
                gaibu[x][y]=Sum;
            else
            {
                gaibu[x][y]='0';
                if(gaibu[x-1][y-1]=='-')
                    tansuo(leipan,gaibu,x-1,y-1);
                if(gaibu[x-1][y]=='-')
                    tansuo(leipan,gaibu,x-1,y);
                if(gaibu[x][y-1]=='-')
                    tansuo(leipan,gaibu,x,y-1);
            }
        }
        else
        {
            for(i=x;i>=x-1;i--)
                for(j=y-1;j<=y+1;j++)
                {
                    sum+=leipan[i][j];
                }
            Sum=sum+48;
            if(leipan[x][y])
                gaibu[x][y]='*';
            else if(!leipan[x][y]&&sum)
                gaibu[x][y]=Sum;
            else
            {
                gaibu[x][y]='0';
                if(gaibu[x][y-1]=='-')
                    tansuo(leipan,gaibu,x,y-1);
                if(gaibu[x][y+1]=='-')
                    tansuo(leipan,gaibu,x,y+1);
                if(gaibu[x-1][y+1]=='-')
                    tansuo(leipan,gaibu,x-1,y+1);
                if(gaibu[x-1][y]=='-')
                    tansuo(leipan,gaibu,x-1,y);
                if(gaibu[x-1][y-1]=='-')
                    tansuo(leipan,gaibu,x-1,y-1);
            }
        }
    }
    else if(y==0)
    {
        for(i=x-1;i<=x+1;i++)
            for(j=y;j<=y+1;j++)
            {
                sum+=leipan[i][j];
            }
        Sum=sum+48;
        if(leipan[x][y])
            gaibu[x][y]='*';
        else if(!leipan[x][y]&&sum)
            gaibu[x][y]=Sum;
        else
        {
            gaibu[x][y]='0';
            if(gaibu[x-1][y]=='-')
                tansuo(leipan,gaibu,x-1,y);
            if(gaibu[x-1][y+1]=='-')
                tansuo(leipan,gaibu,x-1,y+1);
            if(gaibu[x+1][y+1]=='-')
                tansuo(leipan,gaibu,x+1,y+1);
            if(gaibu[x+1][y]=='-')
                tansuo(leipan,gaibu,x+1,y);
            if(gaibu[x][y+1]=='-')
                tansuo(leipan,gaibu,x,y+1);
        }
    }
    else if(y==size-1)
    {
        for(i=x-1;i<=x+1;i++)
            for(j=y;j>=y-1;j--)
            {
                sum+=leipan[i][j];
            }
        Sum=sum+48;
        if(leipan[x][y])
            gaibu[x][y]='*';
        else if(!leipan[x][y]&&sum)
            gaibu[x][y]=Sum;
        else
        {
            gaibu[x][y]='0';
            if(gaibu[x-1][y]=='-')
                tansuo(leipan,gaibu,x-1,y);
            if(gaibu[x-1][y-1]=='-')
                tansuo(leipan,gaibu,x-1,y-1);
            if(gaibu[x+1][y-1]=='-')
                tansuo(leipan,gaibu,x+1,y-1);
            if(gaibu[x+1][y]=='-')
                tansuo(leipan,gaibu,x+1,y);
            if(gaibu[x][y-1]=='-')
                tansuo(leipan,gaibu,x,y-1);
        }
    }
}

探索函数的结构可以简化为
探索x,y是否有雷,有雷则使b数组相应位置修改为‘
’,无雷,则修改b数组相应位置相邻位置的地雷数总合,若周围的地雷数为0,则继续探索周围相邻的格。*

代码实现时的细节,也是我debug的一大重头。
1.递归探索时,首先要注意四个角的探索值,当探索中间位置时,注意下标,x-2,y-2为上线,x=1和y=1为下线。
2.递归时加入限制条件,当b[x][y]==’-'时才进行探索,否则会进入无限循环。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值