陳新龍
五子棋相信大家都玩過,當黑子或者白子橫、豎、斜連成五子,游戲結束,獲得勝利,但是如何在編程中根據五子棋的規則實現勝負判定還是很難的,更別說實現與人機對戰功能了。作為初學者我們可以先實現一個小目標,等掌握更多編程知識后再向更高難度進發。五子棋可以分為人機對戰和人人對戰兩種形式,人機對戰需要用到復雜的算法,我們就先嘗試制作人人對戰,先完成棋盤的繪制,兩個玩家用黑子、白子交替落子。至于判斷哪一方的五子先連成一條直線也可以放在以后再來想辦法完成。
目標明確后,再來分析目標明確需求。需要先完成五子棋盤的繪制,接下來完成黑(白)子跟隨鼠標運動,棋子的圓心要落在棋盤的交叉點上,雙方交替落子,一個交叉點只能落一顆棋子,不能在棋盤外落子(圖1)。

棋盤由黑色的豎線和橫線交叉組成。在舞臺上找到一個合適的起始點,畫一條豎線,通過循環次數控制線的數量,用繼續平移X坐標的方法畫出剩下的線,畫橫線只需交換X和Y軸的變量即可完成。
新建變量“畫筆坐標”來控制繪制線條X軸或Y軸的起點,畫筆顏色設為黑色。根據舞臺大小設置兩條線相隔距離為20像素比較合適,這樣畫16條線就可以鋪滿舞臺。找一個合適的起始點(-198,-160),向上畫一條300長的豎線(20×15=300),將“畫筆坐標”增加20,下一條線的起點就是在X軸方向平移20。循環16次,畫出全部豎線。橫線和豎線是一樣的畫法,只需要調換XY坐標的變量。完成棋盤后廣播“黑子”,等待執黑先行落子(圖2)。

接下來解決黑子和白子的落子問題。在造型中繪制一黑一白兩個圓形棋子作為角色。我們使用畫筆的圖章功能實現落子,圖章功能與克隆不同點在于只在當前位置畫下一個角色的圖形,而沒有繼承角色的代碼,且不像克隆體有數量上限。
這部分的難點是落子的位置,落子需要在棋盤交叉點的中心,因為鼠標不可能精準地落在交叉點中心,所以需要把這個交叉點范圍內的落子經過數學計算處理。在繪制棋盤時已經知道每個交叉點的坐標都是20的整數倍,把兩個交叉點間距離平分則一個交叉點對應半徑為10的圓形區域。這樣我們就將需求轉化成一個數學取整的問題了。
假設交叉點坐標為(X,Y),鼠標的坐標可能是(X+a,Y+b),且-10
比如,假設交叉點為(40,80),鼠標指針為(43,82)按照上述公式計算可以得出最后的落點位置是交叉點(40,80)。
解決了落子問題,接下來有幾個問題需要大家去思考一下,如何保證落下的棋子不會落在棋盤外面呢?可以根據棋盤的坐標范圍做一個判斷,超出不能啟動圖章功能(圖4)。

最后不要忘記了還有最為關鍵的勝負判定,大家可以思考一下,通過什么方式可以實現,這個知識以后我們再講。