在这个练习中,你要实现一个程序,判断一局井字棋的状态。 (这个游戏也叫“noughts and crosses”或“Xs and Os”。)
游戏在一个 3×3 的网格上进行。
玩家轮流在网格上放置X和O。
当一方玩家在网格的一行、一列或一条对角线上连放三个标记而获胜时,或者整个网格被填满时,游戏结束。
在这个练习中,我们假设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")
测试会精确比对错误消息,所以请仔细阅读预期结果。