この演習では、三目並べの状態を判定するプログラムを実装します。 (このゲームは「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を「投げる」ことが求められます。
また、あるプレイヤーが2手続けて打ったと判定された場合や、後手に割り当てられているのに最初の手を打ったと判定された場合にも、コードは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")
テストではエラーメッセージが完全に一致するかどうかが確認されるので、期待される結果をよく読んでください。