陳新龍
井字棋,英文名叫Tic-Tac-Toe,是一種在3×3格子上進(jìn)行的連珠游戲,和五子棋類似,由于棋盤一般不畫邊框,格線排成井字故得名。游戲需要的工具僅為紙和筆,然后由分別代表O和X的兩個(gè)游戲者輪流在格子里留下標(biāo)記(一般來說先手者為X),任意三個(gè)標(biāo)記形成一條直線,則為獲勝。由于井子棋難度低,常用作兒童游戲。玩過這個(gè)游戲的人都會(huì)發(fā)現(xiàn),如果兩個(gè)玩家都做出最優(yōu)選擇,這個(gè)游戲一定會(huì)出現(xiàn)平局。別看這個(gè)游戲簡(jiǎn)單,但用數(shù)學(xué)計(jì)算它整個(gè)過程卻復(fù)雜得多,從理論上講“井字棋”一共可能有19683種現(xiàn)象!今天就和大家一起用Scratch把“井字棋”游戲給做出來。這個(gè)游戲的代碼沒有大家想象的那么難,只要大家跟緊思路就沒有任何問題,讓我們一起開始吧(圖1)。

首先我們創(chuàng)建需要的角色和背景。點(diǎn)擊舞臺(tái)背景在造型中繪制四條線作為棋盤,線條的間距稍微放寬一些,粗細(xì)也稍微加粗一些。再寫上X WIN和O WIN兩種結(jié)局的背景造型。
完成三個(gè)背景造型之后,新建角色,這個(gè)角色的造型中需要添加四個(gè)不同的造型,分別是兩個(gè)正方形的方塊,方塊比棋盤格子稍微小一點(diǎn)。顏色為一白一灰用于遮擋和顯示鼠標(biāo)焦點(diǎn)。當(dāng)鼠標(biāo)移動(dòng)到棋盤上的格子時(shí),顏色切換成灰色,默認(rèn)情況下顏色為白色。另外兩個(gè)角色是X和O用來表示棋子。準(zhǔn)備好的背景和角色如圖2。

一切就緒后,可以開始編寫代碼了,我們先為棋盤每個(gè)格子編號(hào),左下角為1號(hào)位,右上角為9號(hào)位。使用兩個(gè)變量sign_num(用于標(biāo)記每個(gè)方塊的編號(hào))和toggle(用于標(biāo)記每個(gè)方塊背后的X或者O)。
將角色造型切換成白色方塊,移動(dòng)到1號(hào)位(-115,-112)。套用雙重循環(huán),每次重復(fù)執(zhí)行3次,克隆自己,將X坐標(biāo)增加115(X和Y的數(shù)值是根據(jù)棋盤與角色方塊的高寬實(shí)際情況計(jì)算出來的,可以自行調(diào)整)。同時(shí)將sign_num的值增加1,內(nèi)層循環(huán)結(jié)束。將X坐標(biāo)重新設(shè)為-115,恢復(fù)到左邊格子的坐標(biāo),將Y坐標(biāo)增加110,角色到了中間一行。3×3次循環(huán)結(jié)束之后,棋盤中的每個(gè)方格都有了一個(gè)克隆體(如圖3)。

為了標(biāo)記這些克隆體,我們新建一個(gè)列表cell、一個(gè)變量count,默認(rèn)起始情況下刪除cell中的全部?jī)?nèi)容,將變量count設(shè)置為10,重復(fù)執(zhí)行9次,將數(shù)字10-19添加到列表中,對(duì)應(yīng)9個(gè)位置的角色。列表有兩個(gè)作用,第一作為區(qū)分方格的數(shù)字編號(hào),第二游戲時(shí)將X和O與列表中的數(shù)字進(jìn)行替換用來記錄棋局,到此第一步結(jié)束(如圖4)。

游戲開始后所有克隆體快速鋪滿棋盤后,初始狀態(tài)是所有的方格上都是白色的造型(造型編號(hào)=1)。我們移動(dòng)鼠標(biāo)開始游戲,當(dāng)碰到鼠標(biāo)指針后切換成灰色造型(造型編號(hào)=2),之后分成兩種情況,點(diǎn)擊鼠標(biāo)落子和沒有操作移開鼠標(biāo)。
當(dāng)按下鼠標(biāo)且該位置沒有棋子時(shí)(造型編號(hào)=2)可以落子,按照井字棋游戲的規(guī)則,兩個(gè)玩家輪流按下鼠標(biāo)打叉(X)和畫圈(O),我們可以通過toggle變量來控制X和O的次序,當(dāng)toggle為奇數(shù)時(shí)(toggle除以2的余數(shù)=1時(shí)說明toggle是奇數(shù)),切換成O的造型,當(dāng)toggle為偶數(shù)時(shí),切換成X的造型,切換造型之后將列表中格子對(duì)應(yīng)的項(xiàng)替換成X或O。每次鼠標(biāo)點(diǎn)擊,toggle數(shù)值增加1。
當(dāng)沒有點(diǎn)擊操作,鼠標(biāo)移開,就將灰色塊恢復(fù)成白色塊。
到目前為止,游戲已經(jīng)可以操作了,只是還缺少了最重要的一部分判斷勝利,就是需要判斷是否產(chǎn)生了三連。井字棋不同于五子棋,獲取勝利的局面數(shù)量很少,才橫三條、豎三條、斜線兩條共八種可能。我們只需要將八種方式一一列舉出來就可以了,比如當(dāng)列表的第1項(xiàng)=等2項(xiàng)=第3項(xiàng)的時(shí)候,對(duì)應(yīng)方格中的1、2、3號(hào)位剛好橫向連成一條線。實(shí)際編程時(shí)使用“第1項(xiàng)=等2項(xiàng)與等2項(xiàng)=第3項(xiàng)”。再根據(jù)方格中的內(nèi)容來判斷到底是哪一方獲得了勝利。最后用廣播的方式傳遞勝利信息給背景顯示出來(如圖5)。

到這里,我們的井字棋游戲也成功完成了,這里小陳老師留一個(gè)問題,在目前井字棋代碼中我只判斷了贏和輸,如果最終的結(jié)局是平局該怎么用代碼表示呢?剩下整個(gè)問題就交給大家了。一起動(dòng)腦思考一下吧,期待你們的答案。