一文教你从零开始设计并实现一个Java扫雷游戏

(6)  Record.java

Record类是通过IO流将游戏记录储存在本地的文件中,主要实现通关后弹窗提示通关的窗口,以及记录成绩。

(7)  ShowRecord.java

ShowRecord类是显示扫雷记录的类。

3.1流程规划

有三个部分,分别是游戏选择难度后、玩家第一次点击格子和为不是地雷的格子自动点开。

游戏选择难度后,获取该难度设定的雷数与界面尺寸显示界面,但是还没有布雷。当玩家第一次点开格子的时候系统随机布雷并启动定时器,为什么要在点过一次格子之后才布雷呢?这就是要让玩家第一次不会点到地雷,要不然玩家该多郁闷,这样才能提高玩家的游戏欲。之后是最重要的一步,就是如何将格子周围没有雷的格子自动点开,我们可以使用递归的方法来巧妙的判断并点开周围的格子。

3.2界面规划

说明如下:

①:游戏主界面(Interface)。

②:菜单(Menu)。

③:地雷数显示区(MineNumberArea)

④:重新开始(Restart)。

⑤:扫雷用时显示区(TimeArea)。

⑥:地雷区(MineArea)。

3.3算法思想

(1)随机布雷

扫雷游戏要求在雷区随机布雷,雷数不能太多,这样就没法很好的判断周围是否有雷了;但也不能太少,这样会出现点一下就会点开一大片的空白区域。使用java自带的Math.random()方法产生随机数,经过计算后得到将随机数转换成一个整数,这个整数就是雷的位置的角标。游戏的目标是在将所有的地雷标记出来,并将其它不是雷的格子点开。

(2)计算方格周围雷数

当没有雷的格子被点击后,会显示该格子周围8个格子里所有的雷数,玩家通过这个数字就可以判断出雷的位置,所以周围雷数的计算也很重要。

4游戏的详细设计


4.1游戏初始化

玩家点开游戏,此时系统自动加载界面,分别是雷区、菜单区、扫雷数据显示区,

游戏界面相对计算机自带的扫雷游戏比较简洁,主要由游戏数据显示区域以及雷区构成。

我们使用ImageIcon对象来存放地雷的图标,可以图标大小最好要小一些,否则会在格子上显示不全。

对地雷区的初始化是很重要的,我们使用一个循环即可实现初始化。玩家点开游戏之后可以点击菜单栏选择扫雷游戏的难度,不同的难度就代表了不同的地雷总数和尺寸,自定义的难度也会设置雷数和尺寸,设置的这些数据全部存放在几个变量之中,当雷区要初始化的时候程序会调用这么变量属性,然后通过一个循环来完成初始化。主要代码如下:

而之前所说的循环初始化其实就是循环的加载组件,雷区就是由一个个组件构成的,通过循环将所有的格子都布置到雷区,然后再随机产生地雷并布置到雷区上。

组件位置的摆放是按照其在数组中的位置来摆放的,所有的格子组件都存放在一个二维数组之中,组件在这个数组中的下标就是他在布局中的位置。

菜单栏是由菜单组件构成的,也就是JMenu组件,这个是菜单组件,用来定义未点击时的菜单样式,这个组件有可以设置JMenauItem组件,这是菜单项的意思,是当玩家点击了菜单后展示出来的子菜单栏。

扫雷游戏的计时区以及计数区又是使用另一种组件完成的,叫做JTextField

,这个组件是文本显示的组件,在设置了不可编辑的属性后,该组件在显示的外观上会有变化,边框会变灰一些,意味着该组件不能够点击或者输入。然后使用一个方法随着时间动态的在时间区以一秒为单位增加,计数区则会随着用户标记雷而减一,可以减到负数。

在设置界面的时候还需要进行一些设置,比如设置属性来让玩家在关闭游戏窗口时,系统会自动释放资源,并关闭窗口。

4.2雷区的布置

当玩家第一次点开格子的时候系统随机布雷并启动定时器,但是为什么要在点过一次格子之后才布雷呢?原来这就是要让玩家第一次不会点到地雷,要不然玩家该多郁闷,这样才能提高玩家的游戏欲。具体实现如下所示:

判断地雷区是否处于可动作状态:

