[英]Hangman with Python. ( version: 3.9.1 )
所以我試圖用 Python 創建 Hangman 並遇到了問題。 問題如下:
我對 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 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
時,這意味着用戶猜對了所有字母!
因此,如果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.