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

Hangman游戏if条件异常及重复猜词生命扣除优化问题

解决Hangman游戏的重复提示与重复扣生命问题

我帮你搞定这两个问题!咱们先梳理下原代码里的逻辑漏洞:

  1. 你原本的判断是只要输入字母在单词里就打印重复提示,完全没考虑是不是第一次猜这个字母,所以首次猜正确字母也会触发提示;
  2. 重复猜错误字母时,没有检查是否已经猜过,导致每次都会扣除生命。

下面是修改后的完整代码,我会在后面解释关键改动:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:45:28