У цій вправі ми реалізуємо програму, яка визначає стан гри в хрестики-нулики. (Можливо, цю гру також знають як «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")
Тести перевіряють точний збіг повідомлення про помилку, тож уважно читаймо очікувані результати.
Зареєструйтеся на Exercism, щоб вивчати й опановувати Python, а також 17 концепцій146 вправ та справжнє наставництво від людей, і все це безкоштовно.