Глава 17 · Проект: «Крестики-нолики»
Кнопка новой игры
Финальный штрих — сброс игры без перезапуска программы — и полная работающая программа целиком.
Кнопка новой игры
Чтобы не перезапускать программу заново после каждой партии, добавим кнопку сброса — она возвращает все переменные и все клетки в начальное состояние:
novaya_igra.py
def novaya_igra():
global tekuschij_igrok, igra_okonchena
tekuschij_igrok = "X"
igra_okonchena = False
for knopka in polya:
knopka.config(text="")
Полная программа
Соберём все части в одну программу — она уже полностью проверена и доступна отдельным файлом в этой книге:
📄 projects/tkinter/tic-tac-toe/tic_tac_toe.py
Запустите игру у себя
Скачайте файл и запустите его через
python tic_tac_toe.py в терминале (глава 3) — либо кнопкой Run в VS Code или PyCharm.★★ Самостоятельная задача
Счёт побед
Добавьте метки счёта побед X и O, увеличивайте нужный счётчик при каждой победе — счётчик не должен обнуляться кнопкой «Новая игра».
★★★ Задача повышенной сложности
Подсветка выигрышной линии
Когда находится победитель, измените цвет фона трёх выигрышных кнопок — потребуется вернуть из proverit_pobedu() не только победителя, но и индексы линии.
Итоги
Что мы узнали в этой главе
.bind()реагирует на любые события — не только клик по кнопке.- Большие проекты строят по шагам: состояние → интерфейс → обработка событий → правила → сброс.
- Лямбда с параметром по умолчанию (
lambda i=indeks: ...) «замораживает» значение переменной цикла в момент создания. - Список кортежей — удобный способ описать несколько похожих проверок (восемь выигрышных линий) без повторения кода.
- У полноценной игры почти всегда есть способ начать заново, не перезапуская программу.