Глава 17 · Модель и правила

Правильный алгоритм хода

Один путь для любого способа сделать ход — проверка, ход, правила, смена игрока.

Валидный ход — что это?

attempt_move(index) — единый путь для мыши и клавиатуры (раздел 17.24). Разберём его в двух шагах: сначала фильтр валидности, потом — что происходит после того, как ход уже принят.

Диаграмма 1 — фильтр валидности хода

клик / клавиша наклетке indexигра окончена?ДАход игнорируетсяНЕТклетка занята?ДАход игнорируетсяНЕТВАЛИДНЫЙ ХОД
Оба «нет» должны выполниться, чтобы ход дошёл до диаграммы 2.
Невалидный ход НЕ переключает игрока
Это частая ошибка (Debug Lab 7, раздел 17.29): если клик проигнорирован — очередь хода должна остаться прежней. Переключение игрока происходит только ПОСЛЕ успешного хода.

Диаграмма 2 — что происходит после валидного хода

ВАЛИДНЫЙ ХОД (издиаграммы 1)board[index] =current_playerfind_winner(board)естьпобедитель?ДАTERMINAL: победа —render()НЕТall(board)заполнено?ДАTERMINAL: ничья —render()НЕТсменить игрокаrender()
Коммит в модель, проверка правил (раздел 17.17), и только потом — смена игрока.

Видимый результат валидного хода

Пустое поле перед первым ходом
Реальное окно канонического приложения до хода: модель board содержит девять пустых строк.
X занял центральную клетку, очередь перешла к O
То же реальное приложение после attempt_move(4): отметка записана в модель, затем render() обновил поле и статус.

Переключение игрока — три эквивалентных способа

smena_igroka_razvernuto.py
if current_player == "X":
    current_player = "O"
else:
    current_player = "X"
smena_igroka_kratko.py
current_player = "O" if current_player == "X" else "X"
Сначала читаемость, лаконичность потом
Обе версии делают одно и то же. Развёрнутая явно читается как «если/иначе» — с ней проще начинать. Короткая версия (условное выражение, глава 9; его часто называют тернарным оператором) — не «умнее», просто компактнее, когда вы уже уверенно её читаете.
Практика: логика одного хода
Автоматическая проверка — валидация хода и переключение игрока на чистых функциях
Открыть практику →