Глава 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: ...) «замораживает» значение переменной цикла в момент создания.
  • Список кортежей — удобный способ описать несколько похожих проверок (восемь выигрышных линий) без повторения кода.
  • У полноценной игры почти всегда есть способ начать заново, не перезапуская программу.