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

Python实现Hangman游戏:数组编辑与动态显示异常求助

解决Hangman游戏的两个适配问题

问题分析

  1. 无法适配任意长度单词:原代码仅在游戏初始化时生成一次下划线序列,未动态更新,导致无法根据单词长度灵活调整显示。
  2. 猜中字母无法实时更新:显示序列仅在游戏开始时赋值,后续存储猜中状态的数组更新后未重新生成显示内容,打印的始终是初始下划线序列。

修复方案

核心修改点

  • 移除提前生成显示序列的代码,改为在print_Hangman函数内动态生成显示内容,每次打印时都会根据最新的猜中状态生成,同时适配任意单词长度。
  • 修复letters变量未初始化的问题,避免首次运行报错。
  • 修正索引越界问题(原代码中循环范围错误,会引发数组访问异常)。

完整修正代码

import random
import os

c = "Y"

def print_Hangman():
    print("☠️☠️☠️ | HANGMAN GAME | ☠️☠️☠️")
    # 动态生成显示序列:根据当前grid状态拼接,适配任意长度单词
    display = "      " + " ".join(grid)
    print(display)
    print("      Stationary")
    if chances == 6:
        print("   _____ \n  |     | \n  |     | \n  |      \n  |      \n  |      \n  |      \n__|__\n")
    elif chances == 5:
        print("   _____ \n  |     | \n  |     | \n  |     O \n  |      \n  |      \n  |      \n__|__\n")
    elif chances == 4:
        print("   _____ \n  |     | \n  |     | \n  |     O \n  |     | \n  |      \n  |      \n__|__\n")
    elif chances == 3:
        print("   _____ \n  |     | \n  |     | \n  |     O \n  |     |\\ \n  |      \n  |      \n__|__\n")
    elif chances == 2:
        print("   _____ \n  |     | \n  |     | \n  |     O \n  |    /|\\ \n  |      \n  |      \n__|__\n")
    elif chances == 1:
        print("   _____ \n  |     | \n  |     | \n  |     O \n  |    /|\\ \n  |    /   \n  |      \n__|__\n")
    elif chances == 0:
        print("   _____ \n  |     | \n  |     | \n  |     O \n  |    /|\\ \n  |    / \\ \n  |      \n__|__\n")
    global letters
    if guessed_Letter > 0:
        if chances < 1:
            print("You Lose")
        else:
            letters = input("What letter do you think will be there: ")
    else:
        print("You Win")

while c == "Y":
    chances = 6
    word_List = ["pencil", "window", "rubber", "pen", "eraser"]  # 添加不同长度的单词测试
    word = random.choice(word_List)
    guessed_Letter = len(word)

    # 初始化grid:根据单词长度生成对应数量的下划线
    grid = ["_"] * len(word)
    letters = ""  # 初始化letters变量,避免首次运行报错

    os.system('cls')

    while chances > 0 and guessed_Letter > 0:
        print_Hangman()
        # 验证输入的字母格式
        while not len(letters) == 1 or not letters.isalpha():
            os.system('cls')
            print("Notif:\nPlease enter a single alphabetic letter!")
            print_Hangman()

        if letters in word:
            already_guessed = False
            for i in range(len(word)):
                if grid[i] == letters:
                    already_guessed = True
                    break
                if word[i] == letters:
                    grid[i] = letters
                    guessed_Letter -= 1
            if already_guessed:
                os.system('cls')
                print("Notif:\nYou have guessed this letter already! ")
            else:
                os.system('cls')
        else:
            os.system('cls')
            chances -= 1
    print_Hangman()
    c = input("Play Again [Y/N]: ").strip().upper()

额外优化说明

  • 使用grid = ["_"] * len(word)简化下划线数组的初始化,替代原有的while循环。
  • 增加letters.isalpha()验证,确保输入的是字母。
  • 优化重复猜字母的判断逻辑,使用for循环替代原有的while循环,更简洁且避免索引越界。
  • 最后将用户输入的c转为大写,避免大小写敏感问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:56:30