设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 948|回复: 7
打印 上一主题 下一主题

[与其它组件] 【☆竞赛☆】高难度竞赛题(VBA)

[复制链接]
跳转到指定楼层
1#
发表于 2005-10-10 12:19:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题目:

  我们在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 Func

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2005-10-10 16:29:00 | 只看该作者
偶试试哈
3#
 楼主| 发表于 2005-10-10 19:23:00 | 只看该作者
欢迎转载和引用,无论来自何方,欢迎更多的人来解答这道题目。
4#
发表于 2005-10-10 19:28:00 | 只看该作者
晕,这种俺要看懂意思都要半天
5#
 楼主| 发表于 2005-10-10 19:33:00 | 只看该作者

【☆竞赛☆】高难度竞赛题(VBA)

以下是引用海狸先生在2005-10-10 11:28:00的发言:

晕,这种俺要看懂意思都要半天



你就这么理解,这也是一个扫雷游戏,只是不是通过界面给人玩的,而是通过接口给程序玩的。现在要求编写一个程序来玩通这个游戏。

点击这里给我发消息

6#
发表于 2005-10-14 19:36:00 | 只看该作者
我怎么下载的文件是错误的?算了,反正这么高难度的问题非我等菜鸟所能明白。
7#
 楼主| 发表于 2005-10-14 19:44:00 | 只看该作者
以下是引用轻风在2005-10-14 11:36:00的发言:

我怎么下载的文件是错误的?算了,反正这么高难度的问题非我等菜鸟所能明白。

重新下载,文件不会错误,我刚刚下载过。
8#
 楼主| 发表于 2005-10-14 19:45:00 | 只看该作者
本贴已经重发,请回复到置顶的同名贴中,为避免两边发贴,这贴锁了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2025-1-25 21:51 , Processed in 0.099257 second(s), 33 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表