五子棋相信大家都玩過,當黑子或者白子橫、豎、斜連成五子,遊戲結束,獲得勝利,但是如何在編程中根據五子棋的規則實現勝負判定還是很難的,更别說實現與人機對戰功能了。作為初學者我們可以先實現一個小目标,等掌握更多編程知識後再向更高難度進發。五子棋可以分為人機對戰和人人對戰兩種形式,人機對戰需要用到複雜的算法,我們就先嘗試制作人人對戰,先完成棋盤的繪制,兩個玩家用黑子、白子交替落子。至于判斷哪一方的五子先連成一條直線也可以放在以後再來想辦法完成。
1.繪制棋盤
目标明确後,再來分析目标明确需求。需要先完成五子棋盤的繪制,接下來完成黑(白)子跟随鼠标運動,棋子的圓心要落在棋盤的交點上,雙方交替落子,一個交叉點隻能落一個棋子,不能在棋盤外落子(圖1)。
棋盤由黑色的豎線和橫線交叉組成。在舞台上找到一個合适的起始點,畫一條豎線,通過循環次數控制線的數量,用繼續平移X坐标的方法畫出剩下的線,畫橫線隻需交換X和Y軸的變量就可完成。
新建變量“畫筆坐标”來控制繪制線條X軸或Y軸的起點,畫筆顔色設為黑色。根據舞台大小設置兩條線相隔距離為20像素比較合适,這樣畫16條線就可以鋪滿舞台。找一個合适的起始點(-198,-160),向上畫一條300長的豎線(20×15=300),将“畫筆坐标”增加20,下一條線的起點就是在X軸方向平移20。循環16次,畫出全部豎線。橫線和豎線是一樣的畫法,隻需要調換XY坐标的變量。完成棋盤後廣播“黑子”,等待執黑先行落子(圖2)。
2.棋子編程
接下來解決黑子和白子的落子問題。在造型中繪制一黑一白兩個圓形棋子作為角色。落子我們使用畫筆的圖章功能,圖章功能是隻在當前位置畫下一個角色的樣子,而沒有繼承角色的代碼,這與克隆不同。這部分的難點是解決落子的位置,落子需要在棋盤交點的中心,因為鼠标不可能精準得落在交點中心,所以需要把這個交點附近的落點經過數學計算處理。在繪制棋盤時已經知道每個交叉點的坐标都是20的整數倍,把兩個交點間距離平分則一個交點對應半徑為10的圓形區域。這樣就轉化成一個數學取整的問題。假設交叉點坐标為(X,Y),鼠标的坐标可能是(X a,Y b),且-10<a<10,-10<b<10,用鼠标的坐标除以20後得到的數字四舍五入後,再乘20就是這個交叉點的坐标(圖3)。
比如,假設交叉點為(40,80),鼠标指針為(43,82)按照上述公式計算可以得出最後的落點位置是交叉點為(40,80)。
解決了落子問題,接下來有幾個問題需要大家去思考一下,如何保證落子的棋子不會落在棋盤外面呢?可以根據棋盤的坐标做一個範圍判斷(圖4)。
最後不要忘記了還有最為關鍵勝負判定,大家可以思考一下,通過什麼方式可以實現,這個以後我們再講。
,