扫雷游戏设计(从零开始)(1)

扫雷介绍

扫雷游戏其核心玩法是通过点击方格来揭示其内容,如果方格是空地,则可以继续点击周围的方格;如果方格是地雷,则游戏结束;如果方格是标记,则玩家可以继续点击周围的方格,直到找到地雷为止。

扫雷代码简介

首先,我们需要定义游戏的基本规则和数据结构。游戏板是一个N×N的方格,其中有些方格包含地雷(用数字“*”表示),有些方格是空地(用数字“0”表示),有些方格是标记(用数字“1”表示)。玩家需要点击方格来揭示其内容,如果方格是空地,则可以继续点击周围的方格;如果方格是地雷,则游戏结束;如果方格是标记,则玩家可以继续点击周围的方格,直到找到地雷为止。

根据上述规则,我们可以定义一个二维数组来表示游戏板,其中每个元素的值可以是“*”、“0”、“1”。然后我们可以定义一些辅助函数来实现游戏逻辑和界面显示。

咱们先来写上咱们的标准的输入输出头文件stdio.h啊。写一个int main,这是咱们的主函数啊int main里面呢,咱们return 0 。诶,这个东西大家见怪不怪了,对不对?

啊,每次翻开书第一章啊,讲的就是一个标准的输入,输出讲的就是一个主函数啊。

第一步:初始化数据结构

在扫雷游戏中,每个方格要么是地雷,要么是空地,因此我们可以用一个二维数组来表示游戏板,其中每个元素的值可以是“*”、“0”。另外,为了方便计算周围地雷数,我们还需要定义一个二维数组来存储每个方格周围的数字。

首先,我们来定义一个int类型的数组,那么这个数组的行和列呢?咱们为了后期能够更好更方便地去修改它,咱们把它定义成一个宏定义row。我们用十行,以十列来计算好吧,后期咱们可以改啊。来,这是咱们的实例。嗯,所以我们去定义一个二维数组呢,咱们就可以用一个十行十列的,这样的一个二维数组。

#define ROW 10 //行
#define COL 10 //列

int map[ROW][COL]
//0

注意这里呢,要给大家补充一个小的知识点。就是凡是定义在咱们全局的变量的话呢,它一般都是初始化的,也就是说这个二维数组里面它的值应该全部都是零。

我们可以来试一下,比如说我们定义一个void GameDraw,这个函数我们把它叫做绘制函数。前期这个绘制函数主要的作用啊,就是用来打印,打印咱们的二维数组中所有的元素啊。

咱们用一个for循环,里面定义一个int类型的i=0,i<ROW,i++。这是第一个for。第二个for循环,咱们用一个int类型的j=0,j<COL,j++。然后咱们就可以用一个非常常见的print打印函数把咱们的这个%d ,然后咱们要来打印map[i][j].为了让我们的这个数组看起来像一个矩阵的话呢,咱们得在两个for循环之间给它加上咱们的这个打印函数,放一个\n换行嘛?

//绘制函数 打印二维数组中所有的元素
void GameDraw()
{
    for(int i=0;i<ROW;i++)
    {
        for(int j=0;j<COL;j++)
        {
            printf("%d ",map[i][j]);
        }
        printf("\n");
    }    
}

来咱们把这个函数调用一下。

来打印一下。我们能够看到有十行,有十列,这是一个很标准的二维数组啊。

那当然,这只是一个打印函数啦啊,那么我们的游戏如果说想要结束之后继续再重来,那咱们还是得要有一个游戏的初始化函数,这个函数咱们可以用来不断的去对咱们的这个数组呢进行一个赋初值,我们赋值还是为零啊,就是让它回归到最原始的状态。

同样的,我们把这个i++带进来,用一个for循环。定义一个int类型的j;j=0;j<COL;j++。在这个for循环里边,咱们要把这个数组当中所有的元素全部给它赋值为零。那么这样的话,咱们就有了两个函数,一个是咱们的初始化函数,一个呢,是咱们的绘制函数,咱们都可以把这两个函数给它放在主函数里面调用。所以,这里的话呢,我们的这个数组的,就用到了两个,一个是初始化,一个是打印啊。

