第 46 課 - 五子棋小遊戲 (七) - 簡單勝利判斷
本課介紹
本課為五子棋系列最後一課
這次的目標就是要寫一個簡單的勝利判斷
來看看怎麼寫吧!
教學影片
重點提示
製作重點
- 檢查勝利的方式 - 只要檢查最後下的那顆棋子的八個方向是否有五顆棋子連成一直線
- 在測試程式時,若發生錯誤,可以把滑鼠移到變數上。此時就會顯示該變數的值為多少。
- 注意在 if 內有多個條件時,若程式發現只要檢查前面的條件就足夠,後面的條件就不會被執行。
製作步驟
- 在
Board內新增一個 privatePoint變數,lastPlacedNote,一開始設為NO_MATCH_NODE- 新增一個 public get 存取器
LastPlacedNote,用來取得lastPlacedNote - 在
Board內的PlaceAPiece把最後下子的位置存在lastPlacedNote
- 新增一個 public get 存取器
- 在
Game內新增一個 privatePieceType變數winner,一開始設為PieceType.NONE- 新增一個 public get 存取器
Winner,用來取得winner
- 新增一個 public get 存取器
- 在
Game.PlaceAPiece內的交換選手前,加入CheckWinner。代表在交換前會先檢查勝利者。 - 實作
Game的CheckWinner()(先檢查一個方向)- 先用兩個變數
centerX跟centerY儲存board.LastPlacedNote的 X 跟 Y 座標 - 加入一個 while 迴圈檢查五顆座標連續的棋子是否顏色相同。檢查棋盤上某個位置的顏色可以用
board.GetPieceType(x, y)。- 記得在呼叫
board.GetPieceType(x, y)前,先檢查座標是否有超出棋盤邊界 - 若發現有一顆顏色不同就提早跳出 (break)
- 記得在呼叫
- 檢查是否看到五顆棋子,若沒看到代表沒有勝利者
- 先用兩個變數
- 在
Form1_MouseDown內檢查game.Winner。- 若為
PieceType.BLACK,就用MessageBox印出「黑色獲勝」。白色也用類似方式處理。
- 若為
- 在
Game.CheckWinner內增加兩個 for 迴圈檢查八個方向
練習
- 嘗試解決最後棋子下在五顆連線的中間,而不是邊邊時無法判斷勝利的 bug
- 嘗試實作重新啟動遊戲的功能
- 在有人快勝利時提出警告訊息
- 想出一個方法讓白色自動下子 (例如:最簡單的作法,隨便找個讓白色隨機亂下)
參考解答:https://github.com/slmt-tutorial-channel/c-sharp-solutions/blob/master/class_41_50/class46.md
留言區