判断为左键且该格子为未探测状态:

布置地雷:

判断地雷应该被布置的位置:

4.3游戏中主要模块的介绍与使用

4.3.1鼠标事件

我们通过点击鼠标左键或者鼠标右键来完成游戏,使用系统自带的MouseDown和MouseUp事件来响应玩家的操作。

函数原型如下:

组件名称:

组件名称:

这两个原型中的参数,Button参数值分别表示玩家用鼠标的左键或者右键进行点击的。其意义如下:

1:左键      2:右键

如果同时按两个按键,那么系统就会传回3,因为点左键是1,点右键是2,一起点就是两个值相加了。

在本次的扫雷设计中,我们会用鼠标的MouseUp事件来响应玩家的操作,其中鼠标左键用来点开玩家认为没有雷的格子,鼠标右键用来标记玩家认为下面藏有雷的格子。使用MouseaUp事件而不用MouseaDown事件的原因是,前者是在当鼠标按键抬起是触发,而后者是当按键按下就触发。假如玩家在点击某一个格子的时候突然发现好像点错了,此时玩家只要继续按下鼠标右键,再抬起的时候就会发现格子被标记成地雷了,现在的游戏一般都有这个功能,这可以有效的提升玩家的游戏体验。

在人机交互的界面上,鼠标的操作是很重要的,但是程序的设计不合理会使鼠标无法发挥应有的功能。在鼠标点击事件中使用MouseUp来响应事件在上面也进行了解释,这样就可以很巧妙的让玩家体会到游戏的贴心之处,可以有效的提升玩家的游戏体验。

当鼠标左键点击格子时:

当鼠标右击标识有雷的格子时:

4.4地雷及雷区表面探测情况

在雷区的设计上,我使用循环加载组件的方法让雷区布满格子,如果玩家点击了格子就会让该格子下面隐藏的组件显示出来

玩家通过单击格子来点开格子,右击格子标记地雷。由于使用了两个数组记录地雷的位置以及被点开的信息,所以可以通过两层嵌套循环来判断该格子周围雷的数目,而且系统会点开该格子周围8个格子中没有雷的格子,这又需要用到递归调用来一直进行这个点开格子并验证的过程,直到不符合条件为止。利用这种嵌套循环以及递归调用,都会使一个耗时耗力的问题变得容易解决起来,使得代码结构也变得清晰明了,并且会提高系统的计算速度。

4.5清除未靠近地雷的格子

开始之前需要介绍并学习一下“递归”,递归的狭义解释就是一个方法调用自己本身,通过一个判断语句决定是否结束调用。在代码的设计上也是一种非常重要的代码结构,通过这种方法编写代码,会使得代码结构看起来相当简单明了。但是需要注意的是,如果操作不当会是系统无限循环调用,使得游戏崩溃,所以在编写代码时必须使用判断的语句来控制循环调用的结束,以停止该方法的递归调用。

当玩家在进行游戏时点击了任意一个格子,系统会检测周围8个格子下是否藏雷,如果雷都被标记或者没有雷就会被点开并循环调用继续判断被点开格子周围的雷数。

设计的时候需要考虑的判断条件:玩家点击了某一个格子后判断该格子下是否藏雷;如果没有雷则判断周围8个格的雷数并显示;若雷都被标记出来或者本来就没有雷则点开周围的格子递归判断被点开格子周围的雷。

由于递归是循环调用方法本身,所以需要一个判断语句来结束调用,当被点开的格子周围有雷时在格子上显示雷数并结束递归调用。

递归方法虽然很好但也有一些的缺点,除了结束条件的选取很重要外,如果在扫雷设计中将雷区的尺寸设置过大,而地雷数却很少的话会使的循环调用变慢。所以在游戏的玩法设计上也要小心谨慎,不可以胡乱定义,以免造成系统负担,使得游戏无法顺利进行下去。

代码部分如下所示

4.6游戏难度的选择

我设计的扫雷有在难度的选择上有三种难度,分别是初、中、高级,这三种难度定义的雷数和雷区的尺寸是固定的,假如玩家想要自己定义扫雷的难度可以自己设置雷数和尺寸,只要打开“自定义”配置弹窗,在之后的弹框里按提示输入雷数和尺寸,行数最大为24,列数最大为30,如果玩家设置的雷数超过了范围(比如雷数大于格子的总数或小于零),系统会默认雷数为行数减一与列数减一的乘积。

