Ukończyłem moją aplikację Hangman w Pythonie z bardzo podstawowym kodem.

import random import sys # lets set some variables wordList = [ "lion", "umbrella", "window", "computer", "glass", "juice", "chair", "desktop", "laptop", "dog", "cat", "lemon", "cabel", "mirror", "hat" ] guess_word = [] secretWord = random.choice(wordList) # lets randomize single word from the list length_word = len(secretWord) alphabet = "abcdefghijklmnopqrstuvwxyz" letter_storage = [] def beginning(): print("Hello Mate!\n") while True: name = input("Please enter Your name\n").strip() if name == "": print("You can"t do that! No blank lines") else: break beginning() def newFunc(): print("Well, that"s perfect moment to play some Hangman!\n") while True: gameChoice = input("Would You?\n").upper() if gameChoice == "YES" or gameChoice == "Y": break elif gameChoice == "NO" or gameChoice == "N": sys.exit("That"s a shame! Have a nice day") else: print("Please Answer only Yes or No") continue newFunc() def change(): for character in secretWord: # printing blanks for each letter in secret word guess_word.append("-") print("Ok, so the word You need to guess has", length_word, "characters") print("Be aware that You can enter only 1 letter from a-z\n\n") print(guess_word) def guessing(): guess_taken = 1 while guess_taken < 10: guess = input("Pick a letter\n").lower() if not guess in alphabet: #checking input print("Enter a letter from a-z alphabet") elif guess in letter_storage: #checking if letter has been already used print("You have already guessed that letter!") else: letter_storage.append(guess) if guess in secretWord: print("You guessed correctly!") for x in range(0, length_word): #This Part I just don"t get it if secretWord[x] == guess: guess_word[x] = guess print(guess_word) if not "-" in guess_word: print("You won!") break else: print("The letter is not in the word. Try Again!") guess_taken += 1 if guess_taken == 10: print(" Sorry Mate, You lost :<! The secret word was", secretWord) change() guessing() print("Game Over!") 

Mam więc kilka pytań na temat mojego kodu:

  1. Zacząłem opierać się trochę o klasach w Pythonie i pomyślałem „Hej, napiszmy tego Wisielca z klasami” ) „Ale po pewnym kodowaniu, zorientowałem się, że utworzyłem klasy z 1 func i zamiast func() nazwałem je po prostu class.func() i to” to wszystko. Czy jest jakiś dobry powód, dla którego i jak powinienem używać klas w grze Wisielca?

  2. Wiem, że kod jest bardzo prosty i na moim poziomie nie powinienem mieć na uwadze skuteczności kod, ale nadal – Która część powinna zostać poprawiona (nie sam kod, ale moja logika)? Chcę pisać w „właściwy” sposób, ale mój kod nadal wygląda bardzo prosto.

Odpowiedź

Grywalność

Uruchomiłem Twoją grę, aby ją najpierw przetestować i zauważyłem coś dziwnego, gdy pojawia się litera znaleziono dwa razy w tym samym słowie, np. ” szkło ” tutaj:

Pick a letter A You guessed correctly! ["-", "-", "a", "-", "-"] Pick a letter s You guessed correctly! ["-", "-", "a", "s", "-"] ["-", "-", "a", "s", "s"] 

Nie jestem pewien, czy jest to zgodne z projektem, ale jako gracz uważam, że to dziwne „jest wyświetlany dwukrotnie. Udało mi się znaleźć jego początek w kodzie:

for x in range(0, length_word): #This Part I just don"t get it if secretWord[x] == guess: guess_word[x] = guess print(guess_word) 

Jeśli po prostu cofniesz wcięcie print(guess_word) przez na dwóch poziomach, unikniesz takiego zachowania, ponieważ nie będzie ono działać w pętli:

for i in range(0, length_word): if secretWord[i] == guess: guess_word[i] = guess print(guess_word) 

Drukowanie surowej tablicy, takiej jak ["-", "-", "a", "s", "s"], jest nieco zagmatwane, na początku nie wiedziałem, co to jest dopóki nie zgadłem jednego i nie zobaczyłem wyników. Dlatego wypiszmy coś bardziej przyjaznego:

print("Word to guess: {0}".format(" ".join(guess_word))) 
Pick a letter o You guessed correctly! Word to guess: - o - 

O wiele lepiej! Ale wpisywanie tego wszystkiego za każdym razem będzie trochę niezgrabne, więc zróbmy dla niego funkcję użytkową i możemy użyć jej do print(guess_word) również na początku gry.

def print_word_to_guess(letters): """Utility function to print the current word to guess""" print("Word to guess: {0}".format(" ".join(guess_word))) 

Następnie po prostu print_word_to_guess(guess_word) kiedykolwiek tego potrzebujemy. Możliwe byłoby również utworzenie opcjonalnej innej wiadomości, ale domyślnie Word to guess:, ale zostawię to dla ciebie jako wyzwanie.


Gra również nigdy nie mówi mi nic o tym, ile pozostało mi szans, więc nie mogę zgadywać (dosłownie), dopóki tego nie zrozumiem. Bardzo łatwo jest zrobić małą funkcję użytkową:

def print_guesses_taken(current, total): """Prints how many chances the player has used""" print("You are on guess {0}/{1}.".format(current, total)) 

Następnie kilka dodatków do kodu:

def guessing(): guess_taken = 1 MAX_GUESS = 10 print_guesses_taken(guess_taken, MAX_GUESS) while guess_taken < MAX_GUESS: 

Oraz:

