You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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} 次机会")

关键改动说明

  1. 用列表维护显示状态
    我们用display_word = ["_"] * len(word)初始化一个和单词长度相同的下划线列表,因为列表是可变的,能直接修改指定索引的元素,比字符串操作更方便。

  2. 遍历所有匹配的字母位置
    update_display函数里用enumerate(word)遍历每个字符的索引和值,把所有和猜中字母匹配的位置都替换成该字母,这样就能显示所有出现的位置了。

  3. 保留之前的正确猜测
    每次猜中字母后,都是在已有的display_word基础上更新,而不是从初始下划线重新生成,所以之前猜中的字母会一直保留。

  4. 新增的优化功能

    • 跟踪已猜过的字母,避免重复猜测
    • 增加了胜负判断逻辑,当所有下划线都被替换时判定胜利,当尝试次数用完时判定失败

现在你再测试一下,比如单词是analyst,猜a会显示a _ a _ _ _ _,接着猜n就会变成a n a _ _ _ _,完全符合你的需求啦!

备注:内容来源于stack exchange,提问作者Luna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 19:19:39