4.7菜单栏的功能

初级:设置格子总数为9*9,地雷总数为10颗雷,尺寸为300*380然后重新开始游戏。

中级:设置格子总数为16*16,地雷总数为40颗雷,尺寸为480*580然后重新开始游戏。

高级:设置格子总数为16*30,地雷总数为99颗雷,尺寸为800*500然后重新开始游戏。

自定义:设置格子总数为最大24*30,最多雷数为24*30的难度,然后重新开始游戏。

扫雷榜: 打开并显示时间最短的扫雷记录,可以进行更新和重新记分。

4.8游戏的判断

4.9游戏成功完成

游戏要求玩家在最短的时间内完成游戏,当玩家将所有的雷标记出来并且其它格子都点开以后游戏胜利,系统会弹出提示框告诉玩家“您真厉害,请输入您的名字,记录上榜!”,系统会记录玩家最短完成游戏的时间。

4.10游戏失败

如果玩家不幸点击到了有雷的格子,该格子的地雷会引爆其他的地雷,游戏失败,系统会将剩下的地雷全部显示出来,并弹框提示“你输了,请继续努力!”,玩家可以选择弹框上的重新开始游戏选项来开始一局新的游戏。

格子类的对象有一个标识该格子是否是雷的属性,通过该属性来判断玩家点到的是不是地雷。在游戏结束时也是通过该属性来判断哪些格子下有雷并显示出来。

具体代码如下所示:

5.类设计


5.1MineGame

MineGame类主要负责开始游戏,菜单的设计,以及难度的转换。展示该类的UML图

(1)成员变量

bar 是窗体的菜单栏变量。

fileMenu1 是扫雷游戏的菜单,叫做“游戏”。

fileMenu2 是扫雷的另一个菜单,叫做“帮助”。

初级 是扫雷游戏的难度变量。

中级 是扫雷游戏的难度变量。

高级 是扫雷游戏的难度变量。

扫雷榜 是扫雷的统计信息变量。

mineArea 是MineArea雷的对象,是设计雷区的变量。

file 是文件变量,用来读取扫雷记录。

hashtable 是用来临时存放扫雷记录。

showHeroRecord 是用来显示扫雷记录的变量。

(2)成员方法

MiwneGaame()通过该方法设置了游戏整体的位置和布局,并实现菜单栏功能,初始化统计信息。

actionPerformed(ActionEvent e)是响应点击菜单项的方法,通过该方法可以实现选择不同难度调整游戏的雷数和尺寸。玩家点选不同的菜单项会让该方法执行不同的操作。

main()方法是游戏开始的方法,通过new了一个MineGame的对象来实现游戏的开始。

5.2Block

Block类是一个POJO类,主要记录了雷区一个个格子的属性,比如名字,周围雷的数目等等。展示该类的UML图

(1)成员变量

Name是记录格子名字的变量。

isMine是标记格子下有无地雷的变量。

isMark是标记格子被标记状态的变量。

mineIcon记录了块的图标的变量。

isOpen是标记格子的点开状态的变量。

arounfdMinqeNmber是记录格子周围8个格子中雷的数量的变量。

(2)成员方法。

Block()无参构造方法,以防止创建错误参数的对象。

Block(String name,int aroundMineNumber,ImageIcon mineIcon,boolean isMine,boolean isMark,boolean isOpen)全参构造方法,可以为变量赋值。

setNamqe()方法可以设置块的名字。

getName()获取块的名字。

setAounMineNuber()方法可以设置块周围雷的数目。

setMineIicon()方法可以设置块的图标。

getMineIcon()获取块的图标。

setIsMinae()方法可以设置块是否是雷。

getAroundMineNumber()获取块周围雷的数目。

getIsMine()获取块是否是雷。

setIsMarek()方法可以设置块是否被标记。

getIsMark()获取块是否被标记。

setIsOpen(boolean p)设置块是否被挖开。

getIsOpen()获取块是否被挖开。

toString()以字符串的格式输出该对象。

5.3BlockView

