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

Python编写hangman游戏无报错但终端无输出问题排查

问题现象

在PyCharm中编写hangman猜词游戏代码,运行时无任何报错,但终端未输出预期交互内容,hangman()函数未正常执行,仅打印venv虚拟环境下Python解释器路径、当前运行脚本路径:

/Users/nighttwinkle/PycharmProjects/pythonProject/venv/bin/python
/Users/nighttwinkle/PycharmProjects/pythonProject/main.py

涉及原代码如下:

import random
from Words import words
import string

def get_valid_word(words):
    word = random.choice(words)
    while '-' or ' ' in word:
        word = random.choice(words)
    return word.upper()


def hangman() -> object:
    word = get_valid_word(words)
    word_letter = set(word)
    alphabet = set(string.ascii_uppercase)
    used_letter = set()

    while len(word) > 0:
        print("You have used these letter", ' '.join(used_letter))
        word_list = [letter if letter in used_letter else '-' for letter in word]
        print("Current word: ", ' '.join(word_list))
        user_letter = input("Guess a letter: ")

        if user_letter in alphabet - used_letter:
            used_letter.add(user_letter)
            if user_letter in word_letter:
                word_letter.remove(user_letter)
        elif user_letter in used_letter:
            print("You have already used this letter: ")
        else:
            print("Invalid input")


if __name__ == '__main__':
    hangman() 
根因分析

代码存在两处核心逻辑错误,直接导致程序无输出卡死:

  • get_valid_word函数内的循环条件while '-' or ' ' in word存在逻辑运算优先级问题:非空字符串'-'的布尔值恒为True,该判断等价于while True or (' ' in word),会触发无限死循环,程序启动后会一直卡在随机选单词的环节,永远走不到后续打印、交互的代码段,因此终端只有PyCharm默认打印的路径信息,无其他输出。
  • 即使修复上述死循环问题,hangman函数内的主循环条件while len(word) > 0也存在逻辑错误:word是存储完整目标单词的字符串,长度全程固定不会变为0,会导致玩家猜中所有字母后游戏也无法正常退出。
  • 额外体验问题:用户输入小写字母时会被判定为无效输入,缺少输入转大写的处理。
修复方案
  • 修正get_valid_word的循环判断逻辑,正确校验单词是否包含横杠或空格
  • 修正hangman主循环的退出条件,以「剩余未猜中字母集合是否为空」作为循环判断依据
  • 新增输入自动转大写逻辑,兼容用户小写输入的场景
  • 补充游戏胜利提示,完善交互反馈

修复后的完整代码:

import random
from Words import words
import string

def get_valid_word(words):
    word = random.choice(words)
    # 修复原逻辑恒真的死循环问题
    while '-' in word or ' ' in word:
        word = random.choice(words)
    return word.upper()


def hangman():
    word = get_valid_word(words)
    word_letter = set(word)
    alphabet = set(string.ascii_uppercase)
    used_letter = set()

    # 修复原循环永远无法退出的问题,以剩余未猜字母数作为判断条件
    while len(word_letter) > 0:
        print("You have used these letter", ' '.join(used_letter))
        word_list = [letter if letter in used_letter else '-' for letter in word]
        print("Current word: ", ' '.join(word_list))
        # 新增输入自动转大写,兼容小写输入
        user_letter = input("Guess a letter: ").upper()

        if user_letter in alphabet - used_letter:
            used_letter.add(user_letter)
            if user_letter in word_letter:
                word_letter.remove(user_letter)
                print(f"Correct! {len(word_letter)} letters left.")
        elif user_letter in used_letter:
            print("You have already used this letter, please try another one.")
        else:
            print("Invalid input, please enter an English letter.")
    
    # 猜中所有字母后的胜利提示
    print(f"Congratulations! You guessed the word correctly: {word}")


if __name__ == '__main__':
    hangman() 

修复后重新运行即可正常进入交互流程,按提示猜字母即可完成游戏。

内容的提问来源于stack exchange,提问作者Nighttwinkle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:18:19