Jeg har fullført Python Hangman-appen min med veldig grunnleggende kode.
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!")
Så, jeg har noen spørsmål om koden min:
-
Jeg har begynt å lene noen ting om klasser i Python, og jeg tenkte «Hei, la oss skrive denne Hangman med Classes ) «Men etter litt koding skjønte jeg at jeg bare laget klasser med 1 func og i stedet for
func()
kalte jeg dem bareclass.func()
og det» s alle. Er det noen god grunn til at og hvordan jeg skal bruke klasser i et Hangman-spill? -
Jeg vet at koden er veldig grunnleggende, og på mitt nivå bør jeg ikke nøye meg med effektiviteten til koden, men likevel – Hvilken del bør forbedres (ikke selve koden, men logikken min der)? Jeg vil skrive på en «riktig» måte, men koden min ser fortsatt veldig grunnleggende ut.
Svar
Spillbarhet
Jeg kjørte spillet ditt for å teste det først, og la merke til noe rart når et bokstav er funnet to ganger i samme ord, for eksempel » glass » her:
Pick a letter A You guessed correctly! ["-", "-", "a", "-", "-"] Pick a letter s You guessed correctly! ["-", "-", "a", "s", "-"] ["-", "-", "a", "s", "s"]
Jeg er ikke sikker på om det er designet, men som spiller synes jeg det er rart at det «vises to ganger. Jeg fant hvor den stammer fra koden:
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)
Hvis du bare fjerner print(guess_word)
av to nivåer, vil du unngå atferden siden den ikke kjører i en løkke:
for i in range(0, length_word): if secretWord[i] == guess: guess_word[i] = guess print(guess_word)
Å skrive ut en rå matrise som ["-", "-", "a", "s", "s"]
er litt forvirrende, først visste jeg ikke hva det var for til jeg gjettet en rett og så resultatene. Så la oss få det til å skrive ut noe mer vennlig:
print("Word to guess: {0}".format(" ".join(guess_word)))
Pick a letter o You guessed correctly! Word to guess: - o -
Mye bedre! Men det blir litt klumpete å skrive alt det hver gang, så la oss lage en verktøyfunksjon for det, og vi kan bruke det til print(guess_word)
i begynnelsen av et spill også.
def print_word_to_guess(letters): """Utility function to print the current word to guess""" print("Word to guess: {0}".format(" ".join(guess_word)))
Så bare print_word_to_guess(guess_word)
når vi trenger det. Det ville også være mulig å lage en valgfri annen melding, men standard er Word to guess:
, men jeg lar den være som en utfordring.
Spillet forteller meg aldri noe om hvor mange sjanser jeg har igjen, så jeg fortsetter å gjette (bokstavelig talt) til jeg finner ut av det. Det er veldig enkelt å lage en liten verktøyfunksjon å gjøre:
def print_guesses_taken(current, total): """Prints how many chances the player has used""" print("You are on guess {0}/{1}.".format(current, total))
Så noen få kodetillegg:
def guessing(): guess_taken = 1 MAX_GUESS = 10 print_guesses_taken(guess_taken, MAX_GUESS) while guess_taken < MAX_GUESS:
Og:
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)
Din ordliste er ganske begrenset, for fremtidig bør du kanskje se etter en tekstfil online med en hel haug med ord og bare lese en tilfeldig en fra den, det ville gi mer variasjon!
Kodeforbedringer
main
-funksjon
Du kjører hele spillet ditt fungerer så snart du lager dem. Det ville være mer fornuftig å plassere dem i __main__
-funksjonen:
if __name__ == "__main__": beginning() newFunc() change() guessing()
newFunc()
fungerer forresten ikke godt som et navn, da det ikke sier noe om hva det gjør. Noe som ask_user_to_play()
ville vært mye bedre.
Navn på konstanter
Python har ikke virkelige konstanter, men likevel er det god praksis å nevne variabler som ikke skulle endres (med endring mener jeg tilordnet andre verdier) i ALL_CAPS_WITH_UNDERSCORES. Et enkelt funn & erstattet i en IDE eller teksteditor gjør susen for å fikse hele skriptet.
GUESS_WORD = [] SECRET_WORD = random.choice(wordList) # lets randomize single word from the list LENGTH_WORD = len(SECRET_WORD) ALPHABET = "abcdefghijklmnopqrstuvwxyz" letter_storage = []
Docstring
Det er en god vane å legge til en docstring til alle funksjoner, klasser og moduler, for å beskrive for andre programmerere hva koden det er snakk om til. Jeg har gjort det for ovennevnte funksjon 2.
Skriv tips
Siden Python 3 kan du nå bruke skriv tips for funksjons- og metodesignaturer, og bruk verktøy for statisk kodeanalyse. Dette gjør koden også lettere å lese for mennesker.
Forbedret kode
Dette er hva jeg kom på, brukte alt ovenfor og forbedret avstanden ( din hadde for mange blanke linjer overalt). Det er sannsynligvis andre ting som kan forbedres, men dette bør være en god start.
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()
Kommentarer
- Jeg kan ‘ ikke fortelle hvor mye jeg setter pris på svaret ditt! Jeg vil se gjennom alle tipsene dine og utfordre meg selv med dem, takk igjen 🙂
- Ikke noe problem, jeg hadde det gøy å gjennomgå det også! Håper du legger ut noen flere i fremtiden =)