BlockView类继承了JPanel类,主要布置每一个格子的布局,用来定义每个格子的属性。显示该类的UML图如图4-6所示。

(1)成员变量

blockeNameOrIcona 该变量用来显示格子的名字和图标属性。

blockeCoverq 是一个标记变量。

card 卡片式布局,显示第一次添加的组件。

(2)成员方法

BlockView()构造方法,初始化变量,设置块上属性显示的位置为居中,并添加组件。

giveView()方法,给每一个格子提供视图,如果该格子下有雷,会调用方法赋予该格子“地雷”的图标,但被覆盖在下面。如果下面没有雷,会显示该格子周围地雷的数目,同样会被覆盖住。该方法被调用时显示雷或者数字。

seeBlouckNamerOrIcon()方法是用来让块的属性显示出来。

seeBlouckCovear()方法是让cover遮盖块的属性。

getBlouckCovear()方法是得到用来遮盖的按钮。

5.4Record

Record类主要实现通关后弹窗提示通关的窗口,以及记录成绩。当玩家扫雷成功时,该对象提供了保存成绩到文件的界面。展示该类的UML图如图4-7所示。

(1)成员变量

time  用来给游戏计时。

grade  记录难度的变量。

key  表示一个判断的变量。

message  记录成绩的数据变量。

textName  一个文本显示组件。

label  一个可输入文本输入框组件。

确定,取消  两个按钮组件,一个代表确定,一个代表取消。

(2)成员方法

Record() 构造方法,初始化变量,设置窗口是否可以调整大小。

setGrade() 方法可以设置成绩。

writeRecord() 方法可以读写记录,如果没有记录会先创建一个新的文档来保存记录,下次直接修改覆盖记录。

setTime() 方法是用来设置时间的。

actionPerformed(ActionEvent e) 方法是响应鼠标的点击事件的方法,当玩家点击弹窗上的任意位置都会触发,但是只有点到正确的位置才会执行操作。比如点击确认,就可以把玩家的游戏记录存放到本地的文件中。

5.5ShowRecord

ShowRecord类是显示扫雷记录的类。展示该类的UML图如图4-8所示。

  1. 成员变量

file 记录成绩的文档。

name 名字。

hashtable 是记录成绩的变量。

show 是一个显示成绩的按钮组件变量。

Rescore 是一个初始分数的按钮组件变量。

Label1[] 显示成绩的组件。

Label2[] 显示成绩的组件。

Label3[] 显示成绩的组件。

(2)成员方法

ShowRecord() 方法是该类的构造方法,初始化成员变量。

readAndShow() 方法会把在文档中记录的玩家通关信息筛选出来(按游戏完成是花费的时间最短为条件筛选),并显示到弹出的对话框中。

actionPerformed(ActionEvent e)方法是响应玩家操作的方法,当玩家想要显示游戏记录的时候系统会响应玩家的要求并调用显示成绩的方法,在弹框中刷新成绩。

5.6MineArea

MineArea类主要用于雷区的初始化以及鼠标事件的响应。展示该类的UML图如图4-9所示。

  1. 成员变量

reStart 是用来显示一个重新开始的按钮。

block 是一个二维数组,定义了所有雷区的格子。

blockView 是一个二维数组,是给每一个格子提供显示视图的。

lay 是负责定义每一个格子下有雷或者没有雷。

row, colum 是负责记录雷区行列数的变量。

mineCount 是记录地雷总数的变量。

markMount 是记录玩家标记的地雷数的变量。

mark 是ImageIcon类型的变量,用来存放地雷图标。

time 是记录时间的变量。

grade 是记录难度的变量,分别有“初级”、“中级”、“高级”三种难度。

pCenter 是JPanel类型的变量,定义布局中部的控件

pNorth 是JPanel类型的变量,分别位于布局的北部的控件。

showTime 是显示扫雷时间的变量。

showMareedCoint 是显示玩家标记后剩余的雷数的变量。

record 是一个对话框变量,用来显示玩家的最好记录,当玩家点击菜单中的英雄榜时会显示该对话框。

lose 是游戏失败时显示的对话框变量。

spendTime 是一个标记变量。

panel 一个轻量级容器变量,嵌套在对话框中。

str 显示失败的提示语的一个文本框变量。

