Python实现Hangman游戏:数组编辑与动态显示异常求助
解决Hangman游戏的两个适配问题
问题分析
- 无法适配任意长度单词:原代码仅在游戏初始化时生成一次下划线序列,未动态更新,导致无法根据单词长度灵活调整显示。
- 猜中字母无法实时更新:显示序列仅在游戏开始时赋值,后续存储猜中状态的数组更新后未重新生成显示内容,打印的始终是初始下划线序列。
修复方案
核心修改点
- 移除提前生成显示序列的代码,改为在
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
相关产品推荐
相关产品推荐

