非常に基本的なコードでPythonハングマンアプリを完成させました。

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

それで、私のコードについていくつか質問があります:

  1. Pythonのクラスについていくつかのことを学び始め、「ねえ、クラスでこのハングマンを書いてみよう」と思いました。 ) “しかし、いくつかのコーディングを行った後、1つの関数でクラスを作成し、func()の代わりにclass.func()と呼びました。” sすべて。ハングマンゲームでクラスを使用する理由と方法はありますか?

  2. コードは非常に基本的であり、私のレベルでは、の有効性を正確に気にする必要はありません。コードはまだ-どの部分を改善する必要がありますか(コード自体ではなく、そこにある私のロジック)?「適切な」方法で書きたいのですが、コードはまだ非常に基本的に見えます。

回答

プレイアビリティ

最初にゲームを実行してテストしましたが、文字が" glass "のように、同じ単語で2回見つかりました:

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

それが仕様によるものかどうかはわかりませんが、プレーヤーとしては奇妙だと思います。 「が2回表示されました。コードの元の場所が見つかりました:

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) 

print(guess_word)のインデントを解除した場合2つのレベルでは、ループで実行されないため、この動作を回避できます。

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

["-", "-", "a", "s", "s"]のような生の配列を印刷するのは少し混乱します。最初は、それが何であるかわかりませんでした。私が正しいと思い、結果を見るまでは。それでは、もっとわかりやすいものを印刷してみましょう:

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

はるかに優れています!しかし、毎回すべてを入力するのは少し不格好になるので、ユーティリティ関数を作成して、 print(guess_word)ゲームの開始時も。

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

次に、print_word_to_guess(guess_word)必要なときはいつでも。オプションの別のメッセージを作成することもできますが、デフォルトはWord to guess:ですが、それは課題として残しておきます。


ゲームはまた、私が残したチャンスの数について何も教えてくれないので、私はそれを理解するまで(文字通り)推測し続けます。それは小さなユーティリティ関数を実行するのに非常に簡単です:

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

次にいくつかのコードを追加:

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

そして:

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) 

単語のリストはかなり限られています。将来的には、オンラインで大量の単語を含むテキストファイルを探して、そこからランダムなものを読み取ることを検討してください。より多様性をもたらすでしょう!


コードの改善

main機能

すべてのゲームを実行しますあなたがそれらを作るとすぐに機能します。それらを __main__ 関数内に配置する方が理にかなっています:

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

ちなみに、newFunc()は、その機能について何も述べていないため、名前としてはうまく機能しません。の方がはるかに優れています。


定数の命名

Pythonには実際の定数はありませんが、名前を付けることをお勧めします。 ALL_CAPS_WITH_UNDERSCORESで変更してはならない変数(変更とは、別の値に再割り当てされることを意味します)。 IDEまたはテキストエディタで&置換を見つけるだけで、スクリプト全体を修正できます。

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

Docstring

他の説明のために、すべての関数、クラス、モジュールに docstring を追加するのは良い習慣です。問題のコードの目的はプログラマーです。上記の2つのユーティリティ関数に対してこれを行いました。


タイプのヒント

Python 3以降、関数とメソッドの署名のヒントを入力し、静的コード分析ツールを使用します。これにより、コードが人間にとって読みやすくなります。


改善されたコード

これが私が思いついたもので、上記のすべてを適用し、間隔を改善しました(どこにでも空白行が多すぎます)。改善できる可能性のあるものは他にもありますが、これは良いスタートになるはずです。

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

コメント

  • 'あなたの回答にどれだけ感謝しているかわかりません。私はあなたのすべてのヒントを調べて、それらで自分自身に挑戦します、もう一度感謝します:)
  • 問題ありません、私もそれをレビューするのを楽しんでいました!今後も投稿していただければ幸いです=)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です