reStart1 是一个按钮对象,位于失败对话框里,玩家点击后会触发与reStart一样的操作。

  1. 成员方法

MineArea()方法是该类的构造方法,初始化组件和一下对象,设置字体颜色、边框颜色等,并调用初始化雷区的方法来初始化雷区。

initMineArea()方法用来设置雷数和游戏界面所有格子的数量,初始化雷区。

initMine()方法是真正执行初始化的方法。

setRow(int row)方法用来设置行数。

setColum(int colum)方法用来设置列数。

setMineCount(int mineCount)方法用来设置地雷总数。

setGrade(int grade)方法用来设置难度。

actionPerformed(ActionEvent)方法是响应鼠标点击格子的事件的方法,当点击的格子下面没有雷,该方法会显示该格子周围雷的数目,有雷则显示雷的图标。

show()方法是显示格子内容,并且使用递归调用来显示周围格子的内容,直到这个格子周围有雷。

mousePressed(MouseEvent)方法响应玩家对格子进行的鼠标左键单击事件和鼠标右键点击事件。

inquireWin()方法是在玩家在游戏过程中满足获胜条件是触发的方法,同时会调用其他方法弹框提示玩家游戏结束。

5.7LayMines

LayMines是计算不是雷的格周围雷个数的类,以及设置点选之后的图片样式。标明该类的UML图

  1. 成员变量

mineIcon 图片资源变量。

  1. 成员方法

LayMines() 构造方法,定义图片资源。

layMinesForBlock(Block block[][], int mineCount) 方法会判断是否是第一次点击格子,如果玩家是第一次点击格子,开始随机产生雷,但是雷不会布置到第一次点的格子上。如果不是第一次点击且该格子没有雷时会计算周围8个格子中有雷的数目并显示出来。

6.游戏实现


6.1游戏难度自定义

玩家可以自己选择游戏难度,其中有初级,中级,高级以及自定义四种难度,所对应的游戏界面的尺寸也不相同,以及地雷的总数也不相同,雷数越多则难度越大,同时玩家可以自定义游戏难度,通过输入行列数以及地雷数设置游戏界面的大小以及难度。

分别展示了初级、中级、高级以及自定义难度的游戏界面尺寸和雷数。

6.2扫雷

6.3玩家通过右键进行扫雷,并显示小红旗

玩家在游戏过程中会对某一格周围是否有雷进行判断,当玩家认为格子下有雷时就可以通过使用鼠标右键点击该格子,将该格子标识为小红旗如图5-6所示。

6.4玩家因触碰到雷而导致游戏结束

如图5-7所示,当玩家在点开了有雷的格子时,游戏失败,系统会自动将所有的地雷显示出来,并且会弹出一个窗口提示玩家:“你输了,请继续努力!”。除此以外还有两个选项,当玩家选择重新开始按钮时,游戏界面初始化,雷区中的雷全部取消,等待玩家第一次点击格子后开始布雷;如果用户点的是取消的话,就可以关掉这个提示的弹框。

6.5玩家扫雷成功

如图5-8所示,当所有的地雷用都被玩家用小红旗标识出来,并且非雷的格子也被点开时游戏结束,计时停止,系统弹框提醒玩家“您真厉害,请输入您的名字,记录上榜!”,玩家可以在这个界面输入自己的名字来保存扫雷成绩。

6.6玩家游戏数据显示

每当玩家成功扫完所有的雷后,系统会自动的记录本次的成绩,保存在本地的txt文档中,内容是三种难度,玩家姓名以及对应难度玩家所用的最少游戏时间。当玩家点击查看英雄榜的时候系统默认只显示三种难度和匿名。

玩家点击关闭时此窗口会关掉这个弹窗,当点击重新记分时,统计信息会清空,点击显示成绩就好刷新并将历史最好的成绩显示出来。界面也会发生变化,可以显示出游戏用时。

6.7程序打包发布过程

至此扫雷游戏已经编写好了,我们可以将这个游戏打包发布,这就需要利用jar.exe命令来将编写好的扫雷游戏的class文件打包发布。

(1)编写清单文件。首先需要使用“记事本”,根据要求自己编写一个清单文件,格式和内容要和这里给的样子一样,具体内容如下:

