Zgadnij liczbę - jak to ugryźć?

Zgadnij liczbę - jak to ugryźć?
Photo by Nick Hillier / Unsplash

Zadaniem na naszych szóstych zajęciach było napisanie gry "Zgadnij liczbę".
Aplikacja ta polega na próbie zgadnięcia liczby wylosowanej z zakresu 1-100 w określonej liczbie podejść. Po każdej próbie gra podpowiada nam czy poszukiwana liczba jest większa od tej która wprowadziliśmy, czy mniejsza.

To dobre ćwiczenie do wykorzystania pętli. Jednak próba rozwiązania tego za pierwszym razem może nieco przerażać. Wpatrujemy się w pusty ekran... a kod nijak się nie pojawia.

Opiszę więc pokrótce mój sposób myślenia w takiej sytuacji. Najważniejsze to zacząć pisać - jak pojawią się pierwsze linijki kodu to mamy już na czym pracować i kombinować nad rozwiązaniem.

Od czego więc zacząć? Najlepiej od wpisania rzeczy, które nie wymagają wymyślania czegokolwiek, od rzeczy, które wiemy.

W tym przypadku wiemy kilka rzeczy:

  1. Będziemy losowali jakąś liczbę. Co oznacza, że raczej będziemy chcieli skorzystać z biblioteki random.
  2. Tę wylosowaną liczbę trzeba jakoś przechować, tak abyśmy mieli co porównywać z tym co będzie wprowadzał gracz. Musimy więc dla niej stworzyć zmienną.
  3. Chcemy jakoś śledzić czy gracz wygrał. Można do tego użyć zmiennej, którą będziemy modyfikować w przypadku wygranej. Ponieważ interesują nas tylko dwa stany (wygrana / przegrana) to najprościej będzie użyć zmiennej przyjmującej wartości True / False (z domyślną wartością False - bo jeszcze nie wygrano, True będzie ustawione tylko gdy gracz zgadnie liczbę).

To daje mi pierwsze linijki kodu:

import random

LOSOWA_LICZBA = random.randint(1, 100)
wygrana = False

Następnie odrzucam wszystkie "komplikacje" związane z grą - na razie nie zajmuję się tym, że gracz ma mieć kilka podejść i tym, że ma dostawać wskazówki. Na razie sprawdzam czy zgadł liczbę w jednym podejściu. Muszę więc jakoś umożliwić wprowadzenie danych i wyświetlę odpowiednie komunikaty dla gracza.

Jeśli to co wprowadzi gracz jest identyczne z losową liczbą zmienię wartość zmiennej czy_wygrano na True.

Na końcu programu sprawdzę wartość tej zmiennej i wyświetlę odpowiednie komunikaty. Takie podejście separuje mi kod samego "grania" od wyświetlania komunikatów i powoduje, że raczej nie zapomnę o tej kwestii :D .

import random

losowa_liczba = random.randint(1, 100)
czy_wygrano = False

print("Witaj w grze zgadnij liczbe.")

liczba_gracza = int(input("Wprowadz liczbe od 1 do  100:"))

if losowa_liczba == liczba_gracza:
    czy_wygrano = True

if czy_wygrano == True:
    print("Brawo! To ta liczba")
else:
    print("Nie udało się tym razem.")

W następnym kroku najprościej będzie dodać kod odpowiedzialny za podpowiedzi (informacja czy poszukiwana liczba jest większ, czy mniejsza).

import random

losowa_liczba = random.randint(1, 100)
czy_wygrano = False

print("Witaj w grze zgadnij liczbe.")

liczba_gracza = int(input("Wprowadz liczbe od 1 do  100:"))

if losowa_liczba == liczba_gracza:
    czy_wygrano = True
elif losowa_liczba > liczba_gracza:
    print("Poszukiwana liczba jest większa")
else:
    print("Poszukiwana liczba jest mniejsza.")

