設(shè)為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

123下一頁
返回列表 發(fā)新帖
查看: 11862|回復(fù): 20
打印 上一主題 下一主題

【☆競賽☆】高難度競賽題(VBA)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2005-10-11 08:37:00 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
題目:

  我們在Windows附件中接觸過掃雷游戲,掃雷游戲是程序提供環(huán)境,人工進(jìn)行掃雷。本題則要求根據(jù)已有的掃雷環(huán)境(附件),編寫程序進(jìn)行自動掃雷。

  附件中提供了一個已經(jīng)封裝成類的MineClass環(huán)境,實(shí)現(xiàn)了全部的游戲邏輯。解答者無需考慮游戲?qū)崿F(xiàn)方法,所需做的就是編寫人工智能程序,通過MineClass的公共接口,訪問雷區(qū)數(shù)據(jù),以及對雷區(qū)進(jìn)行操作。一旦排雷成功,將可以通過接口獲得通關(guān)密碼,作為程序完成的證據(jù)。

  由于掃雷不一定能夠一次成功,因此允許解答者的程序,在失敗后調(diào)用公共接口重新開始游戲,進(jìn)行多次嘗試,一次成功即算完成。

環(huán)境

  MineClass提供了完整的游戲交互接口,游戲使用16行,30列(左下角為1行1列),99雷的設(shè)定,并提供如下接口:



☆公共模塊:

Public Function CreateWinMine() As MineClass

公共模塊中的方法,返回一個MineClass實(shí)例,用于創(chuàng)建MineClass實(shí)例。

'雷格信息的枚舉

Public Enum CellInfoEnum

    ciNoMine = 0        '四周無地雷

    ciOneMine = 1       '四周地雷數(shù):1

    ciTwoMines = 2     '四周地雷數(shù):2

    ciThreeMines = 3    '四周地雷數(shù):3

    ciFourMines = 4     '四周地雷數(shù):4

    ciFiveMines = 5     '四周地雷數(shù):5

    ciSixMines = 6      '四周地雷數(shù):6

    ciSevenMines = 7    '四周地雷數(shù):7

    ciEightMines = 8    '四周地雷數(shù):8

   

    ciTag = 9           '雷格被標(biāo)記

    ciUnknown = 10      '雷格尚未探索

   

    ciWin = 11          '游戲已經(jīng)勝利

    ciLose = 12         '游戲已經(jīng)失敗

End Enum

'批量探索雷格的結(jié)果枚舉

Public Enum OpenCellsEnum

    ocSuccess = 1     '探索成功

    ocNotOpened = 1    '雷格未探索

    ocNotMatch = 2      '雷數(shù)與標(biāo)記數(shù)不符

    ocWin = 11          '游戲已經(jīng)勝利

    ocLose = 12         '游戲已經(jīng)失敗

End Enum

[/quote]

[quote]☆MineClass類:(游戲進(jìn)行中可使用的方法)

Public Sub NewGame()

重新游戲,所有數(shù)據(jù)全部重置,用于游戲失敗后再次嘗試。

Public Function OpenCell(Row As Long, Col As Long) As CellInfoEnum

打開單個雷格,不作任何智能擴(kuò)展,并返回打開后的狀態(tài),可通過此狀態(tài)判斷雷格周邊的地雷數(shù),也用于判斷游戲是否勝利/失敗。(最主要的操作方法)

Public Function OpenCellEx(Row As Long, Col As Long) As CellInfoEnum

以擴(kuò)展方式打開單個雷格,即當(dāng)此地雷格四周無地雷時,將自動打開四周的所有雷格,并返回打開后的狀態(tài),可通過此狀態(tài)判斷雷格周邊的地雷數(shù),也用于判斷游戲是否勝利/失敗。(雖然此方法功能強(qiáng)大,但是無法跟蹤被打開的所有雷格,無法提供調(diào)用者全部的信息,因此此方法僅備用。)

Public Function OpenCells(Row As Long, Col As Long) As OpenCellsEnum

以擴(kuò)展方式打開多個雷格,即當(dāng)此地雷格四周的地雷數(shù)和標(biāo)記數(shù)相等時,自動以擴(kuò)展方式打開四周的所有的未標(biāo)記雷格,并返回打開后的狀態(tài),可通過此狀態(tài)判斷游戲是否勝利/失敗。(雖然此方法功能強(qiáng)大,但是無法跟蹤被打開的所有雷格,無法提供調(diào)用者全部的信息,因此此方法僅備用。)

Public Function ReadCell(Row As Long, Col As Long) As CellInfoEnum

不對雷格進(jìn)行任何操作,僅再次讀取其狀態(tài)。

Public Function SetTag(Row As Long, Col As Long, Optional TagStatus As Variant) As Boolean

設(shè)置雷格標(biāo)記,TagStatus可指定為True或False,也可省略,MineClass將自動反置當(dāng)前的雷格標(biāo)記狀態(tài),同時將返回設(shè)置完畢后的雷格標(biāo)記狀態(tài)。

[/quote]

[quote]☆MineClass類:(游戲勝利/失敗后可使用的方法)

Public Function GetWinCode() As String

游戲勝利后獲取過關(guān)密碼

<DIV class=quote>ublic Functi
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 分享淘帖 訂閱訂閱
2#
發(fā)表于 2005-10-14 02:52:00 | 只看該作者
高手玩的東東,在下只能做個看客了!。。。。。。。。。。。。。
3#
發(fā)表于 2005-10-16 19:57:00 | 只看該作者
不錯,瞧 瞧
4#
發(fā)表于 2005-10-18 18:24:00 | 只看該作者
不錯,很高深,能否分享實(shí)現(xiàn)方法
5#
 樓主| 發(fā)表于 2005-10-18 22:28:00 | 只看該作者

【☆競賽☆】高難度競賽題(VBA)

以下是引用xinbao在2005-10-18 10:24:00的發(fā)言:

不錯,很高深,能否分享實(shí)現(xiàn)方法

附件是完全開放源碼的。
6#
發(fā)表于 2005-11-19 01:22:00 | 只看該作者
難度很高哦,很復(fù)雜
7#
發(fā)表于 2006-3-9 18:03:00 | 只看該作者
頂一把。。。。。。
8#
發(fā)表于 2006-5-16 23:21:00 | 只看該作者
WinCode is HA4987HAE16951A0DF.
9#
 樓主| 發(fā)表于 2006-5-18 21:08:00 | 只看該作者
以下是引用方漠在2006-5-16 15:21:00的發(fā)言:


WinCode is HA4987HAE16951A0DF.



這只是答案的一部分,如果只是需要這個代碼,二進(jìn)制破解一樣可以得到。

本題是一個AI程序的題目。
10#
發(fā)表于 2006-5-20 01:56:00 | 只看該作者
呵呵!沒玩過掃雷,所以走捷徑。不過兄臺那些代碼還是有認(rèn)真看過的,收獲頗多。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

QQ|站長郵箱|小黑屋|手機(jī)版|Office中國/Access中國 ( 粵ICP備10043721號-1 )  

GMT+8, 2024-10-23 08:31 , Processed in 0.085990 second(s), 34 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表