Rozdział 17 · Zasady gry

Wygrać, zremisować i terminal state

Wypełnione pole nie zawsze kończy się remisem. Kolejność szachów jest częścią zasad gry.

is_draw() jest czystą funkcją

is_draw.py
def is_draw(board):
    winner, _ = find_winner(board)
    return winner is None and all(board)
„Po pełnym nastroju”
Samo wypełnione pole nie gwarantuje remisu – jeśli ostatni ruch wygrywa linię w tym samym czasie, jest to WYGRANA, a nie remis. Kolejność czeku decyduje o wszystkim.

Ostatni ruch: Wygrana pokonuje remis

O
O
X
X
X
O
X
X
O
ruch 9 jednocześnie wypełnia pole I wygrywa przekątną 2-4-6.
Obowiązkowe przewidywanie ćwiczenie
Przed przeczytaniem kodu – przewidywać: jeśli dziewiąty ruch wypełni OSTATNIĄ pustą komórkę I zbuduje linię, co pokaże program? "Draw" czy "Win X"? Poprawna odpowiedź to "Win", jeśli find_winner() jest sprawdzane WCZEŚNIEJ is_draw(). Właśnie dlatego is_draw najpierw woła w sobie find_winner i dopiero potem patrzy na wypełnienie.

Terminal state

WYGRANA i REMISA to prawdziwe ślepe zaułki: gdy tylko gra tam dochodzi, droga powrotna do „Gra trwa dalej”

Po ważnym ruchufind_winner(board)istniejezwycięzcą?TAKTERMINAL: ZWYCIĘSTWO X/ONIEall(board)pełna?TAKTERMINAL: REMISNIEgra trwa dalejzmienić zawodników
WYGRANA i REMISA to stany końcowe: gra się kończy i nie ma już ruchów.

Trzy terminale dają rzeczywiste okno

X wygrał górny wiersz
Rzeczywisty stan pełnej wersji wygląda następująco: X zwycięstwa, podświetlona linia zwycięska, pole jest zablokowane.
O wygrał środkową kolumnę
Prawdziwy stan pełnej wersji: ta sama logika find_winner() działa dla O.
Pełne pole bez linii zwycięskiej, status Losowanie
Rzeczywisty stan pełnej wersji: pole jest wypełnione, nie ma zwycięzcy, dodatkowe ruchy są blokowane.
Praktyka: Wygrana kontra remisy – procedura weryfikacji
Automatyczna weryfikacja — w tym test „ostatni ruch wygrywa, a nie kończy się remisem”
Otwórz praktykę →