Rozdział 23 · Aneks

Projekt domowy C: „Kamień, papier, nożyce”

Jeden słownik wyznacza zwycięzcę rundy, a mecz kończy się po trzech zwycięstwach jednej ze stron.

Wyłonienie zwycięzcy rundy to jedna część logiki gry, obok losowej komputerowy ruch i liczenie punktów. Zasada „kto kogo pokonuje”

rps.py
POBEZHDAET = {
    „kamień”: „nożyczki”,
    „nożyczki”: „papier”,
    „papier”: „kamień”,
}

def opredelit_pobeditelya(hod_igroka: str, hod_kompyutera: str) -> str:
    if hod_igroka == hod_kompyutera:
        return „draw”
    if POBEZHDAET[hod_igroka] == hod_kompyutera:
        return „gracz”
    return „komputer”
Słownik zamiast dziewięciu warunków
Możliwe byłoby napisanie dziewięciu gałęzi if hod_igroka == "камень" and hod_kompyutera == "ножницы": .... Słownik POBEZHDAET robi to samo w trzech łańcuch znaków i czyta się jak zwykłe zdanie: „kamień pokonuje nożyczki”.

Computer Move z możliwością sprawdzania losowości

Jak w generatorze historii, ruch komputera przyjmuje opcjonalny generator liczb losowych. Test może sprawdzić konkretny, powtarzalny ruch:

rps.py
def hod_kompyutera(rng: random.Random | None = None) -> str:
    generator = rng if rng is not None else random
    return generator.choice(VARIANTY)

Mecz do trzech zwycięstw

Gra teraz kończy się nie tylko słowem „wyjście”, ale również wtedy, gdy jedna ze stron zdobywa trzy zwycięstwa. To jasny warunek zakończenia zamiast nieskończonego cyklu:

rps.py
POBED_DLYA_POBEDY_V_MATCHE = 3

while schet_igroka < POBED_DLYA_POBEDY_V_MATCHE and schet_kompyutera < POBED_DLYA_POBEDY_V_MATCHE:
    # ... runda gry...

Pełny kod: projects/console/rock-paper-scissors/rps.py

Quest

Challenge
Dodajemy jaszczurkę i Spocka

Rozszerzyć wymagania do pięciu ruchów. Teraz jeden ruch bije dwa, więc dict[str str] już nie wyraża reguły. Przełącz się na dict[str, set[str]], sprawdź opponent in beats[player] i dodaj testy dla wszystkich 25 par.

Nowy model reguł
POBEZHDAET: dict[str, set[str]] = {
    „kamień”: {„nożyczki”, „jaszczurka”},
    „papier”: {„kamień”, „Spok”},
    # pozostałe trzy ruchy
}

if hod_kompyutera in POBEZHDAET[hod_igroka]:
    return „gracz”

To zwykły łańcuch inżynierski: zmieniło się wymaganie → stara model danych już nie reprezentuje relacji → zmienia się typ wartości słownika → rozszerza się zestaw testów.

GitHubPraktyka GitHub

Issue „Add rock paper scissors game” feat/rock-paper-scissors , testy dla wszystkich dziewięciu kombinacji ruchów, Pull Request.

Praktyka: Wszystkie 9 kombinacji i symulacja rund
Interaktywny Laptop w przeglądarce: Python 3.14 przez Pyodide, bez instalacji
Otwórz praktykę →