将清单文件保存到E:\workspace\扫雷\bin\com\zx\mine中,也就是和编写的扫雷游戏程序生成的字节码存放的位置相同,保证这些文件放在一个目录下。

需要注意的是,清单文件中的所有内容均为键值对的形式存放,键值直接必须空一个空格。

  1. 生成JAR文件。E:\workspace\扫雷\jarcfmGame.jarMymoon.mf*.class,这条命令中有一些参数需要明白:

①参数c意味着要让系统生成一个文件,这个文件叫做JAR。

②参数f意味着要让系统产生JAR文件的名字。

③参数m意味着显示清单文件的名字。

最后就可以将这个生成的JAR文件复制到任何一个安装了Java运行环境(电脑上的jdk版本不能太低)的电脑上,玩家就可直接用鼠标双击图标来运行自己编写的扫雷小游戏了。

6.8游戏测试结果

6.9游戏难度自定义测试

游戏难度自定义测试用例:

预期结果

选择不同的难度后可以正确的初始化雷区

输入条件

分别点击初级、中级、高级和自定义

测试结果

点选不同难度后系统会自动改变雷区大小和地雷数

写在最后

为了这次面试,也收集了很多的面试题!

以下是部分面试题截图

Java程序员秋招三面蚂蚁金服,我总结了所有面试题,也不过如此

224104578.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTkzNzU1Mg==,size_16,color_FFFFFF,t_70)

写在最后

为了这次面试,也收集了很多的面试题!

以下是部分面试题截图

[外链图片转存中…(img-O7faG6Ic-1714543983662)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 17
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的扫雷小游戏Java代码示例: ```java import java.util.*; public class Minesweeper { private static final int SIZE = 10; private static final int MINE_COUNT = 10; private static final char UNKNOWN = '-'; private static final char MINE = '*'; private static final char EXPLORED = ' '; public static void main(String[] args) { char[][] board = initializeBoard(); placeMines(board); playGame(board); } public static char[][] initializeBoard() { char[][] board = new char[SIZE][SIZE]; for (char[] row : board) { Arrays.fill(row, UNKNOWN); } return board; } public static void placeMines(char[][] board) { Random rand = new Random(); int count = 0; while (count < MINE_COUNT) { int row = rand.nextInt(SIZE); int col = rand.nextInt(SIZE); if (board[row][col] != MINE) { board[row][col] = MINE; count++; } } } public static void playGame(char[][] board) { Scanner scanner = new Scanner(System.in); int exploredCount = 0; while (exploredCount < SIZE * SIZE - MINE_COUNT) { printBoard(board); System.out.print("请输入要探索的行坐标:"); int row = scanner.nextInt(); System.out.print("请输入要探索的列坐标:"); int col = scanner.nextInt(); if (board[row][col] == MINE) { System.out.println("你被炸死了!"); break; } explore(board, row, col); exploredCount++; } if (exploredCount == SIZE * SIZE - MINE_COUNT) { System.out.println("恭喜你,你赢了!"); } } public static void explore(char[][] board, int row, int col) { if (board[row][col] != UNKNOWN) { return; } int count = 0; for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { if (isValidCell(row + i, col + j) && board[row + i][col + j] == MINE) { count++; } } } if (count == 0) { board[row][col] = EXPLORED; for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { if (isValidCell(row + i, col + j)) { explore(board, row + i, col + j); } } } } else { board[row][col] = (char) (count + '0'); } } public static boolean isValidCell(int row, int col) { return (row >= 0 && row < SIZE && col >= 0 && col < SIZE); } public static void printBoard(char[][] board) { System.out.println("当前棋盘状态:"); for (char[] row : board) { for (char cell : row) { System.out.print(cell + " "); } System.out.println(); } } } ``` 这个游戏使用字符数组表示游戏棋盘,其中未探索的单元格用"-"表示,雷的位置用"*"表示,已探索的单元格用空格表示,数字表示周围有多少个雷。游戏开始时,先生成一个大小为10x10的棋盘,并在随机位置放置10个雷。然后玩家依次输入要探索的行坐标和列坐标,程序会判断该位置是否有雷,如果有就游戏结束,否则会根据该位置周围雷的数量进行递归探索。如果玩家成功找出所有的非雷单元格,那么游戏胜利。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值