如何在Hangman游戏中显示字母在单词中的所有出现位置并正确更新已猜中字母
如何在Hangman游戏中显示字母在单词中的所有出现位置并正确更新已猜中字母
我明白你现在遇到的问题了——当猜中一个出现多次的字母时,只能显示其中一个位置,而且每次猜新的正确字母时,之前猜中的会消失,没法保留下来。咱们一步步来修复这个问题:
问题根源分析
你的代码目前的核心问题有两个:
- 每次更新显示时,都是基于初始的全下划线字符串
underscore,没有保留之前猜中的字母状态 add_letter函数只处理了字母第一次出现的位置,没有遍历所有匹配的索引
修复方案与修改后的代码
我们重新调整逻辑,维护一个动态的显示列表,每次猜中字母时一次性更新所有匹配的位置,同时保留之前的正确猜测:
# Hangman.py import random word_bank = """astounding psychology crazed prodigy jargon internship intelligence fundamentals analyst dictionary ransomware facility antelope dinosaur""".split() alphabet = "abcdefghijklmnopqrstuvwxyz" drawing = [""" +--+ | | | === """, """ +--+ O | | | === """, """ +--+ O | | | | === """, """ +--+ O | /| | | === """, """ +--+ O | /|\ | | === """, """ +--+ O | /|\ | / | === """, """ +--+ O | /|\ | / \ | === """] # 随机选择单词 random_num = random.randint(0, len(word_bank)-1) word = word_bank[random_num] tries = 0 # 初始化显示字符串为列表(方便修改单个位置) display_word = ["_"] * len(word) # 跟踪已经猜过的字母,避免重复猜测 guessed_letters = [] def update_display(letter): # 遍历单词的所有索引,替换所有匹配的位置 for i, char in enumerate(word): if char == letter: display_word[i] = letter # 把列表转成带空格的字符串返回 return " ".join(display_word) print("HANGMAN ------") while True: print(drawing[tries]) # 打印当前的显示状态 print(" ".join(display_word)) # 检查是否已经赢了 if "_" not in display_word: print("恭喜你赢了!正确单词是:", word) break # 检查是否已经输了 if tries >= len(drawing)-1: print("你输了!正确单词是:", word) break letter = input("Enter a letter: ").lower() # 输入验证 if letter not in alphabet or len(letter) != 1: print("You must enter 1 letter from the alphabet! \n") continue # 检查是否已经猜过这个字母 if letter in guessed_letters: print("你已经猜过这个字母了,换一个吧!") continue guessed_letters.append(letter) if letter in word: updated_display = update_display(letter) print(f"猜对了!当前状态:{updated_display}") else: tries += 1 print(f"Wrong :( 你还有 {len(drawing)-1 - tries} 次机会")
关键改动说明
用列表维护显示状态
我们用display_word = ["_"] * len(word)初始化一个和单词长度相同的下划线列表,因为列表是可变的,能直接修改指定索引的元素,比字符串操作更方便。遍历所有匹配的字母位置
update_display函数里用enumerate(word)遍历每个字符的索引和值,把所有和猜中字母匹配的位置都替换成该字母,这样就能显示所有出现的位置了。保留之前的正确猜测
每次猜中字母后,都是在已有的display_word基础上更新,而不是从初始下划线重新生成,所以之前猜中的字母会一直保留。新增的优化功能
- 跟踪已猜过的字母,避免重复猜测
- 增加了胜负判断逻辑,当所有下划线都被替换时判定胜利,当尝试次数用完时判定失败
现在你再测试一下,比如单词是analyst,猜a会显示a _ a _ _ _ _,接着猜n就会变成a n a _ _ _ _,完全符合你的需求啦!
备注:内容来源于stack exchange,提问作者Luna
相关产品推荐
相关产品推荐

