安殷福 林子翼
直到Windows 7,微軟的Windows系統(tǒng)一直自帶《掃雷》這款益智小游戲。游戲目標(biāo)是在最短的時(shí)間內(nèi)根據(jù)點(diǎn)擊方塊出現(xiàn)的數(shù)字找出所有非雷方塊,同時(shí)避免踩雷,踩到一個(gè)地雷游戲即結(jié)束。這款游戲規(guī)則簡(jiǎn)單容易上手,雖然微軟的本意是讓用戶熟悉鼠標(biāo)操作,由于游戲簡(jiǎn)單有趣,所以受到大眾的喜歡。Win10以后版本可以在應(yīng)用商店中搜索“掃雷”,免費(fèi)下載第一個(gè)“Microsoft Minesweeper”即可(圖1)。
現(xiàn)在我們來(lái)思考如何用Scratch來(lái)制作這款游戲呢?游戲關(guān)鍵需要實(shí)現(xiàn)以下幾個(gè)流程:
1. 確定方塊的點(diǎn)坐標(biāo)
2. 布置遮罩方塊
3. 隨機(jī)埋雷
4. 布置數(shù)字方塊
1. 主界面角色有:游戲標(biāo)題“掃雷Mine sweeper”、3個(gè)難度按鈕及對(duì)應(yīng)3個(gè)介紹、返回主界面按鈕(圖2)。
2. 游戲界面角色有:遮罩方塊、數(shù)字方塊(空白0到數(shù)字8)有9個(gè)造型、地雷、提示語(yǔ)“正在構(gòu)建中,可能需要幾秒,請(qǐng)等待”、返回主界面按鈕繼續(xù)復(fù)用。
3. 列表和變量
列表2個(gè):坐標(biāo)組X,坐標(biāo)組Y;變量8個(gè):邊長(zhǎng)、探測(cè)、周圍雷數(shù)、總雷數(shù)、tx、ty、X坐標(biāo)、Y坐標(biāo)。它們的具體作用在后文中再作介紹。
以最簡(jiǎn)單的6×6掃雷方陣為例。點(diǎn)擊“簡(jiǎn)單”按鈕后,先確定一個(gè)左上角的點(diǎn)坐標(biāo),這里選擇了點(diǎn)(-50,50),利用循環(huán)控制模塊,雙重循環(huán)六次,將X坐標(biāo)、Y坐標(biāo)分別加入到列表“坐標(biāo)組X”和“坐標(biāo)組Y”中去。最后得到36組數(shù)據(jù),即36個(gè)方塊的點(diǎn)坐標(biāo),然后廣播“開始游戲”(圖3、圖4)。
對(duì)角色遮罩方塊編程,利用重復(fù)執(zhí)行N次模塊,嵌套使用,可以克隆出36個(gè)自己。設(shè)置成綠旗點(diǎn)擊時(shí)先隱藏。為了要遮住下面的數(shù)字方塊和雷塊,當(dāng)作為克隆體啟動(dòng)時(shí),前移一層,并顯示。游戲進(jìn)入等待用戶點(diǎn)擊的狀態(tài)(圖5)。
當(dāng)鼠標(biāo)點(diǎn)擊時(shí)有2種動(dòng)作,如果碰到雷塊則廣播游戲結(jié)束,否則刪除此克隆體,將遮住的數(shù)字方塊顯示出來(lái)(圖6)。
當(dāng)收到“開始游戲”消息后,就可以進(jìn)行埋雷了。先將其大小設(shè)為80,然后根據(jù)總雷數(shù),重復(fù)執(zhí)行相應(yīng)次數(shù),每次埋一顆雷,使用自定義埋雷模塊,并設(shè)其X坐標(biāo)為坐標(biāo)組X的某個(gè)隨機(jī)元素,其Y坐標(biāo)為坐標(biāo)組Y的某個(gè)隨機(jī)元素。比如,某顆雷產(chǎn)生在位置(2,3),某顆雷產(chǎn)生在位置(5,2)等等,全部埋雷結(jié)束后,將母體移走,并廣播“埋雷結(jié)束”(圖7)。
在克隆啟動(dòng)的時(shí)候,將雷后移2層,這樣不會(huì)遮住數(shù)字方塊,其實(shí),數(shù)字方塊一共有36個(gè),雷所在的位置也有,只是最后不顯示在游戲者面前而已,也不影響游戲的正常進(jìn)行(圖8、圖9)。
在收到“埋雷結(jié)束”消息后,就可以布置數(shù)字方塊了。和布置遮罩方塊相比,布置數(shù)字方塊需要產(chǎn)生不同克隆體的造型。這就要完成一項(xiàng)關(guān)鍵性的任務(wù):數(shù)雷。即此方塊周圍八個(gè)相鄰的方塊中,總共有幾顆雷,有N顆雷,則顯示數(shù)字N(圖10)。
如何來(lái)實(shí)現(xiàn)呢?可以讓產(chǎn)生的克隆體做一次環(huán)“球”旅行,這個(gè)“球”就是自己,圍繞自己轉(zhuǎn)一圈,總共八個(gè)點(diǎn)位,每走一個(gè)點(diǎn)位,判斷一下,是否碰到雷塊,如果碰到了,周圍雷數(shù)加一,最后回到自己的初始位置,因?yàn)樵煨蛿?shù)是從0開始的,所以需要換成周圍雷數(shù)+1的造型。
最后將周圍雷數(shù)賦值成0,進(jìn)行下一次的計(jì)算。數(shù)字方塊代碼如圖11、圖12。
到這里,掃雷游戲可以說(shuō)制作成功了,可以進(jìn)行隨機(jī)布雷,也能顯示正確的雷數(shù),遇到雷會(huì)提示游戲失敗。但是,其實(shí)這里面還有一些問(wèn)題,比如,總雷數(shù)不一定是我們預(yù)設(shè)的8,有時(shí)會(huì)因?yàn)閮纱坞S機(jī)布雷在同一個(gè)位置,出現(xiàn)少于預(yù)設(shè)總雷數(shù)的現(xiàn)象。
又比如目前程序是以邊長(zhǎng)6×6的方陣為例編寫的,那么如何擴(kuò)展成不同難度的級(jí)別更大的方陣呢?你可以參考左圖的代碼(圖13)。
還有,可不可以用鼠標(biāo)右鍵或其他按鈕標(biāo)記雷塊呢?單擊數(shù)字為零的方塊上,能不能將其周圍8個(gè)方塊全部顯示呢?聰明的讀者,一起開動(dòng)腦筋思考吧!