Nowa gra i pierwsza pełna wersja
Finalny akcent pierwszego prototypu — reset gry bez ponownego uruchomienia programu. Ale rozdział dopiero się zaczyna.
Przycisk Nowej Gry
Aby nie uruchamiać programu od nowa po każdej grze, dodajemy przycisk resetu — przywraca wszystkie zmienne i wszystkie komórki do stanu początkowego:
def novaya_igra():
global tekuschij_igrok, igra_okonchena
tekuschij_igrok = "X"
igra_okonchena = False
for knopka in polya:
knopka.config(text="")
status_label.config(text=f"tura gracza: {tekuschij_igrok}")
Pełny program
Zbioremy wszystkie części w jednym programie – został on już w pełni przetestowany i jest dostępny osobno Umieść w tej książce:
projects/tkinter/tic-tac-toe/tic_tac_toe_basic.py
python tic_tac_toe_basic.py w terminalu (Rozdział 3) – albo przez Run w VS Code, albo PyCharm.tic_tac_toe.py — z osobnym modelem stanowym, oświetleniem linii zwycięzców, wynikami meczów i pełnymi testami.Dodaj etykiety wyniku zwycięstw X i O, zwiększaj odpowiedni licznik po każdej wygranej — licznik nie powinien zerować się przy przycisku „Nowa gra”.
Gdy zostanie znaleziony zwycięzca, zmień kolor tła trzech zwycięskich przycisków — trzeba zwrócić z proverit_pobedu() nie tylko zwycięzcę, ale także indeksy linii.
Streszczenie sekcji
Czego się nauczyliśmy
.bind()reaguje na dowolne zdarzenia — nie tylko kliknięcie przycisku.- Duże projekty są budowane w etapach: interfejs → stan → obsługa zdarzeń → reguły → resetują.
- Lambda z domyślnym ustawieniem (
lambda i=indeks: ...) „zamraża” - Lista krotek to wygodny sposób na opisanie kilku podobnych kontrol (osiem linii wypłat) bez powtarzania kodu.
- Pełnoprawna gra prawie zawsze ma sposób, aby rozpocząć od nowa, bez ponownego uruchamiania programu.
- To dopiero początek rozdziału, ponieważ przyjrzymy się bliżej systemowi wydarzeń Tkinter i odbudujemy grę na bardziej rozbudowanej architekturze.