C语言之扫雷游戏

本文介绍了如何使用C语言自定义实现扫雷游戏,包括游戏分析、设计思路(二维数组存储、雷的数量表示、错误处理等),并详细展示了如何编写主函数、菜单、游戏函数和相关辅助函数,通过宏定义和多文件结构优化代码组织。
摘要由CSDN通过智能技术生成

扫雷游戏,相信大家都不陌生吧,以前,我们是玩家,而现在,在学习了一定的C语言知识后,我们能不能自己通过自己敲代码来完成扫雷游戏的实现呢?

要想实现扫雷游戏,首先就要知道扫雷游戏运行的原理是什么:

1.扫雷游戏的分析和设计

扫雷游戏是使用控制台来实现的,玩家可以选择菜单上的选项来选择进入退出游戏,在9*9(或者其他难度更大的)的棋盘上排除雷的游戏。

关于排雷:

(1)如果所选位置不是雷,则显示周围的雷有几个。

(2)如果所在位置是雷,则游戏结束。

(3)若玩家找出所有雷,则获胜。

关于游戏的界面:

初始界面:

排雷界面:

2.游戏的分析与设计

游戏分析:

*以9*9的棋盘为例设计扫雷游戏

玩扫雷游戏时,我们的棋盘上的雷与非雷皆需要被存储,这时,我们可以想到用二维数组来存储信息。

我们为了高效简洁,可以用字符‘1’代表有雷,字符‘0’代表无雷。

假设我们安置10个雷,则可以得到如下棋盘:

(左、上两排代表行数和列数)

是不是万无一失呢?

no!

仔细观察,当我们要排查(8,9)这个位置时,你会发现数组越界访问了

所以,用9*9的棋盘是不够的,所依,我们可以选用11*11的棋盘。

下面这张图也许可以更直观一些

再继续分析,如果我们只使用一个二维数组来存储雷或非雷的信息,将信息打印出来,那这个雷的个数信息存放在哪里呢,如果存放在布置雷的数组中,会不会造成混淆呢?因为我们无法辨认出这个信息是原来这个位置存在雷还是不存在但是打印出周边雷的个数信息呢?

因此,为了解决这个问题,我们不妨再设置一个二维数组。所有我们将一共设置两个数组,一个存放放置雷的信息,另一个存放排查出的雷的信息。

那接下来,我们进入扫雷游戏代码的设计。

新建源文件,命名test.c

写入主函数,一切准备就绪,

我们不妨写入一个test函数

在test函数中,我们将我们的答题思路转化为了代码,我们用do while循环进入菜单,然后用switch语句来选择菜单选项。

在test函数中,我们提到了菜单,所以我们需要写一个菜单:

在上述提到的switch语句中,有一种进入游戏的情况,所以我们需要一个game函数

在game函数中,我们需要来添加什么函数来完成一整个游戏的实现呢?而且如此多的函数怎样才能使代码编写有条不紊呢?

有些同学在学习过函数多文件的声明与定义,了解了这样做的好处(可多人协作提高效率,并且可以隐藏代码),不难想到,我们可以设计三个文件:

1 test.c//文件中写游戏的逻辑测试

2 game.c//用来写game函数中各种函数的实现

3 game.h//用来写函数的声明以及用于进行宏定义

代码实现:

首先,我们可以在game.h头文件中进行宏定义

将棋盘行数和列数进行宏定义

有的同学可能会问,为什么要进行宏定义呢,我想改行数和列数的时候只需要在对应函数中改不就行了?

可是,我们的对应函数中可能要改很多次,不如直接进行宏定义,只需改一次,便可一劳永逸。

接着我们需要定义并初始化两个数组:

char mine[11][11]={0};

char show[11][11]={0};

然后我们需要为数组赋值,对于第一个数组,我们需要将其中所有元素赋值为字符‘0’,第二个数组,为了保持一定的神秘感,我们可以赋值为‘*’,。

因此,我们需要定义一个赋值数组函数,来完成数组全部初始化为指定值的赋值。

然后,我们需要一个棋盘打印函数,用以在游戏进行时知道扫雷进度。

我们还需要定义一个函数来放置雷

在这里,我们使用了随机数函数rand,所以我们需要在game.h包含其对应的头文件

在这里,可以补充一些关于随机数函数的知识:

rand函数的原型:

#include<stdlib.h>

int rand(void)

用rand函数获取随机数的方法:rand()%a 返回值为0到a-1的随机数,如果在本例中,我们需要再加一,得到的就是1到9的随机数。

如果我们要得到m-n之间的随机数:rand()%(n-m+1)+m

在放置雷函数中,我们设置了一个ICOUNT,用于表示本游戏中放置的雷的个数,我们可以也将其放置在头文件game.h中:

放置雷之后,我们便可以进入最后一个重要环节,也就是排除雷函数的定义:

while中的win<row*col-ICOUNT是循环条件,当我们用的是9*9棋盘时,win<81-10,所以当win=71时,跳出循环,也代表着游戏的胜利。

细心的同学可以发现,在这个函数里,我们调用了另一个函数,即numbermine函数:

或许你有疑问,return后的表达式是什么意思呢?

其实我们再借用一下下图就可以明白啦!

(x,y)是其中一个小九宫格的中心,也就是我们要排除的的位置,而(x-1,y-1)就是左上角的坐标,以此类推,我们将八个格内的ASCLL码值相加,再减去8*‘0’,得到的就是含‘1’的小格个数,也就是周围雷的个数。

因此我们用这个函数来计算我们所排查位置周围的雷的个数。

因此,在test函数中:

以上函数的定义代码我们写在game.c源文件中,我们分别写了初始化函数,打印函数,放置雷函数,排查雷函数,周围雷个数函数,一连贯的函数帮助我们完成游戏的实现。

而在game.h头文件中,我们写入宏定义和一些头文件(如我们将#include<stdio.h>写入game.h,在源文件中只要引入game.h头文件,即可使用game.h所包含的所有头文件)

在test.c源文件中,我们写入菜单函数,写入game函数(包含多个函数),在test函数中实现所有函数的,用do while循环完成游戏的进入与否。

通过以上学习,我们便能完成一个扫雷游戏代码了!

以下仅为参照哦!

game.h:

game.c:

test.h:

好了,今天关于扫雷游戏的讲解就到这里了,好记性不如烂笔头,赶快动手试试吧!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值