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

Python命令行Hangman游戏函数调用与变量使用问题求助

Hangman游戏函数传参与变量问题修复

问题核心

你的代码存在三个关键问题:

  • run_game函数内重复调用musician_blanks(),导致每次循环生成新的音乐人
  • 字母输入只在循环外获取一次,导致循环内反复判断同一个字母
  • 循环条件错误,未结合尝试次数与猜词进度控制游戏流程

修复后的完整代码

import random

# 示例音乐人列表,可替换为自定义内容
musicians_list = ["Taylor Swift", "Ed Sheeran", "Billie Eilish", "Bob Dylan"]

def musician_blanks():
    """从列表随机获取音乐人名称并转为大写"""
    musician = random.choice(musicians_list).upper()
    return musician

def letter_validation():
    while True:
        letter_input = input("Please enter a letter: \n").upper()
        if len(letter_input) == 1 and letter_input.isalpha():
            return letter_input
        else:
            print("Invalid - please enter a letter.\n")

def display_dj(tries):
    # Hangman图案阶段,根据剩余尝试次数返回对应样式
    hangman_stages = [
        """
          ------
          |    |
          |    O
          |   /|\\
          |   / \\
          |
        ---
        """,
        """
          ------
          |    |
          |    O
          |   /|\\
          |   / 
          |
        ---
        """,
        """
          ------
          |    |
          |    O
          |   /|\\
          |    
          |
        ---
        """,
        """
          ------
          |    |
          |    O
          |   /|
          |    
          |
        ---
        """,
        """
          ------
          |    |
          |    O
          |    |
          |    
          |
        ---
        """,
        """
          ------
          |    |
          |    O
          |    
          |    
          |
        ---
        """,
        """
          ------
          |    |
          |    
          |    
          |    
          |
        ---
        """
    ]
    return hangman_stages[6 - tries]

def game_title():
    print("=== HANGMAN: MUSICIAN EDITION ===")

def run_game(musician):
    tries = 6
    guessed_letters = []
    # 初始化显示字符,空格直接保留,字母转为下划线
    display_word = ["_" if char != " " else " " for char in musician]
    
    while tries > 0 and "_" in display_word:
        print("\n" + " ".join(display_word))
        print(display_dj(tries))
        letter = letter_validation()
        
        if letter in guessed_letters:
            print(f"You already guessed '{letter}'!")
            continue
        
        guessed_letters.append(letter)
        
        if letter in musician:
            print("Correct!")
            # 更新已猜中字母的显示
            for idx, char in enumerate(musician):
                if char == letter:
                    display_word[idx] = letter
        else:
            print("Incorrect!")
            tries -= 1
    
    # 游戏结束判定
    if "_" not in display_word:
        print(f"\nCongratulations! You guessed it: {musician}")
    else:
        print(f"\nGame Over! The musician was: {musician}")

def main():
    game_title()
    musician = musician_blanks()
    run_game(musician)

if __name__ == "__main__":
    main()

关键修改说明

  1. 函数传参与变量复用

    • main中仅调用一次musician_blanks()生成目标音乐人,通过参数传递给run_game,全程使用该变量,避免重复生成新目标
    • run_game不再调用musician_blanks(),直接使用传入的musician参数,保证游戏全程目标一致
  2. 循环逻辑优化

    • 将letter_validation()移到run_game的循环内部,每次循环请求新的字母输入,解决重复判断同一字母的问题
    • 循环条件改为tries > 0 and "_" in display_word,结合剩余尝试次数与猜词进度控制游戏结束时机
  3. 状态维护

    • 添加guessed_letters列表记录已猜过的字母,避免重复输入
    • 用display_word维护显示的空白与已猜中字母,实现游戏视觉反馈
  4. 冗余代码清理

    • 移除main中多余的musician_blanks()调用
    • 简化letter_validation的异常捕获(原代码的ValueError不会触发,因为input返回字符串,无需捕获)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 15:53:10