Am terminat aplicația mea Python Hangman cu un cod foarte de bază.
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!")
Așadar, am câteva întrebări despre codul meu:
-
Am început să aplec câteva lucruri despre cursuri în Python și m-am gândit că „Hei, hai să scriem acest Hangman cu clase ) „Dar după câteva coduri mi-am dat seama, tocmai am făcut clase cu 1 func și în loc de
func()
le-am numit doarclass.func()
și că” toate sunt. Există vreun motiv întemeiat de ce și cum ar trebui să folosesc cursurile într-un joc Hangman? -
Știu că codul este foarte de bază și la nivelul meu nu ar trebui să mă gândesc exact la eficacitatea codul, dar totuși – Care parte ar trebui îmbunătățită (nu codul în sine, ci logica mea de acolo)? Vreau să scriu într-un mod „corect”, dar codul meu arată în continuare foarte simplu.
Răspuns
Redare
Am rulat jocul pentru a-l testa mai întâi și am observat ceva ciudat atunci când o literă este găsit de două ori în același cuvânt, cum ar fi ” sticlă ” aici:
Pick a letter A You guessed correctly! ["-", "-", "a", "-", "-"] Pick a letter s You guessed correctly! ["-", "-", "a", "s", "-"] ["-", "-", "a", "s", "s"]
Nu sunt sigur dacă acest lucru este în funcție de design, dar ca jucător mi se pare ciudat că „s-a afișat de două ori. Am găsit de unde provine codul:
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)
Dacă tocmai unindent print(guess_word)
de două niveluri, veți evita acel comportament deoarece nu va rula în buclă:
for i in range(0, length_word): if secretWord[i] == guess: guess_word[i] = guess print(guess_word)
Imprimarea unei matrice brute precum ["-", "-", "a", "s", "s"]
este puțin confuză, la început nu știam ce este pentru că până am ghicit un drept și am văzut rezultatele. Deci, să-l facem să imprime ceva mai prietenos:
print("Word to guess: {0}".format(" ".join(guess_word)))
Pick a letter o You guessed correctly! Word to guess: - o -
Mult mai bine! Dar va deveni puțin ciudat să tastați tot de fiecare dată, așa că să facem o funcție de utilitate pentru aceasta și o putem folosi pentru print(guess_word)
și la începutul jocului.
def print_word_to_guess(letters): """Utility function to print the current word to guess""" print("Word to guess: {0}".format(" ".join(guess_word)))
Apoi, doar print_word_to_guess(guess_word)
ori de câte ori avem nevoie. De asemenea, ar fi posibil să creați un mesaj diferit opțional, dar implicit la Word to guess:
, dar vă voi lăsa asta ca o provocare.
De asemenea, jocul nu îmi spune nimic despre câte șanse mai am, așa că rămân să ghicesc (la propriu) până când îmi dau seama. Este foarte ușor să faci o mică funcție de utilitate:
def print_guesses_taken(current, total): """Prints how many chances the player has used""" print("You are on guess {0}/{1}.".format(current, total))
Apoi câteva adăugiri de cod:
def guessing(): guess_taken = 1 MAX_GUESS = 10 print_guesses_taken(guess_taken, MAX_GUESS) while guess_taken < MAX_GUESS:
Și:
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)
Lista dvs. de cuvinte este destul de limitată, pentru viitor, luați în considerare poate căutați un fișier text online cu o grămadă de cuvinte și citiți doar unul aleatoriu din acesta, că ar aduce mai multă varietate!
Îmbunătățiri ale codului
main
funcție
Vă rulați tot jocul funcții imediat ce le creați. Ar avea mai mult sens să le introduceți în funcția __main__
:
if __name__ == "__main__": beginning() newFunc() change() guessing()
Apropo, newFunc()
nu funcționează bine ca nume, deoarece nu spune nimic despre ceea ce face. Ceva ca ask_user_to_play()
ar fi mult mai bine.
Denumirea constantelor
Python nu are constante reale, dar cu toate acestea, este o bună practică să numim variabile care nu ar trebui să se schimbe (prin schimbare mă refer reasignate la valori diferite) în ALL_CAPS_WITH_UNDERSCORES. O simplă găsire & înlocuită într-un IDE sau editor de text face truc pentru a remedia întregul script.
GUESS_WORD = [] SECRET_WORD = random.choice(wordList) # lets randomize single word from the list LENGTH_WORD = len(SECRET_WORD) ALPHABET = "abcdefghijklmnopqrstuvwxyz" letter_storage = []
Docstring
Este „un obicei bun să adăugați un docstring la toate funcțiile, clasele și modulele, pentru a le descrie pentru alte programatorilor la ce servește codul în cauză. Am făcut asta pentru funcția 2 de utilitate de mai sus.
Sfaturi de tip
De la Python 3, puteți utiliza acum sugestii de tip pentru semnăturile funcției și metodelor dvs. și utilizați instrumente de analiză statică a codului. Acest lucru face, de asemenea, codul mai ușor de citit pentru oameni.
Cod îmbunătățit
Iată ce am venit, aplicând toate cele de mai sus și îmbunătățind spațiul ( a ta avea prea multe linii goale peste tot). Există probabil alte lucruri care ar putea fi îmbunătățite, dar acesta ar trebui să fie un început bun.
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()
Comentarii
- Nu pot ‘ să vă spun cât de mult apreciez răspunsul dvs.! Voi analiza toate sfaturile tale și mă voi provoca cu ele, mulțumesc din nou 🙂
- Nicio problemă, m-am distrat și eu să o revizuiesc! Sper să mai postezi câteva în viitor =)