Befejeztem a Python Hangman alkalmazást nagyon alapkóddal.
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!")
Tehát, van néhány kérdésem a kódommal kapcsolatban:
-
Néhány dolgot elkezdtem a Python osztályaiban találni, és arra gondoltam, hogy “Hé, írjam” ezt az akasztót az Osztályokkal ) “De némi kódolás után rájöttem, hogy csak 1 func-tal csináltam osztályokat, és a
func()
helyett csakclass.func()
és” s minden. Van valami jó oka annak, hogy miért és hogyan használjam az órákat egy Hóhér játékban? -
Tudom, hogy a kód nagyon egyszerű, és az én szintemen nem kellene pontosan szem előtt tartanom a hatékonyságot. a kód, de mégis – Melyik részt kellene fejleszteni (nem magát a kódot, hanem az ottani logikámat)? Szeretnék “megfelelő” módon írni, de a kódom mégis szuper alaposnak tűnik.
Válasz
Lejátszhatóság
A játékod futtatásával először teszteltem, és valami különösre figyeltem fel, amikor egy levél kétszer megtalálható ugyanabban a szóban, például ” glass ” itt:
Pick a letter A You guessed correctly! ["-", "-", "a", "-", "-"] Pick a letter s You guessed correctly! ["-", "-", "a", "s", "-"] ["-", "-", "a", "s", "s"]
Nem vagyok biztos benne, hogy ez terv szerint van-e, de játékosként furcsállom, hogy ez “s kétszer jelennek meg. A kódban találtam, honnan származik:
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)
Ha csak behúzza a print(guess_word)
két szinten elkerülheti ezt a viselkedést, mivel nem fog ciklusban futni:
for i in range(0, length_word): if secretWord[i] == guess: guess_word[i] = guess print(guess_word)
Egy nyers tömb kinyomtatása, például ["-", "-", "a", "s", "s"]
, kissé zavaró, eleinte nem tudtam, mi ez mert amíg kitaláltam az egyik jogot és megláttam az eredményeket. Tehát tegyük “barátságosabbá”:
print("Word to guess: {0}".format(" ".join(guess_word)))
Pick a letter o You guessed correctly! Word to guess: - o -
Sokkal jobb! De kissé nehézkes lesz mindezt beírni minden egyes alkalommal, ezért készítsünk hozzá segédfunkciót, és használhatjuk a print(guess_word)
a játék elején is.
def print_word_to_guess(letters): """Utility function to print the current word to guess""" print("Word to guess: {0}".format(" ".join(guess_word)))
Akkor csak print_word_to_guess(guess_word)
amikor csak szükségünk van rá. Lehetséges egy opcionális másik üzenet is, de alapértelmezés szerint Word to guess:
, de ezt meghagyom neked kihívásként.
A játék még soha nem mond nekem semmit arról, hogy hány esélyem van, ezért a találgatást (szó szerint) hagytam, amíg ki nem találtam. Ezt nagyon könnyű elkészíteni egy kis segédprogram funkcióval:
def print_guesses_taken(current, total): """Prints how many chances the player has used""" print("You are on guess {0}/{1}.".format(current, total))
Ezután néhány kód kiegészítés:
def guessing(): guess_taken = 1 MAX_GUESS = 10 print_guesses_taken(guess_taken, MAX_GUESS) while guess_taken < MAX_GUESS:
És:
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)
A szavak listája meglehetősen szűk, a jövőben fontolja meg, hogy keressen egy szöveges fájlt online, egy csomó szóval, és csak olvasson belőle egy véletlenszerűt, több változatosságot hozna!
Kódjavítások
main
függvény
Az összes játékot futtatja funkciók, amint elkészíti őket. Ésszerűbb lenne a __main__
függvénybe helyezni őket:
if __name__ == "__main__": beginning() newFunc() change() guessing()
Egyébként a newFunc()
nem működik jól névként, mivel nem mond semmit arról, amit csinál. Valami, például ask_user_to_play()
sokkal jobb lenne.
Állandó elnevezés
A Pythonnak nincsenek valódi állandói, de ennek ellenére jó gyakorlat megnevezni olyan változók, amelyeknek nem szabad megváltozniuk (a változás alatt azt értem, hogy más értékekhez rendeltem át őket) az ALL_CAPS_WITH_UNDERSCORES fájlban. Egy egyszerű keresés & helyettesítés egy IDE vagy szövegszerkesztőben az egész szkript kijavításához.
GUESS_WORD = [] SECRET_WORD = random.choice(wordList) # lets randomize single word from the list LENGTH_WORD = len(SECRET_WORD) ALPHABET = "abcdefghijklmnopqrstuvwxyz" letter_storage = []
Docstring
Jó szokás egy docstringet hozzáadni az összes függvényhez, osztályhoz és modulhoz, hogy leírja azokat másoknak programozóknak mire szolgál a kérdéses kód. Ezt megtettem a fenti 2 segédfunkciónál.
Írja be a tippeket
A Python 3 óta mostantól használhatja a div id = “845a972284”>
típusú tippek a függvényhez és a metódus aláírásokhoz, és használjon statikus kódelemző eszközöket. Ez megkönnyíti a kód olvasását az emberek számára is.
Továbbfejlesztett kód
Itt találtam ki, alkalmazva a fentieket, és javítva a szóközöket ( a tiednek mindenütt túl sok üres sora volt). Valószínűleg van még mit javítani, de ennek jó kezdetnek kell lennie.
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()
Megjegyzések
- Nem tudom ‘ megmondani, mennyire értékelem a válaszodat! Végignézem az összes tippet, és kihívást jelentek velük, még egyszer köszönöm 🙂
- Semmi gond, én is jól szórakoztam átnézni! Remélem, a jövőben még néhányat közzétesz =)