Python基础hangman项目无限while循环无法退出问题求助
Hangman经典版代码修复方案
核心bug根源
- 游戏逻辑外层冗余的
for i in range(len(x)+2)循环:内部while循环触发break退出后,外层for会再次迭代,重置所有计数变量重新开启while循环,导致用户猜对后依然被要求不断输入字符 - 变量
cc未提前初始化:如果用户第一次输入就正确输入start,程序会因为找不到cc变量抛出NameError - 猜对计数逻辑错误:用户重复输入同一个正确字母时,
flag会重复累加,导致计数和实际猜对的唯一字母数不匹配 - 输赢逻辑混淆:次数用尽和猜对单词都打印胜利提示,不符合Hangman游戏规则
- 选单词逻辑冗余:不需要循环遍历所有分类多次取随机值,单次随机即可拿到目标单词
修复后可运行代码
import random # 初始化所有变量避免未定义错误 cc = "" d = input("ENTER START: ").lower() sb = { "fruits": ("strawberry", "banana", "apple", "orange", "guava", "grapes"), "colours": ("red", "blue", "orange", "brown", "yellow"), "cars": ("maruti", "nano", "ferrari", "audi", "jaguar") } # 简化选单词逻辑,无需循环 keys = list(sb.keys()) random_category = random.choice(keys) word_list = sb[random_category] target_word = random.choice(word_list) print(target_word) # 测试用可保留,正式游戏可删除 if d != "start": cc = input("Enter the CORRECT command in pls: ").lower() if d == "start" or cc == "start": max_chance = len(target_word) + 2 print(f"HINT 1:ok so I have chosen {random_category}!!!\n and you have {max_chance} chances to guess") # 移除冗余外层for循环,计数变量只初始化一次 query = [] chance = 0 unique_letters = set(target_word.lower()) while True: input_char = input("Enter the letter: ").lower() query.append(input_char) # 生成当前猜测结果 output = " ".join([char if char in query else "_" for char in target_word.lower()]) print(output) chance += 1 # 统计猜对的唯一字母数,避免重复输入计数错误 correct_count = len([c for c in unique_letters if c in query]) # 输赢判断 if correct_count == len(unique_letters): print("YIKES!!you won!!!") break if chance >= max_chance: print(f"Sorry you have used up all chances! The correct word is {target_word}") break
关键修改说明
- 删除了游戏逻辑外层冗余的for循环,计数变量仅在游戏开始前初始化一次
- 提前初始化
cc变量,避免未定义报错 - 简化了随机选分类和单词的逻辑,用
random.choice替代手动生成随机索引取值,可读性更高 - 猜对计数改为直接统计唯一匹配字母数,避免重复输入导致的计数错误
- 拆分输赢判断逻辑,次数用尽时打印失败提示并给出正确答案
内容的提问来源于stack exchange,提问作者Dhriti Dey
相关产品推荐
相关产品推荐

