Zgadnij liczbę

0

Cześć. Zaczynam coś się bawić Pythonem i podczas oglądania jednego filmiku gość robił zgadywankę liczb. Trochę ją rozszerzyłem, jednak że dopiero zaczynam chciałbym się dowiedzieć jak możnaby ją lepiej napisać. Chodzi o wyrobienie sobie jakiś nawyków, lub po prostu o rady.

import random
x = random.randint(1,10)
guess_count = 0
guess_limit = 2

while True:
    y = input(f'Wpisz liczbę od 1 do 10: ')
    try:
        y_int = int(y)
    except:
        print('Wpisałeś litere zamiast liczby')
        continue
    if x == y_int:
        kontynuacja = input(f'Zgadłeś. Chcesz zagrać pononwnie ? Wpisz T aby kontynuować, lub N, aby zakończyć grę: ')
        if kontynuacja.upper() == 'N':
            break
        else:
            guess_limit = 2
            while (kontynuacja.upper() != ('T' or 'N')):
                kontynuacja = input('Wpisz poprawną literę: ')
    else:
        guess_limit = guess_limit - 1
        print(f'nie zgadłeś. Pozostało Ci {guess_limit} prób')
        if guess_limit == 0:
            guess_limit = 2
            z = input(f'Przegrałeś. Chcesz spróbować ponownie ? Wpisz (T)ak lub (N)ie: ')
            if z.upper() == 'N':
                break
            else:
                guess_limit = 2
                while (z.upper() != ('T' or 'N')):
                    z = input('Wpisz poprawną literę: ')


0
  1. Używaj angielskich nazw zmiennych.
  2. Popraw nazewnictwo: x, y nic nie mówią.
  3. while (kontynuacja.upper() != ('T' or 'N')): na pewno nie działa tak jak tego chcesz
0

Jak poprawić 3 podpunkt ? Właściwe sprawdzałem kilka razy i było okay.

0

To efekt uboczny, że było ok :) ('N' masz obsłużone w ifie, więc w else możesz mieć wszystko oprócz N)

Poprawnie powinno być:

while kontynuacja.upper() not in ('T', 'N',):

0

not in ? Nie znam tego. Właściwie nie wystarczy

while kontynuacja.upper() != 'T':

i dlaczego tutaj u Ciebie

while kontynuacja.upper() not in ('T', 'N',):

jest przecinek po N ?

1

No i rada na przyszłość jest dosyć sucha (DRY = Don't Repeat Yourself). Staraj się zorganizować ten kod, aby nie powtarzały się bloki, takie jak:

            if z.upper() == 'N':
                break
            else:
                guess_limit = 2
                while (z.upper() != ('T' or 'N')):
                    z = input('Wpisz poprawną literę: ')

itp.

0

Ubierz to w klasę i metody. Wyeliminuj try.

0
  1. Nie używaj f przed stringiem jeśli nie jest to konieczne.
  2. guess_limit masz inicjowane w kilku miejscach. Żeby zrobić teraz inny limit musisz to zmienić w kilku miejscach zamiast jednym. To przez to, że nie korzystasz z guess_count
0

Zanim zabierzesz się za klasy, poćwicz dzielenie kodu na funkcję, które mają wykonywać jakieś konkretne zadanie. Czytając kod powinieneś z samych nazw wywoływanych funkcji być w stanie zrozumieć co się dzieję. W Pythonie jest również konwencja jak pisać skrypty podobna trochę do funkcji main w językach typu C:

def main():
  print("Hello World!")
  
if __name__== "__main__":
  main()

W twoim przykładzie ten kod może prezentować w taki sposób (daleki od ideału, ale wyraźnie lepszy):

import random

def ask_for_a_number(number_range):
    pass

def ask_if_play_again():
    pass

def play_guess_a_number(number_range, guess_limit):
    chosen_number = random.randint(*number_range)
    for attempts_remained in range(guess_limit, 0, -1): # pętla gry
        user_number = ask_for_a_number(number_range)
        if chosen_number == user_number:
            print('Zgadłeś')
            return
        else:
            print(f'Nie zgadłeś. Pozostało Ci {attempts_remained - 1} prób')
    print('Przegrałeś')

def main():
    number_range = (1, 10) # konfiguracja programu powinna znajdować się w jednym miejscu
    guess_limit = 2
    while True: # główna pętla programu
        play_guess_a_number(number_range, guess_limit)
        if ask_if_play_again() == 'N':
            break
  
if __name__== "__main__":
    main()

Tutaj wyodrębniłem funkcje związane z logiką gry. Dobrym pomysłem jest też napisanie osobnych funkcji do rzeczy typu: Zadaj pytanie tak/nie użytkownikowi, albo sparsuj podaną liczbę.

0

W życiu bym na to nie wpadł xd no dobra, pomysł z def jest fajny i przejrzysty, jednak co robi funckaj if name na samym końcu ?

1
Tomasz Przybyło napisał(a):

jednak co robi funckaj if name na samym końcu ?

Sprawdza, czy z tego skryptu została uruchomiona aplikacja. Gdy masz wiele modułów, każdy może mieć taki zapis, żeby np. pokazać przykładowe wywołanie funkcji, ale ten zapis będzie wykonywany tylko, jeśli ten skrypt jest skryptem wejściowym.

0

@Spine troche niezrozumiale napisał (ja zawsze miałem z tym problem). Chodzi o to, że jak uruchamiasz bezpośrednio ten plik to __name__ przyjmie wartość __main__ i za pomocą tego ifa odpalisz main(). Ale jeśli postanowisz sobie skorzystać z tego skryptu gdzieś inidzej i go sobie zimpottujesz za pomocą np. from twoj_skrypt import main to main nie odpali. Będziesz mógł wtedy sam zdecydować czy chcesz odpalić main czy nie

1 użytkowników online, w tym zalogowanych: 0, gości: 1