if czy_wygrano == True:
    print("Brawo! To ta liczba")
else:
    print("Nie udało się tym razem.")

Super! Mamy już działającą logikę gry. Teraz pozostało dać graczowi kilka podejść do zgadnięcia. Przyjmijmy na razie, że będzie 10 prób. Ponieważ z góry wiemy ile ich będzie sensowne jest zastosowanie pętli for.

import random

losowa_liczba = random.randint(1, 100)
czy_wygrano = False

print("Witaj w grze zgadnij liczbe.")

for _ in range(10):
    liczba_gracza = int(input("Wprowadz liczbe od 1 do  100:"))

    if losowa_liczba == liczba_gracza:
        czy_wygrano = True
    elif losowa_liczba > liczba_gracza:
        print("Poszukiwana liczba jest większa")
    else:
        print("Poszukiwana liczba jest mniejsza.")

if czy_wygrano == True:
    print("Brawo! To ta liczba")
else:
    print("Nie udało się tym razem.")

Powyższy kod ma jednak pewien problem - pętla wykonuje się dalej, nawet wtedy gdy gracz zgadnie poszukiwaną liczbę. Należy więc przerwać działanie pętli w takiej sytuacji wykorzystując break.

import random

losowa_liczba = random.randint(1, 100)
czy_wygrano = False

print("Witaj w grze zgadnij liczbe.")

for _ in range(10):
    liczba_gracza = int(input("Wprowadz liczbe od 1 do  100:"))

    if losowa_liczba == liczba_gracza:
        czy_wygrano = True
        break
    elif losowa_liczba > liczba_gracza:
        print("Poszukiwana liczba jest większa")
    else:
        print("Poszukiwana liczba jest mniejsza.")

if czy_wygrano == True:
    print("Brawo! To ta liczba")
else:
    print("Nie udało się tym razem.")

Jedyne co pozostało to wprowadzenie bloku kodu, który umożliwi graczowi wprowadzenie poziomu trudności. Jeśli gracz wpisze 1 to będzie oznaczało poziom łatwy (10 podejść), 2 poziom trudny (3 podejścia). Co oznacza, że musimy wprowadzić dodatkową zmienną przechowującą wybór gracza i kolejną do której przypisywana będzie odpowiednia ilość prób (ile razy będzie "kręcona" pętla z grą).

Na tym etapie warto też zweryfikować czy to co wprowadził gracz przy wyborze poziomu trudności ma sens. Tak długo jak nie wprowadzi czegoś sensownego (czyli 1 lub 2) będzie proszony o powtórzenie wyboru. Co od razu sugeruje pętlę while.

Gotowy kod może wyglądać tak:

import random

losowa_liczba = random.randint(1, 100)
czy_wygrano = False

print("Witaj w grze zgadnij liczbe.")

while True:
    print("Wpisz poziom trudności:")
    poziom_trudnosci = int(input("1 dla łatwego, 2 dla trudnego: "))

    if poziom_trudnosci == 1:
        proby = 10
        break
    elif poziom_trudnosci == 2:
        proby = 3
        break
    else:
        print("Błędnie wprowadzony poziom trudnosci - spróbuj jeszcze raz.")

for _ in range(proby):
    liczba_gracza = int(input("Wprowadz liczbe od 1 do 100: "))

    if losowa_liczba == liczba_gracza:
        czy_wygrano = True
        break
    elif losowa_liczba > liczba_gracza:
        print("Poszukiwana liczba jest większa")
    else:
        print("Poszukiwana liczba jest mniejsza.")

if czy_wygrano == True:
    print("Brawo! To ta liczba")
else:
    print("Nie udało się tym razem.")

Oczywiście można to rozwiązać w inny sposób - grunt żeby działało i było czytelne.

Tu zależało mi na tym aby pokazać Wam jak zacząć i jak podzielić większe zadanie na kilka mniejszych, łatwiejszych do opanowania.