Глава 17 · Раунды и матчи

New Round vs New Match

«Новая игра» — это раунд или матч целиком? В этой игре — принципиально разные вещи.

Два разных «сброса» — и это не одно и то же

New Round (новый раунд)New Match (новый матч)
Очищает поле, текущего игрока, game_over, winner, winning_lineДелает всё то же, что New Round
СОХРАНЯЕТ счёт (score_x, score_o, draws)И ДОПОЛНИТЕЛЬНО обнуляет счёт
Вызывается после каждой партииВызывается, когда матч целиком завершён
new_round_vs_new_match.py
def new_round(self):
    self.state.board = [""] * 9
    self.state.current_player = "X"
    self.state.game_over = False
    self.state.winner = None
    self.state.winning_line = None
    self.render()

def new_match(self):
    self.state.score_x = 0
    self.state.score_o = 0
    self.state.draws = 0
    self.new_round()   # New Match полностью включает в себя New Round
Перепутать их — реальная ошибка (Debug Lab 12, раздел 17.29)
Если кнопка «Новая игра» вызывает то, что обнуляет счёт — игроки теряют турнирный счёт после каждой партии. Если кнопка «Новый матч» не обнуляет счёт — старый счёт тянется в новый турнир. Названия функций должны отражать это различие однозначно.
После New Round поле пустое, а счёт X:1 сохранён
Реальное окно полной версии после new_round(): состояние раунда сброшено, счёт матча сохранён. Код выше — фрагмент методов полного приложения.
После New Match поле пустое и весь счёт равен нулю
Реальное окно полной версии после new_match(): сброшены и раунд, и счёт X/O/ничьих. Код выше — фрагмент методов полного приложения.

Необязательное расширение: сохраняем счёт матча в JSON

Ниже показан только фрагмент — тело функции save_scores() из tic_tac_toe.py. Полный файл уже содержит нужные import json, from pathlib import Path и определение GameState — здесь они не повторяются.

фрагмент save_scores() из tic_tac_toe.py
SCORES_PATH = Path("tic_tac_toe_scores.json")   # относительно текущей рабочей директории

def save_scores(state):
    with SCORES_PATH.open("w", encoding="utf-8") as f:
        json.dump({"x": state.score_x, "o": state.score_o, "draws": state.draws}, f,
                  ensure_ascii=False, indent=2)
Необязательно для первой играющей версии
Персистентный счёт — приятное расширение (глава 15: pathlib + JSON), но НЕ требование для рабочей игры. В tic_tac_toe.py это включается явным флагом persist_scores=True — по умолчанию выключено.
Практика: New Round, New Match и сохранение счёта
Автоматическая проверка — семантика сброса раунда/матча и сохранение JSON на виртуальной файловой системе браузера
Открыть практику →