Треки
/
Python
Python
/
Вправи
/
Стан гри у хрестики-нулики
Стан гри у хрестики-нулики

Стан гри у хрестики-нулики

Легка

Вказівки

У цій вправі ми реалізуємо програму, яка визначає стан гри в хрестики-нулики. (Можливо, цю гру також знають як «noughts and crosses» або «Xs and Os».)

Гра відбувається на полі 3×3. Гравці по черзі ставлять X та O на поле. Гра закінчується, коли один гравець перемагає, поставивши три свої позначки в рядок, стовпець або по діагоналі поля, або коли все поле заповнене.

У цій вправі ми припускаємо, що першим ходить X.

Наше завдання - визначити, у якому стані перебуває задана гра.

Є 3 можливі стани гри:

  • Гра триває: ongoing.
  • Гра закінчилася нічиєю: draw.
  • Гра закінчилася перемогою: win.

Якщо задане поле неправильне, киньте відповідну помилку.

Поле вважається неправильним, якщо виконуються такі умови:

  • Задане поле не можна отримати, якщо ходи робити в правильному порядку (памʼятаємо, що першим ходить 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")

Тести перевіряють точний збіг повідомлення про помилку, тож уважно читаймо очікувані результати.

Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Python Exercism

Час розпочати Стан гри у хрестики-нулики?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Python, а також 17 концепцій146 вправ та справжнє наставництво від людей, і все це безкоштовно.