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”
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”
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:
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:
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
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.
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.
Issue „Add rock paper scissors game” feat/rock-paper-scissors
, testy dla wszystkich dziewięciu kombinacji ruchów, Pull Request.