|
题目:
我们在Windows附件中接触过扫雷游戏,扫雷游戏是程序提供环境,人工进行扫雷。本题则要求根据已有的扫雷环境(附件),编写程序进行自动扫雷。
附件中提供了一个已经封装成类的MineClass环境,实现了全部的游戏逻辑。解答者无需考虑游戏实现方法,所需做的就是编写人工智能程序,通过MineClass的公共接口,访问雷区数据,以及对雷区进行操作。一旦排雷成功,将可以通过接口获得通关密码,作为程序完成的证据。
由于扫雷不一定能够一次成功,因此允许解答者的程序,在失败后调用公共接口重新开始游戏,进行多次尝试,一次成功即算完成。
环境:
MineClass提供了完整的游戏交互接口,游戏使用16行,30列(左下角为1行1列),99雷的设定,并提供如下接口:
Public Function CreateWinMine() As MineClass
公共模块中的方法,返回一个MineClass实例,用于创建MineClass实例。
'雷格信息的枚举
Public Enum CellInfoEnum
ciNoMine = 0 '四周无地雷
ciOneMine = 1 '四周地雷数:1
ciTwoMines = 2 '四周地雷数:2
ciThreeMines = 3 '四周地雷数:3
ciFourMines = 4 '四周地雷数:4
ciFiveMines = 5 '四周地雷数:5
ciSixMines = 6 '四周地雷数:6
ciSevenMines = 7 '四周地雷数:7
ciEightMines = 8 '四周地雷数:8
ciTag = 9 '雷格被标记
ciUnknown = 10 '雷格尚未探索
ciWin = 11 '游戏已经胜利
ciLose = 12 '游戏已经失败
End Enum
'批量探索雷格的结果枚举
Public Enum OpenCellsEnum
ocSuccess = 1 '探索成功
ocNotOpened = 1 '雷格未探索
ocNotMatch = 2 '雷数与标记数不符
ocWin = 11 '游戏已经胜利
ocLose = 12 '游戏已经失败
End Enum
[/quote]
[quote]☆MineClass类:(游戏进行中可使用的方法)
Public Sub NewGame()
重新游戏,所有数据全部重置,用于游戏失败后再次尝试。
Public Function OpenCell(Row As Long, Col As Long) As CellInfoEnum
打开单个雷格,不作任何智能扩展,并返回打开后的状态,可通过此状态判断雷格周边的地雷数,也用于判断游戏是否胜利/失败。(最主要的操作方法)
Public Function OpenCellEx(Row As Long, Col As Long) As CellInfoEnum
以扩展方式打开单个雷格,即当此地雷格四周无地雷时,将自动打开四周的所有雷格,并返回打开后的状态,可通过此状态判断雷格周边的地雷数,也用于判断游戏是否胜利/失败。(虽然此方法功能强大,但是无法跟踪被打开的所有雷格,无法提供调用者全部的信息,因此此方法仅备用。)
Public Function OpenCells(Row As Long, Col As Long) As OpenCellsEnum
以扩展方式打开多个雷格,即当此地雷格四周的地雷数和标记数相等时,自动以扩展方式打开四周的所有的未标记雷格,并返回打开后的状态,可通过此状态判断游戏是否胜利/失败。(虽然此方法功能强大,但是无法跟踪被打开的所有雷格,无法提供调用者全部的信息,因此此方法仅备用。)
Public Function ReadCell(Row As Long, Col As Long) As CellInfoEnum
不对雷格进行任何操作,仅再次读取其状态。
Public Function SetTag(Row As Long, Col As Long, Optional TagStatus As Variant) As Boolean
设置雷格标记,TagStatus可指定为True或False,也可省略,MineClass将自动反置当前的雷格标记状态,同时将返回设置完毕后的雷格标记状态。
[/quote]
[quote]☆MineClass类:(游戏胜利/失败后可使用的方法)
Public Function GetWinCode() As String
游戏胜利后获取过关密码
<DIV class=quote>ublic Functi |
|