在這道練習中,你要實作一個程式,判斷一場井字遊戲的狀態。 (你可能也聽過這個遊戲叫「noughts and crosses」或「Xs and Os」。)
遊戲在 3×3 的方格上進行。
玩家輪流在方格上放置X和O。
當某位玩家在方格的橫列、直行或對角線上連成 3 個記號而獲勝,或是整個方格被填滿時,遊戲就結束。
在這道練習中,我們假設由X先下。
你的任務是判斷給定的遊戲處於哪一種狀態。
遊戲狀態有 3 種可能:
如果給定的棋盤不合法,請拋出適當的錯誤。
棋盤符合下列任一條件時,就是不合法:
X先下)。 | |
X | |
___|___|___
| |
| X | O
___|___|___
| |
O | X |
| |
| |
X | O | X
___|___|___
| |
X | X | O
___|___|___
| |
O | X | O
| |
| |
X | X | X
___|___|___
| |
| O | O
___|___|___
| |
| |
| |
| |
O | O | X
___|___|___
| |
| |
___|___|___
| |
| |
| |
| |
X | X | X
___|___|___
| |
O | O | O
___|___|___
| |
| |
| |
有時候,我們需要引發例外。 這麼做時,你應該一律附上有意義的錯誤訊息,指出錯誤的來源是什麼。 這能讓你的程式碼更容易閱讀,對除錯也有很大的幫助。 如果你已經知道錯誤來源會是某一種類型,可以選擇引發其中一種內建錯誤類型,但還是要附上有意義的訊息。
一場有效的Tic Tac Toe對局會在某一位玩家獲勝時結束。
如果兩位玩家都處於獲勝狀態,這個練習會要你在解法中使用 raise 敘述「拋出」ValueError。
如果某位玩家被判定為連續下了兩手,或是在被指派下第二手時卻下了第一手,你的程式碼同樣應該拋出ValueError。
若要引發帶有訊息的ValueError,請把訊息寫成exception型別的引數:
# Example when player O goes before player X.
raise ValueError("Wrong turn order: O started")
# Example when player X goes twice.
raise ValueError("Wrong turn order: X went twice")
# Example when player X wins AND player O wins.
raise ValueError("Impossible board: game should have ended after the game was won")
測試會檢查錯誤訊息是否完全相符,所以請仔細閱讀預期的結果。