Jag har avslutat min Python Hangman-app med mycket grundläggande kod.

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å jag har några frågor om min kod:

  1. Jag har börjat luta några saker om klasser i Python och jag tänkte ”Hej, låt oss skriva den här Hangman med Classes ) ”Men efter lite kodning insåg jag att jag bara gjorde lektioner med 1 funk och istället för func() Jag kallade dem bara class.func() och det” s alla. Finns det någon god anledning till varför och hur jag ska använda klasser i ett Hangman-spel?

  2. Jag vet att koden är väldigt grundläggande och på min nivå borde jag inte tänka på effektiviteten av koden men ändå – Vilken del ska förbättras (inte själva koden men min logik där)? Jag vill skriva på ett ”ordentligt” sätt men min kod ser fortfarande superbas ut.

Svar

Spelbarhet

Jag körde ditt spel för att testa det först och märkte något udda när en bokstav är hittades två gånger i samma ord, till exempel ” glas ” här:

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

Jag är inte säker på om det är designat, men som spelare tycker jag att det är konstigt att det ”visas två gånger. Jag hittade var den härstammar i 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) 

Om du bara tar bort print(guess_word) två nivåer kommer du att undvika det beteendet eftersom det inte går i en loop:

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

Att skriva ut en rå matris som ["-", "-", "a", "s", "s"] är lite förvirrande, först visste jag inte vad det var för tills jag gissade en rätt och såg resultaten. Så låt oss göra det att skriva ut något mer vänligt:

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

Mycket bättre! Men det blir lite klumpigt att skriva allt det varje gång, så låt oss göra en verktygsfunktion för det och vi kan använda det för print(guess_word) i början av ett spel också.

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

Sedan bara print_word_to_guess(guess_word) närhelst vi behöver det. Det skulle också vara möjligt att göra ett valfritt annorlunda meddelande men som standard är Word to guess:, men jag lämnar det åt dig som en utmaning.


Spelet berättar aldrig någonting om hur många chanser jag har kvar, så jag gissade (bokstavligen) tills jag räknar ut det. Det är väldigt enkelt att göra en liten verktygsfunktion att göra:

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

Sedan några kodtillägg:

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

Och:

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 ordlista är ganska begränsad, för framtiden kan du kanske leta efter en textfil online med en hel massa ord och bara läsa en slumpmässig en från den, det skulle ge mer variation!


Kodförbättringar

main -funktion

Du kör hela ditt spel fungerar så snart du skapar dem. Det vore vettigare att placera dem i funktionen __main__ :

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

Förresten, newFunc() fungerar inte bra som ett namn, eftersom det inte säger något om vad det gör. Något som ask_user_to_play() skulle vara mycket bättre.


Konstantnamn

Python har inte riktiga konstanter, men ändå är det bra att nämna variabler som inte borde förändras (med förändring menar jag att de tilldelats olika värden) i ALL_CAPS_WITH_UNDERSCORES. En enkel sökning & ersätter i en IDE eller textredigerare gör tricket för att fixa hela 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 är en god vana att lägga till en docstring till alla funktioner, klasser och moduler för att beskriva för andra programmerare vad koden i fråga är för. Jag har gjort det för ovanstående 2-verktygsfunktion.


Skriv tips

Sedan Python 3 kan du nu använda skriv tips för dina funktions- och metodsignaturer och använd verktyg för statisk kodanalys. Detta gör koden också lättare att läsa för människor.


Förbättrad kod

Här är vad jag kom på, applicerade alla ovanstående och förbättrade avståndet ( din hade för många tomma rader överallt). Det finns sannolikt andra saker som kan förbättras, men det här bör vara en bra 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

  • Jag kan ’ inte berätta hur mycket jag uppskattar ditt svar! Jag kommer att titta igenom alla dina tips och utmana mig själv med dem, tack igen 🙂
  • Inga problem, jag hade kul att granska det också! Hoppas du publicerar lite mer i framtiden =)

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *