簡體   English   中英

Python 的劊子手。 (版本:3.9.1)

[英]Hangman with Python. ( version: 3.9.1 )

所以我試圖用 Python 創建 Hangman 並遇到了問題。 問題如下:

  1. 該循環似乎是一個無限循環(while 循環)。
  2. 帶有空格的單詞沒有連接,例如“Strawberry Shakes”似乎是“Strawberry Shaeks”或類似的東西。

我對 python 很陌生(大約一周左右),還沒有正確掌握語言。 我將不勝感激任何幫助。 先感謝您。

代碼如下:

import random 
word_list = {
    "Animals" : "ORANGUTAN",
    "Animals" : "GIRAFFE",
    "Animals" : "ELEPHANT",
    "Animals" : "CHEETAH",
    "Food & Drinks" : "ROASTED BEEF SANDWICH",
    "Food & Drinks" : "MAC AND CHEESE",
    "Food & Drinks" : "VIRGIN MOJITO",
    "Food & Drinks" : "STRAWBERRY SHAKE",
    "Brands" : "SAMSUNG",
    "Brands" : "APPLE",
    "Brands" : "CALVIN KLEIN",
    "Brands" : "JOCKEY" }

key_list = ["Animals", "Food & Drinks", "Brands"]

key_name = random.choice(key_list) 
guess_word = word_list.get(key_name)
 
print(f'{key_name} ({len(guess_word)} letter word)')

letter_list = [] 
answer = "" 
chances = 0 
already_inputted = ""

while answer.join(letter_list) != guess_word or chances < 5:

    index = 0
    guesses = input('Enter a letter as a guess: ')

    if already_inputted.__contains__(guesses):
        print('The letter is already guessed')

    elif guess_word.__contains__(guesses):
        for letter in guess_word:
            if letter == guesses:
                letter_list.insert(index, guesses)
            index += 1
    
    else:
        chances += 1

    already_inputted += guesses

    print(f'{letter_list}\nchances = {5 - chances}\nalready guessed = {already_inputted}')

if chances == 5:
    print(f"You lost! The word was {guess_word}")

else:
    print("You win!")

你有一個非常好的開始,但到處都有一些錯誤。 我將 go 一步一步解釋,最后為您提供修改后的代碼。 順便說一句,如果我替換任何內容,我會將其注釋掉,以便您了解有什么區別。

變量重構

這更像是個人的事情而不是錯誤。 當您的用戶發送輸入時,您將存儲在一個名為guesses的變量中。 我只是將其更改為guess ,因為這樣更有意義。 這樣的事情不會影響您的代碼,但它們確實有助於使您的代碼更易於閱讀,從而更易於調試。

修復混亂的單詞*:修復letter_list

每當玩家獲得正確的字母時,您就使用letter_list.insert(index, guess)來更新游戲中的字母。 但是,您將列表初始化為空數組[] python 使用insert function 時,盡量在右側插入字母 position。 但是,如果數組太小,那么它只是進入數組末尾的元素。

下面是一個例子(使用 STRAWBERRY SHAKE 這個詞):

letters_list = ["T","R"]
letters_list.append(0, "S")    #letters_list = ["S", "T", "R"]
letters_list.append(11, "S")   #letters_list = ["S", "T", "R", "S"] because there are only three elements

看看它是如何添加字母的? 解決方案是用空的"_"填充您的列表,然后在用戶正確猜測時替換該值。 像這樣:

letter_list = ["_"]*len(guess_word)    #Creates dashes for however many letters the word has
...
elif guess_word.__contains__(guess):
    for letter in guess_word:
        if letter == guess:
            #Changed to update list value instead of insert
            #letter_list.insert(index, guess)
            letter_list[index] = guess
        index += 1

有趣的是,破折號也使游戲看起來更好。 這是它現在的樣子:

Enter a letter as a guess: B
['_', '_', 'C', '_', 'E', '_']
chances = 0

修復無限循環:添加計數器並修復 While 條件

計數器變量

循環你開始的程序while answer.join(letter_list) != guess_word or chances < 5 answer.join部分的問題在於玩家輸入單詞的順序可能與實際單詞本身不同。 例如,如果我按以下順序猜測"JOCKEY"['O', 'J', 'K', 'C', 'Y', 'E'] ,程序將比較單詞"OJKCYE""JOCKEY"並聲稱它們不一樣。

為了解決這個問題,我添加了一個名為letters_left的計數器變量,它跟蹤我們需要猜出多少正確字母才能解決難題。 每次用戶猜到一個正確的字母時,我letters_left減 1。

為了創建letters_left ,我使用了len(set(letters_left)) python 中的set()基本上是一個列表,但沒有任何重復。 這意味着,如果我嘗試用單詞"APPLE"制作一個set ,它只會是{"A","P","L","E"} 得到它的長度告訴我有多少個獨特的字母。 以下是所有內容的外觀:

letters_left = len(set(guess_word))
elif guess_word.__contains__(guess):
    ...
    #After the for loop:
    #Decrement counter of how many letters are left since we guessed one
    letters_left -= 1

每當letters_left == 0時,這意味着用戶猜對了所有字母!

修復while條件

因此,如果letters_left為 0 或者如果chances大於 5,我們的新 while 循環需要停止

這應該是這樣的:

while letters_left != 0 and chances < 5:

我使用and關鍵字而不是or關鍵字的原因是我需要這兩個語句都有效。 也就是說,只有在用戶沒有解開謎題並且仍有機會的情況下,游戲才能繼續進行。 設置它or意味着如果用戶沒有機會,他們可以繼續前進,但仍然沒有得到它。 我們不希望這樣。

最終代碼

這是在我的機器上完美運行的最終代碼。 它包含我之前討論過的所有原始代碼和一些注釋。

import random 

#Changed guess to guess bc it makes more sense

word_list = {
    "Animals" : "ORANGUTAN",
    "Animals" : "GIRAFFE",
    "Animals" : "ELEPHANT",
    "Animals" : "CHEETAH",
    "Food & Drinks" : "ROASTED BEEF SANDWICH",
    "Food & Drinks" : "MAC AND CHEESE",
    "Food & Drinks" : "VIRGIN MOJITO",
    "Food & Drinks" : "STRAWBERRY SHAKE",
    "Brands" : "SAMSUNG",
    "Brands" : "APPLE",
    "Brands" : "CALVIN KLEIN",
    "Brands" : "JOCKEY" }

key_list = ["Animals", "Food & Drinks", "Brands"]

key_name = random.choice(key_list) 
guess_word = word_list.get(key_name)

print(f'{key_name} ({len(guess_word)} letter word)')

letter_list = ["_"]*len(guess_word) 
#Added counter variable to keep track of how many letters are still needed
letters_left = len(set(guess_word))
answer = "" 
chances = 0 
already_inputted = ""

#Modifying while loop to check if counter is zero or if chances are bigger than 5
#Also used "and" instead of or because either condition needs to terminate
#while answer.join(letter_list) != guess_word or chances < 5:
while letters_left != 0 and chances < 5:
    print(letters_left)

    index = 0
    guess = input('Enter a letter as a guess: ')

    if already_inputted.__contains__(guess):
        print('The letter is already guessed')

    elif guess_word.__contains__(guess):
        for letter in guess_word:
            if letter == guess:
                #Changed to update list value instead of insert
                #letter_list.insert(index, guess)
                letter_list[index] = guess
            index += 1
        #Decrement counter of how many letters are left since we guessed one
        letters_left -= 1
    
    else:
        chances += 1

    already_inputted += guess

    print(f'{letter_list}\nchances = {5 - chances}\nalready guessed = {already_inputted}')

if chances == 5:
    print(f"You lost! The word was {guess_word}")

else:
    print("You win!")

:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM