【正文】
設(shè)定狀態(tài)圖示 Call setStateImage MsgBox 您探測(cè)地雷的時(shí)間已超過(guò),地雷已引爆。時(shí)間計(jì)數(shù)顯示 第 15 頁(yè) 共 18 頁(yè) Call setNowTimer 39。具體代碼如下所示: 39。 當(dāng)在設(shè)定時(shí)間內(nèi)未探 測(cè)完所有的地雷,地雷也將會(huì)引爆,對(duì)于這第二種行為,我們可以通過(guò) Timer 組件來(lái)加以控制。 還有一種情況便是當(dāng)只剩下地雷未探測(cè)的時(shí)候,及雷區(qū)方塊總數(shù) 已清除的方塊數(shù) =地雷總數(shù)的話(huà),游戲也將成功完成。 代碼部分如下所示 : Private Sub doClear(ByVal x As Integer, _ ByVal y As Integer, _ ByVal index As Integer) MINE_NUM_CLEAR = MINE_NUM_CLEAR + 1 For xx = x 1 To x + 1 For yy = y 1 To y + 1 If xx = 0 And xx = MAP_X And _ yy = 0 And yy = MAP_Y Then If Not (xx = x And yy = y) Then If mapFaceArr(xx, yy) = 1 And _ mapArr(xx, yy) = 0 And _ mapArr(xx, yy) = 8 Then mapFaceArr(xx, yy) = 0 Select Case mapArr(xx, yy) Case 0 Call setMineImage((yy * MAP_X + xx), 10) Call doClear(xx, yy, (yy * MAP_X + xx)) Case 1 To 8 MINE_NUM_CLEAR = MINE_NUM_CLEAR + 1 第 14 頁(yè) 共 18 頁(yè) Call setMineImage((yy * MAP_X + xx), mapArr(xx, yy)) End Select End If End If End If Next yy Next xx End Sub 這里我 設(shè)置了“初級(jí)”,“中級(jí)”,“高級(jí)”以及“自定義”四個(gè)不同的難度級(jí)別,“初級(jí)”,“中級(jí)”,“高級(jí)”中的雷區(qū)大小和地雷總數(shù)是已經(jīng)設(shè)計(jì)好了的,如果玩家想要自己設(shè)置這些參數(shù),可單擊“游戲”→“自定義”,然后在“設(shè)置”中輸入行數(shù),列數(shù)及地雷數(shù),在這里我對(duì)行數(shù)及列數(shù)做出了一個(gè)限定,及行數(shù)和列數(shù)的最大值分別為 24 和 30,當(dāng)在設(shè)置地雷數(shù)的時(shí)候,如果地雷數(shù)大于或等于行數(shù)和列數(shù)的乘積,或者地雷數(shù)小于零,地雷數(shù)都將自動(dòng)的轉(zhuǎn)換為:地雷數(shù) =(行數(shù) 1)(列數(shù) 1)。 前面已經(jīng)提到,遞歸必須設(shè)計(jì)終止的條件判斷,在本游戲的遞歸架構(gòu)中,當(dāng)判斷方塊的內(nèi)容為數(shù)字時(shí)(即在非地雷方塊周?chē)?,即立即停止遞歸程序。 在游戲過(guò)程中,當(dāng)游戲者按下非地雷方塊時(shí),方塊會(huì)沿四周八個(gè)方向向外翻開(kāi)非地雷的方塊。 塊 這里 先引入一個(gè)“遞歸”的概念,“遞歸” (Recursion)簡(jiǎn)單的說(shuō),就是一個(gè)程序能被自己所定義的語(yǔ)句調(diào)用。另外,當(dāng)游戲玩家按下非地雷的方塊時(shí),程序必須自動(dòng)將周邊非地雷的方塊翻開(kāi),這個(gè)動(dòng)作我們也可以通過(guò)雙循環(huán)的方式檢查以按下的方塊為中心與周邊的 8 個(gè)方塊所形成的 3*3 的二維數(shù)組,鼠標(biāo)指針?biāo)讣词谴戆聪碌姆綁K,利用雙循環(huán) 作數(shù)據(jù)的對(duì)比,不但速度快,而且在設(shè)計(jì)階段,程序的架構(gòu)也比較清楚。標(biāo)示 mapFaceArr(xxx, yyy) = 3 MINE_NUM_LABEL = MINE_NUM_LABEL 1 Call setMineImage(index, 14) Call setNowMines ElseIf mapFaceArr(xxx, yyy) = 3 Then 39。鼠標(biāo)右鍵 If mapFaceArr(xxx, yyy) = 1 Then 39。 游戲的操作方面主要以鼠標(biāo)為主,當(dāng)鼠標(biāo)指針對(duì)準(zhǔn)未翻開(kāi)的方塊按下左鍵時(shí)即表示翻開(kāi)方塊 : If Button = 1 Then 39。 在窗口的軟件中,鼠標(biāo)的應(yīng)用是不可或缺的,但鼠標(biāo)固然好用,如果程序設(shè)計(jì)不當(dāng),也可能造成使用者的不便。其意義如下: 1:左鍵 2:右鍵 倘若同時(shí)按下不止一個(gè)按鍵時(shí),則傳回?cái)?shù)值為按鍵數(shù)值相加,例如同時(shí)按下左鍵及右鍵,則 Button 值為 1+2=3 第 11 頁(yè) 共 18 頁(yè) 在本游戲中,我們利用右鍵的 MouseDown 事件來(lái)標(biāo)示“已標(biāo)示”方塊,利用左 鍵的 MouseDown 事件,來(lái)標(biāo)示游戲者準(zhǔn)備按下的方塊,再利用左鍵的 MouseUp事件來(lái)確定翻開(kāi)的方塊。 在 MouseDown 與 MouseUp 事件中,可以捕捉鼠標(biāo)所按下或放開(kāi)的按鍵為何、鼠標(biāo)光標(biāo)在該組件上的坐標(biāo)及是否同時(shí)按下輔助鍵等。非點(diǎn)選的方塊坐標(biāo)時(shí) 第 10 頁(yè) 共 18 頁(yè) If mapArr(rX, rY) 9 And _ Not (rX = xxx And rY = yyy) Then cMINE_NUM = cMINE_NUM 1 mapArr(rX, rY) = 9 39。布置地雷 Do While cMINE_NUM 0 rX = Rnd() * (MAP_X 1) rY = Rnd() * (MAP_Y 1) 39。判斷為左鍵且該方塊為未探測(cè)狀態(tài) If Button = 1 And mapFaceArr(xxx, yyy) = 1 Then