for i in range(0, length_word): if secretWord[i] == guess: guess_word[i] = guess print_word_to_guess(guess_word) print_guesses_taken(guess_taken, MAX_GUESS) 

Twoja lista słów jest dość ograniczona, na przyszłość może rozważyć szukanie w Internecie pliku tekstowego z całą masą słów i po prostu przeczytaj jeden z nich, przyniesie większą różnorodność!


Ulepszenia kodu

main funkcja

Uruchamiasz całą swoją grę działa natychmiast po ich utworzeniu. Bardziej sensowne byłoby umieszczenie ich w funkcji __main__ :

if __name__ == "__main__": beginning() newFunc() change() guessing() 

Nawiasem mówiąc, newFunc() nie działa dobrze jako nazwa, ponieważ nie mówi nic o tym, co robi. Coś w rodzaju ask_user_to_play() byłoby znacznie lepsze.


Nazewnictwo stałych

Python nie ma prawdziwych stałych, niemniej jednak dobrym zwyczajem jest nazywanie zmienne, które nie powinny się zmieniać (przez zmianę mam na myśli przypisane do innych wartości) w ALL_CAPS_WITH_UNDERSCORES. Proste znalezienie & zamiany w IDE lub edytorze tekstu załatwia cały skrypt.

GUESS_WORD = [] SECRET_WORD = random.choice(wordList) # lets randomize single word from the list LENGTH_WORD = len(SECRET_WORD) ALPHABET = "abcdefghijklmnopqrstuvwxyz" letter_storage = [] 

Dokumentacja

Dobrym zwyczajem jest dodawanie łańcucha dokumentacji do wszystkich funkcji, klas i modułów, aby je opisać innym programistów, do czego służy dany kod. Zrobiłem to dla powyższej funkcji narzędzia 2.


Wskazówki dotyczące wpisywania

Od Pythona 3 możesz teraz używać wpisz wskazówki dla sygnatur funkcji i metod oraz użyj narzędzi do statycznej analizy kodu. To również sprawia, że kod jest łatwiejszy do odczytania dla ludzi.


Ulepszony kod

Oto, co wymyśliłem, stosując wszystkie powyższe i poprawiając odstępy ( Twój miał wszędzie za dużo pustych wierszy). Prawdopodobnie są inne rzeczy, które można by poprawić, ale to powinien być dobry początek.

import random, sys from typing import List # TODO try to load these from a text file WORD_LIST = [ "lion", "umbrella", "window", "computer", "glass", "juice", "chair", "desktop", "laptop", "dog", "cat", "lemon", "cabel", "mirror", "hat" ] GUESS_WORD = [] SECRET_WORD = random.choice(WORD_LIST) # lets randomize single word from the list LENGTH_WORD = len(SECRET_WORD) ALPHABET = "abcdefghijklmnopqrstuvwxyz" letter_storage = [] # Utility functions def print_word_to_guess(letters: List) -> None: """Utility function to print the current word to guess""" print("Word to guess: {0}".format(" ".join(letters))) def print_guesses_taken(current: int, total: int) -> None: """Prints how many chances the player has used""" print("You are on guess {0}/{1}.".format(current, total)) # Game functions def beginning() -> None: """Starts the game""" print("Hello Mate!\n") while True: name = input("Please enter Your name\n").strip() if name == "": print("You can"t do that! No blank lines") else: break def ask_user_to_play() -> None: """Ask user if they want to play""" print("Well, that"s perfect moment to play some Hangman!\n") while True: gameChoice = input("Would You?\n").upper() if gameChoice == "YES" or gameChoice == "Y": break elif gameChoice == "NO" or gameChoice == "N": sys.exit("That"s a shame! Have a nice day") else: print("Please Answer only Yes or No") continue def prepare_secret_word() -> None: """Prepare secret word and inform user of it""" for character in SECRET_WORD: # printing blanks for each letter in secret word GUESS_WORD.append("-") print("Ok, so the word You need to guess has", LENGTH_WORD, "characters") print("Be aware that You can enter only 1 letter from a-z\n\n") print_word_to_guess(GUESS_WORD) def guessing() -> None: """ Main game loop to have user guess letters and inform them of the results """ guess_taken = 1 MAX_GUESS = 10 print_guesses_taken(guess_taken, MAX_GUESS) while guess_taken < MAX_GUESS: guess = input("Pick a letter\n").lower() if not guess in ALPHABET: #checking input print("Enter a letter from a-z ALPHABET") elif guess in letter_storage: #checking if letter has been already used print("You have already guessed that letter!") else: letter_storage.append(guess) if guess in SECRET_WORD: print("You guessed correctly!") for i in range(0, LENGTH_WORD): if SECRET_WORD[i] == guess: GUESS_WORD[i] = guess print_word_to_guess(GUESS_WORD) print_guesses_taken(guess_taken, MAX_GUESS) if not "-" in GUESS_WORD: print("You won!") print("Game Over!") break else: print("The letter is not in the word. Try Again!") guess_taken += 1 print_guesses_taken(guess_taken, MAX_GUESS) if guess_taken == 10: print(" Sorry Mate, You lost :<! The secret word was {0}".format(SECRET_WORD)) if __name__ == "__main__": beginning() ask_user_to_play() prepare_secret_word() guessing() 

Komentarze

  • Nie mogę ' powiedzieć, jak bardzo doceniam Twoją odpowiedź! Przejrzę wszystkie twoje wskazówki i stawiam sobie za nie wyzwanie, jeszcze raz dziękuję 🙂
  • Nie ma sprawy, też mi się podobało! Mam nadzieję, że w przyszłości opublikujesz więcej =)

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *