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

Модель игрового состояния

Tkinter показывает игру и передаёт ввод пользователя. Игровое СОСТОЯНИЕ — отдельная вещь.

Что вообще должна помнить программа?

state : GameStateboard = ['', '', '', '', '', '', '', '', '']current_player = 'X'game_over = Falsewinner = Nonewinning_line = Nonescore_x = 0score_o = 0draws = 0
Это данные — ни одной кнопки Tkinter здесь нет.
Виджеты — НЕ каноническое игровое состояние
Кнопки на экране ОТОБРАЖАЮТ состояние — они не являются им. Если наведение мыши временно рисует «X» на кнопке (раздел 17.23), это не значит, что ход сделан — настоящее состояние живёт отдельно от того, что нарисовано на экране прямо сейчас.

Прототип: state в глобальных переменных

Раздел 17.3 использовал ровно такой подход:

prototip_globals.py
tekuschij_igrok = "X"
polya = []
igra_okonchena = False
Прототип: сначала делаем состояние видимым
Глобальные переменные — приемлемый выбор для самого первого маленького прототипа: их легко читать и легко объяснить. Проблема появляется, когда проект растёт — глобальные переменные создают скрытые связи между функциями, которые неявно ожидают, что кто-то другой уже их изменил в правильном порядке. Это не значит «глобальные переменные — зло»: это значит, что у них есть компромисс между простотой и сопровождаемостью, который стоит замечать.

Путь этой главы

От глобальных переменных к GameState
V1 — глобальные (17.3)
3 отдельные переменные
просто, но растёт бесконтрольно
V2 — словарь
{'board': [...], ...}
один объект вместо трёх переменных
V3 — GameState (17.19)
@dataclass
типизировано, читаемо, тестируемо

Одно состояние — разные видимые моменты партии

Пустое поле и статус Ход игрока: X
Реальное состояние канонического приложения: начало раунда, ход X.
После первого хода X статус сменился на Ход игрока: O
Реальное состояние того же приложения после валидного хода X: модель переключила current_player на O.
Пять отметок X и O на поле, партия продолжается
Реальное промежуточное состояние канонического приложения: board хранит отметки, status_var показывает текущего игрока.
Практика: моделируем игровое состояние
Автоматическая проверка — строим и проверяем словарь-состояние без Tkinter
Открыть практику →