陳新龍
五子棋相信大家都玩過,當(dāng)黑子或者白子橫、豎、斜連成五子,游戲結(jié)束,獲得勝利,但是如何在編程中根據(jù)五子棋的規(guī)則實(shí)現(xiàn)勝負(fù)判定還是很難的,更別說實(shí)現(xiàn)與人機(jī)對(duì)戰(zhàn)功能了。作為初學(xué)者我們可以先實(shí)現(xiàn)一個(gè)小目標(biāo),等掌握更多編程知識(shí)后再向更高難度進(jìn)發(fā)。五子棋可以分為人機(jī)對(duì)戰(zhàn)和人人對(duì)戰(zhàn)兩種形式,人機(jī)對(duì)戰(zhàn)需要用到復(fù)雜的算法,我們就先嘗試制作人人對(duì)戰(zhàn),先完成棋盤的繪制,兩個(gè)玩家用黑子、白子交替落子。至于判斷哪一方的五子先連成一條直線也可以放在以后再來想辦法完成。
目標(biāo)明確后,再來分析目標(biāo)明確需求。需要先完成五子棋盤的繪制,接下來完成黑(白)子跟隨鼠標(biāo)運(yùn)動(dòng),棋子的圓心要落在棋盤的交叉點(diǎn)上,雙方交替落子,一個(gè)交叉點(diǎn)只能落一顆棋子,不能在棋盤外落子(圖1)。
棋盤由黑色的豎線和橫線交叉組成。在舞臺(tái)上找到一個(gè)合適的起始點(diǎn),畫一條豎線,通過循環(huán)次數(shù)控制線的數(shù)量,用繼續(xù)平移X坐標(biāo)的方法畫出剩下的線,畫橫線只需交換X和Y軸的變量即可完成。
新建變量“畫筆坐標(biāo)”來控制繪制線條X軸或Y軸的起點(diǎn),畫筆顏色設(shè)為黑色。根據(jù)舞臺(tái)大小設(shè)置兩條線相隔距離為20像素比較合適,這樣畫16條線就可以鋪滿舞臺(tái)。找一個(gè)合適的起始點(diǎn)(-198,-160),向上畫一條300長的豎線(20×15=300),將“畫筆坐標(biāo)”增加20,下一條線的起點(diǎn)就是在X軸方向平移20。循環(huán)16次,畫出全部豎線。橫線和豎線是一樣的畫法,只需要調(diào)換XY坐標(biāo)的變量。完成棋盤后廣播“黑子”,等待執(zhí)黑先行落子(圖2)。
接下來解決黑子和白子的落子問題。在造型中繪制一黑一白兩個(gè)圓形棋子作為角色。我們使用畫筆的圖章功能實(shí)現(xiàn)落子,圖章功能與克隆不同點(diǎn)在于只在當(dāng)前位置畫下一個(gè)角色的圖形,而沒有繼承角色的代碼,且不像克隆體有數(shù)量上限。
這部分的難點(diǎn)是落子的位置,落子需要在棋盤交叉點(diǎn)的中心,因?yàn)槭髽?biāo)不可能精準(zhǔn)地落在交叉點(diǎn)中心,所以需要把這個(gè)交叉點(diǎn)范圍內(nèi)的落子經(jīng)過數(shù)學(xué)計(jì)算處理。在繪制棋盤時(shí)已經(jīng)知道每個(gè)交叉點(diǎn)的坐標(biāo)都是20的整數(shù)倍,把兩個(gè)交叉點(diǎn)間距離平分則一個(gè)交叉點(diǎn)對(duì)應(yīng)半徑為10的圓形區(qū)域。這樣我們就將需求轉(zhuǎn)化成一個(gè)數(shù)學(xué)取整的問題了。
假設(shè)交叉點(diǎn)坐標(biāo)為(X,Y),鼠標(biāo)的坐標(biāo)可能是(X+a,Y+b),且-10
比如,假設(shè)交叉點(diǎn)為(40,80),鼠標(biāo)指針為(43,82)按照上述公式計(jì)算可以得出最后的落點(diǎn)位置是交叉點(diǎn)(40,80)。
解決了落子問題,接下來有幾個(gè)問題需要大家去思考一下,如何保證落下的棋子不會(huì)落在棋盤外面呢?可以根據(jù)棋盤的坐標(biāo)范圍做一個(gè)判斷,超出不能啟動(dòng)圖章功能(圖4)。
最后不要忘記了還有最為關(guān)鍵的勝負(fù)判定,大家可以思考一下,通過什么方式可以實(shí)現(xiàn),這個(gè)知識(shí)以后我們?cè)僦v。