Hangman游戏if条件异常及重复猜词生命扣除优化问题
解决Hangman游戏的重复提示与重复扣生命问题
我帮你搞定这两个问题!咱们先梳理下原代码里的逻辑漏洞:
- 你原本的判断是只要输入字母在单词里就打印重复提示,完全没考虑是不是第一次猜这个字母,所以首次猜正确字母也会触发提示;
- 重复猜错误字母时,没有检查是否已经猜过,导致每次都会扣除生命。
下面是修改后的完整代码,我会在后面解释关键改动:
import requests import random import hangman_art word_site = "https://www.mit.edu/~ecprice/wordlist.10000" response = requests.get(word_site) WORDS = response.text.splitlines() chosen = random.choice(WORDS) print(hangman_art.logo) # print(chosen) # 测试时可以打开,正式玩建议注释掉 stages = [''' +---+ | | O | /|\ | / \ | | ========= ''', ''' +---+ | | O | /|\ | / | | ========= ''', ''' +---+ | | O | /|\ | | | ========= ''', ''' +---+ | | O | /| | | | =========''', ''' +---+ | | O | | | | | ========= ''', ''' +---+ | | O | | | | ========= ''', ''' +---+ | | | | | | ========= '''] x = [] lives = 6 guessed_letters = set() # 新增:用来记录所有已经猜过的字母 for letter in chosen: x += '_' s = ' '.join(x) print(s) while '_' in x and lives > 0: # 加上lives>0的判断,避免生命耗尽后还继续循环 user = input("Guess a letter: ").lower() # 先检查是否已经猜过这个字母 if user in guessed_letters: if user in chosen: print("you have already entered that letter") else: print(f"You've already guessed {user}, that's not in the word. No life lost.") # 跳过后续处理,直接进入下一轮循环 continue # 没猜过的话,先加入已猜集合 guessed_letters.add(user) # 处理正确猜测的情况 if user in chosen: for i in range(len(chosen)): if chosen[i] == user: x[i] = user s = ' '.join(x) print(s) if '_' not in x: print("You Win!") # 处理错误猜测的情况(仅首次猜这个错误字母时扣生命) else: lives -= 1 print(stages[lives]) print(f"You guessed {user}, that's not in the word. You lose a life ({lives} left).") if lives == 0: print("You lose.") print(f"The word was: {chosen}") # 输了可以显示正确单词,提升体验
关键改动说明:
- 新增
guessed_letters集合:用集合来跟踪所有已经猜过的字母,集合的存在性检查效率非常高,适合做这种判断。 - 优先检查重复输入:每次用户输入后,先判断是否已经猜过这个字母:
- 如果是重复输入,分正确/错误字母给出对应提示,并且用
continue跳过后续逻辑,不执行更新或扣生命的操作; - 如果是首次输入,先把字母加入集合,再处理正确或错误的情况。
- 如果是重复输入,分正确/错误字母给出对应提示,并且用
- 优化循环条件:把
while '_' in x改成while '_' in x and lives > 0,避免生命耗尽后还继续循环。 - 新增输了后的提示:当生命耗尽时,显示正确单词,让玩家知道答案。
内容的提问来源于stack exchange,提问作者user21022383
相关产品推荐
相关产品推荐

