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