文章      动态     相关文章     最新文章     手机版动态     相关动态     |   首页|会员中心|保存桌面|手机浏览

l19c5

http://ww.kub2b.com/coml19c5/

相关列表
文章列表
  • 暂无文章
推荐文章
扫雷游戏(简陋版)手机h游戏「扫雷游戏(简陋版)」
发布时间:2025-02-18        浏览次数:16        返回列表

1、可以通过菜单进入或退出游戏

2、游戏自动设置为简易难度,也就是在9*9的格子里找到10个地雷(游戏代码可以通过更改头文件中的EASY_COUNT的大小来自动调节难度

3、输入坐标排查地雷(注:坐标轴默认左上角为原点

4、找到雷以外的所有安全位置即为通关(友情提示:虽然是简单难度,但其实是考验运气的,正常情况下一次也过不去,因为毕竟一次只能开一个格子,如果你能通过,那恭喜你,买彩票肯定也能中

OK,废话不多说:直接上游戏设计

  这里可以去参考本人第二篇文章猜数字游戏,与这里架构一致,如下

 
 

  由于代码过长,我们可以将该游戏代码设置成三个文件进行处理

 

  这样设置可以使主函数显得没有那么繁杂。

  扫雷游戏中,布置的雷和排查出的雷的信息都需要存储,所以我们需要⼀定的数据结构来存储这些信息。 因为我们需要在9*9的棋盘上布置雷的信息和排查雷,我们首先想到的就是创建⼀个9*9的数组来存放信息(如图)。这里我们第一时间想到的肯定是二维数组。

  然后呢,我们可以把雷设置成字符‘1’,把安全区域设置成字符‘0’(如图)(不能设置成数字,如果是数字0,会默认打印空白)。

  但是这时看下图我们会发现有个问题,如果我们排查的坐标是以(1,1(1,7(7,1(7,7)四个坐标构成的正方形内的坐标时,显示的雷的数量是正确的,例如(2,5)点,它的周围有1个雷,到时我们就可以让周围地雷的数量显示到这个格子上,但是如果是(0.0)和(8,6)这种位置呢,难道我们还单独设置一下,让它们本来收集周围8个方格信息的代码在特殊位置时只考虑周围3个或5个方格吗,反正你不怕麻烦我怕呢。

  这时我们就想到,我们完全可以让棋盘往周围扩大一圈啊,而我们只向它传输中间9*9的信息就OK了(如下图)。

  到这里,我们就应该考虑另一个问题,雷的个数信息存放在哪里呢?如果存放在布置雷的数组中,这样雷的信息和雷的个数信息就可能或产生混淆和打印上的困难。

  这里我们肯定有办法解决,比如:雷和非雷的信息不要使用数字,使用某些字符就行,这样就避免冲突了,但是这样做棋盘上有雷和非雷的信息,还有排查出的雷的个数信息,就比较混杂,不够方便。 这里我们采用另外一种方案,我们专门给一个棋盘(对应一个数组mine)存放布置好的雷的信息,再给另外一个棋盘(对应另外一个数组show)存放排查出的雷的信息。这样就互不干扰了,把雷布置到mine数组,在mine数组中排查雷,排查出的数据存放在show数组,并且打印show数组的信息给后期排查参考。 同时为了保持神秘,show数组开始时初始化为字符‘*'。

  这时,我们两个数组的类型就一致了,都可以使用char类型来打印棋盘了。对应数组如下

 
 

  首先在头文件里定义一些常量

 

  以下函数全都放在game.c文件里,一定要在game.h里进行函数声明,然后在game.c和test.c中加入  #include “game.h”

初始化函数

  上面已经讲到要将两个棋盘初始化,一个初始化为’*‘,一个初始化为’0‘,初始化函数是基础函数,这里就不过多赘述,看代码就OK了。

 

棋盘打印函数

  我们在游戏开始时,一定要先把棋盘打印出来,这时我们就要设计一个打印函数,能够将show棋盘打印出来。

 

  有同学可能会问为什么只打印9*9的棋盘,还要往函数里传输board[ROWS][COLS],而不是board[ROW][COL]

  那是因为你设置的棋盘是11*11,你可以将11*11棋盘全部传输过去,而只打印9*9的棋盘,但你不可能把数组拆开,只将中间9*9的棋盘抠出来传输过去。

在mine棋盘中设置地雷

  目前你的mine棋盘中,是没有地雷的,也就是没有字符’1‘,这时候就需要我们自己设置了。我们可以设置一个setmine函数,如下

 

  这里面的count是一个计数器,代表还没布置的地雷的个数,这里面的rand函数同样可以参考我的第二篇文章中有关于rand函数的具体用法,以及如何让rand函数生成的数随机,它的头文件是#include <stdlib.h>。至于为什么要%row和col,其实是为了让x,y的坐标控制在(9,9)以内,但此时只能到(8,8,所以才在取余后各自+1。

  有同学问能不能将if去掉,但是仔细考虑一下你会发现,去掉if后因为rand函数生成的(x,y)坐标是随机的,就有可能导致两次地雷布置到同一个方格内,而count同时又会 -- ,这就导致会少布置至少一个地雷,使地雷个数达不到10个。

findmine函数

  这个函数是用来让你输入坐标,排除哪个位置没有地雷用的,也就是打开你觉得没有地雷的格子,关于一些代码的用意,我会注释到如下的代码里,大家看就行。

 

  额,那个show[x][y] = i + ‘0’这一步忘了解释,这里的 i 其实就是(x,y)这个坐标周围8个方格内地雷的个数,但是由于方格里放的都是字符,就不可能把整型 i 放到棋盘里,所以我们要把它变成字符,这里的方法就是:在ASCll码表中字符‘0’是60,加上 i 后就变成了对应的字符数字。

  那么这里面的 i (即周围地雷个数)是怎么得到的呢,这时就需要我们再写一个函数minecount放在findmine函数的前面。

minecount函数

  先来一个图片,我来给大家讲解一下。

   假设随机在棋盘中选择一个格子是(x,y,以左上角为坐标原点那么就能得到周围八个格子的坐标,那么我们把周围八个格子的坐标输入mine数组中相加再减去8个字符‘0’后就能够得到周围地雷的个数(为什么减去字符‘0’,因为棋盘里存放的都是字符,然后写出函数就行了,如下

 

  注意:这里函数返回类型不再是void了,而是int了,因为要返回一个 i 值。

• 是否可以选择游戏难度

◦ 简单 9*9 棋盘,10个雷

◦ 中等 16*16 棋盘,40个雷

◦ 困难 30*16 棋盘,99个雷

• 如果排查位置不是雷,周围也没有雷,可以展开周围的一片 

• 是否可以标记雷

• 是否可以加上排雷的时间显示