Dokončil jsem svou aplikaci Python Hangman s velmi základním kódem.

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!") 

Takže mám několik otázek ohledně mého kódu:

  1. Začal jsem se opírat o věci v Pythonu a říkal jsem si „Hele, pojďme napsat tento Hangman with Classes ) „Ale po nějakém kódování, které jsem si uvědomil, jsem právě vytvořil třídy s 1 func a místo func() jsem jim prostě zavolal class.func() a to je vše. Existuje nějaký dobrý důvod, proč a jak mám používat třídy ve hře Hangman?

  2. Vím, že kód je velmi základní a na mé úrovni bych neměl přesně vadit účinnost kód, ale přesto – Která část by měla být vylepšena (nikoli samotný kód, ale moje logika)? Chci psát „správným“ způsobem, ale můj kód stále vypadá super základní.

Odpověď

Hratelnost

Spustil jsem vaši hru, abych ji nejprve vyzkoušel, a všiml jsem si něčeho zvláštního, když je písmeno nalezen dvakrát ve stejném slově, například “ sklo “ zde:

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

Nejsem si jistý, jestli je to záměrné, ale jako hráče mi připadá divné, že to „s zobrazeno dvakrát. V kódu jsem zjistil, odkud pochází:

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) 

Pokud právě zrušíte odsazení print(guess_word) od na dvou úrovních se tomuto chování vyhnete, protože nebude fungovat ve smyčce:

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

Tisk surového pole jako ["-", "-", "a", "s", "s"] je trochu matoucí, zpočátku jsem nevěděl, co to bylo protože dokud jsem nehádal jedno správně a neviděl výsledky. Nechme to tedy vytisknout něco přátelštějšího:

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

Mnohem lepší! Ale bude to trochu neohrabané pokaždé, když to všechno napíšeme, tak pro to vytvořme obslužnou funkci a můžeme ji použít pro print(guess_word) také na začátku hry.

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

Pak stačí print_word_to_guess(guess_word) kdykoli to potřebujeme. Bylo by také možné vytvořit volitelnou jinou zprávu, ale výchozí Word to guess:, ale to pro vás nechám jako výzvu.


Tato hra mi nikdy neřekne nic o tom, kolik šancí mi zbývá, takže nechávám hádání (doslovně), dokud na to nepřijdu. Je velmi snadné udělat malou užitečnou funkci:

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

Poté několik dodatků kódu:

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

And:

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) 

Váš seznam slov je velmi omezený, pro budoucnost zvažte možná hledání textového souboru online se spoustou slov a přečtěte si z něj jen náhodný, že by přineslo více rozmanitosti!


Vylepšení kódu

main funkce

Spustíte celou svou hru funkce, jakmile je vytvoříte. Dávalo by větší smysl je umístit do funkce __main__ :

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

Mimochodem, newFunc() nefunguje dobře jako jméno, protože neříká nic o tom, co dělá. Něco jako ask_user_to_play() by bylo mnohem lepší.


Pojmenování konstant

Python nemá skutečné konstanty, ale přesto je dobré pojmenovat proměnné, které by se neměly měnit (změnou mám na mysli přeřazení na jiné hodnoty) v ALL_CAPS_WITH_UNDERSCORES. Jednoduché nalezení & nahrazení v IDE nebo textovém editoru dělá trik, jak opravit celý váš skript.

GUESS_WORD = [] SECRET_WORD = random.choice(wordList) # lets randomize single word from the list LENGTH_WORD = len(SECRET_WORD) ALPHABET = "abcdefghijklmnopqrstuvwxyz" letter_storage = [] 

Docstring

Je dobrým zvykem přidat docstring ke všem funkcím, třídám a modulům, které lze popsat pro ostatní programátoři, k čemu daný kód slouží. Udělal jsem to pro výše uvedenou funkci 2.


Tipy k psaní

Od Pythonu 3 nyní můžete použít zadejte tipy pro vaše podpisy funkcí a metod a použijte nástroje pro analýzu statického kódu. To také usnadňuje čtení kódu pro člověka.


Vylepšený kód

Zde je to, na co jsem přišel, uplatnění všech výše uvedených a zlepšení mezer ( váš měl všude příliš mnoho prázdných řádků). Je pravděpodobné, že je možné vylepšit ještě další věci, ale mělo by to být dobrý začátek.

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() 

Komentáře

  • Nemohu ‚ říct, jak moc si vážím vaší odpovědi! Prohlédnu všechny vaše tipy a vyzvu se s nimi, ještě jednou děkuji 🙂
  • Žádný problém, bavilo mě to i při jeho kontrole! Doufám, že v budoucnu zveřejníte další =)

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *