Olen saanut Python Hangman -sovelluksen valmiiksi hyvin perustunnuksella.
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!")
Joten, minulla on pari kysymystä koodistani:
-
Olen alkanut jutella joitain juttuja Pythonin luokista ja ajattelin ”Hei, anna” kirjoittaa tämä hirsipuu kurssien kanssa ) ”Mutta jonkinlaisen koodauksen jälkeen tajusin, että tein vain luokkia yhdellä funktiolla ja
func()
sijaan kutsuin heitä vainclass.func()
ja tuolle” kaikki. Onko mitään hyvää syytä miksi ja miten minun pitäisi käyttää luokkia Hangman-pelissä? -
Tiedän, että koodi on hyvin yksinkertainen, ja minun tasolla ei pitäisi olla tarkalleen mielessäni koodi, mutta silti – mitä osaa olisi parannettava (ei itse koodia, vaan logiikkaa siellä)? Haluan kirjoittaa ”oikealla” tavalla, mutta koodini näyttää silti erittäin perusasetukselta.
Vastaus
Pelattavuus
Suoritin pelisi testataksesi sitä ensin ja huomasin jotain outoa, kun kirje on löytyi kahdesti samasta sanasta, kuten ” lasi ” täältä:
Pick a letter A You guessed correctly! ["-", "-", "a", "-", "-"] Pick a letter s You guessed correctly! ["-", "-", "a", "s", "-"] ["-", "-", "a", "s", "s"]
En ole varma, onko kyse suunnitelmasta, mutta pelaajina minusta on outoa, että se ”s näkyvät kahdesti. Löysin koodista, mistä se on peräisin:
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)
Jos vain purat print(guess_word)
kahdella tasolla, vältät sitä käyttäytymistä, koska se ei toimi silmukassa:
for i in range(0, length_word): if secretWord[i] == guess: guess_word[i] = guess print(guess_word)
Raaka taulukon kuten ["-", "-", "a", "s", "s"]
tulostaminen on hieman hämmentävää, en tiennyt aluksi sillä kunnes arvasin yhden oikeuden ja näin tulokset. Joten anna sen tulostaa jotain ystävällisempää:
print("Word to guess: {0}".format(" ".join(guess_word)))
Pick a letter o You guessed correctly! Word to guess: - o -
Paljon parempi! Mutta se on hieman hankala kirjoittaa kaikki, joka kerta, joten tehkäämme sille apufunktio ja voimme käyttää sitä print(guess_word)
myös pelin alussa.
def print_word_to_guess(letters): """Utility function to print the current word to guess""" print("Word to guess: {0}".format(" ".join(guess_word)))
Sitten vain print_word_to_guess(guess_word)
aina kun tarvitsemme sitä. Olisi myös mahdollista tehdä valinnainen erilainen viesti, mutta oletuksena Word to guess:
, mutta jätän sen sinulle haasteena.
Peli ei myöskään kerro minulle mitään siitä, kuinka monta mahdollisuutta minulla on jäljellä, joten jätin arvaamaan (kirjaimellisesti), kunnes selvitän sen. Se on erittäin helppo tehdä pieni apuohjelma.
def print_guesses_taken(current, total): """Prints how many chances the player has used""" print("You are on guess {0}/{1}.".format(current, total))
Sitten muutama koodilisäys:
def guessing(): guess_taken = 1 MAX_GUESS = 10 print_guesses_taken(guess_taken, MAX_GUESS) while guess_taken < MAX_GUESS:
Ja:
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)
Sanaluettelosi on melko rajallinen. Harkitse tulevaisuudessa kenties tekstitiedoston etsimistä verkosta, jossa on koko joukko sanoja, ja lue siitä vain satunnainen, että tuo enemmän vaihtelua!
Koodiparannukset
main
-toiminto
Suoritat koko pelisi toiminnot heti, kun teet ne. Olisi järkevämpää laittaa ne __main__
-funktion sisään:
if __name__ == "__main__": beginning() newFunc() change() guessing()
Muuten, newFunc()
ei toimi hyvin nimellä, koska se ei kerro mitään tekemistään. Jotain ask_user_to_play()
olisi paljon parempi.
Vakioiden nimeäminen
Pythonilla ei ole todellisia vakioita, mutta silti se on hyvä käytäntö nimetä muuttujat, joiden ei pitäisi muuttua (muutoksella tarkoitan uudelleen määritettyä eri arvoiksi) kategoriassa ALL_CAPS_WITH_UNDERSCORES. Yksinkertainen etsintä & korvaa IDE- tai tekstieditorissa korjata koko komentosarjan.
GUESS_WORD = [] SECRET_WORD = random.choice(wordList) # lets randomize single word from the list LENGTH_WORD = len(SECRET_WORD) ALPHABET = "abcdefghijklmnopqrstuvwxyz" letter_storage = []
Docstring
On hyvä tapa lisätä docstring kaikkiin toimintoihin, luokkiin ja moduuleihin kuvaamaan muille ohjelmoijille, mihin kyseinen koodi on tarkoitettu. Olen tehnyt sen yllä olevalle 2 apuohjelmatoiminnolle.
Kirjoita vihjeitä
Python 3: sta lähtien voit nyt käyttää -tyyppivihjeet funktion ja menetelmän allekirjoituksille ja käytä staattisia koodianalyysityökaluja. Tämä helpottaa myös koodin lukemista ihmisille.
Parannettu koodi
Tässä olen mitä keksin, soveltamalla kaikkia yllä olevia ja parantamalla välilyöntiä ( sinulla oli liikaa tyhjiä viivoja kaikkialla). On todennäköisesti muita asioita, joita voitaisiin parantaa, mutta tämän pitäisi olla hyvä alku.
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()
Kommentit
- En voi ’ kertoa, kuinka arvostan vastaustasi! Tarkastelen kaikkia vinkkejäsi ja haastan itseni heidän kanssaan, kiitos vielä kerran 🙂
- Ei hätää, minulla oli myös hauskaa tarkistaa se! Toivottavasti lähetät lisää tulevaisuudessa =)