Rozdział 17 · Rundy i mecze
New Round vs New Match
Czy „Nowa Gra”
Dwa różne „resety”
| New Round (nowa runda) | New Match (nowy mecz) |
|---|---|
| Czyści pole bieżącego gracza, game_over, winner, winning_line | Robi dokładnie to samo, co New Round |
| ZAPISUJE wynik (score_x, score_o, draws) | I DODATKOWO zeruje wynik |
| Ogłoszony po każdym meczu | Wywoływane, gdy mecz jest całkowicie zakończony |
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 w pełni obejmuje New Round
Mylenie ich to prawdziwy błąd (Debug Lab 12, Rozdział 17.29)
Jeśli przycisk "Nowa gra" wywoła resetowanie wyniku, gracze tracą wynik turniejowy po każdej grze. Jeśli przycisk "Nowy mecz" nie zresetuje wyniku, stary wynik jest przeciągany do nowego turnieju. Nazwy funkcji powinny jednoznacznie odzwierciedlać tę różnicę.
Opcjonalna ekspansja: zapisz wynik meczu w JSON
Poniżej znajduje się tylko fragment — ciało funkcji save_scores() z
tic_tac_toe.py. Pełny plik już zawiera niezbędne
import json, from pathlib import Path
i definicja GameState – tutaj się nie powtarzają.
fragment save_scores() z tic_tac_toe.py
SCORES_PATH = Path("tic_tac_toe_scores.json") # w stosunku do bieżącego katalogu roboczego
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)
Opcjonalne w pierwszej wersji gry
Trwałe Relacje – Miłe rozszerzenie (Rozdział 15:
pathlib + JSON), ale NIE wymóg dla działającej gry. W tic_tac_toe.py jest to możliwe przez wyraźną flagę persist_scores=True — domyślnie wyłączone.Praktyka: New Round, New Match i zapisywanie konta
Automatyczna weryfikacja — semantyka resetu rundy/meczu i zachowanie JSON w wirtualnym systemie plików przeglądarki