当然,我们初始化函数运行之后,我们数组当中所有的值都是零,但是,我们又希望可以在这个数组当中产生一些所谓的雷啊,这里要注意,第一,我们需要用一个-1去表示雷。第二,咱们到底有多少个雷,这个咱们得数清楚。那为了我们后期方便修改,我们还是一样的,把这个雷的数量用一个#define啊,把它放到咱们的宏定义里面,最简单的十个雷。我们有定义了十个雷,那么我们就有NUM个雷。

不管是多少个雷啊,咱们都得用一个循环。这里的话呢,用for循环也可以用,while循环也可以,当然为了更好的去让大家去理解呢,我觉得while循环会比较好一点。定义一个int类型的n,让这个n呢等于零,然后用一个while循环,让这个n呢小于NUM。那么这样的话,只要我们在这个while循环里面n++,那么我们就可以循环NUM次啊,也就是我们现在的十次。

那么在布雷的过程当中,我们一共是十行十列,这个雷肯定不是指定的放在某一个地方,它应该是随机得到的。我们应该随机得到咱们的行和列.咱们得用一个头文件stdlib.h。同样的,我们还需要一个include time.h这样的一个头文件。

那么有了这个随机数之后,咱们可以在初始化函数之前,千万不要忘记了有一个随机数的种子sr and()里面给上一个unsigned int。给一个time,time里面加上咱们的空。大家会发现我的这个随机数种子呢,跟大家平时在书本上的有一些是不一样的啊。那么,我建议大家按照我的来啊,书本的那个有些东西它现在基本上已经不那么用了。

随机数的种子有了之后呢,那么需要得到咱们的行和列,那么首先咱们来定义一个int类型的r,随机得到行和列多少行呢?rand%,咱们的最多是十行。然后来定义一个int类型的c,rand()%COL,10列。

这样的话,我们就可以得到一个随机的行和列,这个随机的行和列里边,我们就可以把随机得到的这个元素的值,把它赋值为-1,,就把它表示为雷。但是大家一定要注意啊,我们在这个过程当中每一次循环随机得到的行和列,它是完全有可能重复的,那比如说第一次我们得到第三行第三列,那么我们把第三行第三列的元素。赋值为负一,第二次我们又得到三行三列,我们又把第三行三列赋值为负一,那么这样如果说咱们给定一个n++呢,你就会发现,虽然咱们循环了十次,但是有两次它都产生在三行三列的地方,那么这样的话,咱们的雷的数量会出现不对。所以咱们必须要在前面让咱们找到的这一行这一列它的元素它必须是零,就是说它不是雷,咱们才能够让它成为雷。如果说它已经是雷了,那咱们就可以继续重新得到一个行和列,而我们把这个n++放在这里边呢,实际上我们就是说,我们必须要埋下一个雷,之后咱们的循环才会加一次,咱们的n才会加一次。最后咱们的while退出。那么这个就是咱们布雷的方式。

我们回过头来再来看一下我们,首先咱们定义了一个行,定义了一个列,定义了一个雷的数量,这个是咱们的宏定义部分。然后呢,我们的这个扫雷,它是一个矩阵啊,那么咱们用一个二维数组,十行十列。有了二维数组之后,咱们首先要想到的是数组的赋初值。

第二个是咱们数组的打印。

关键是我们要想着布雷,这个地方是咱们的重点。布雷,有多少个雷,咱们就循环多少次,然后在循环的过程当中,咱们不断的去得到一个随机的行和列,在保证不重复的情况下,咱们把这些雷随机的放到咱们的数组里面去。

咱们来运行一下。

这样看上去会比较乱啊,咱们可以在这个打印里边呢,把这个格式,给它改一改,%2d,那么咱们再来看。

这里面它肯定就会有正好十个雷啊,那么这就是咱们布雷的方式。

  • 22
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值