Hangman控制台游戏代码循环异常与尝试次数计数器故障排查求助
修复Hangman游戏的无限循环与尝试次数计数问题
我来帮你排查并解决这两个核心问题,先拆解一下问题根源:
问题1:无限循环的本质原因
你的代码里有两个直接导致无限循环的点:
stringcount()函数的最后一行又递归调用了自身,不管用户猜中还是猜错,都会重复执行这个函数;- 猜错字母后,程序没有让用户输入新的字母,一直拿着最初的
chosingletter重复判断,加上递归调用,直接陷入死循环。
问题2:尝试次数计数器失效的原因
- 每次调用
goAgain(defaultTries=5)时,你都把计数器重置为5,减1后变成4,但下一次调用又重新传5,永远停在4; defaultTries是局部变量,每次函数调用都会重新创建,无法保留之前的计数状态。
修复后的完整代码
我重构了代码逻辑,解决了这两个问题,同时保留了你的核心功能,还新增了尝试耗尽时的游戏结束逻辑:
import time def main(): hangman_solved = "What 'eva hh" remaining_tries = 5 # 初始化剩余尝试次数,用外部作用域变量维护状态 def go_again(): nonlocal remaining_tries remaining_tries -= 1 print(f"Head drawn! {remaining_tries} tries left") # 检查尝试次数是否耗尽 if remaining_tries <= 0: print("Game over! You've run out of tries.") return False # 返回False表示游戏结束 return True def string_count(letter): count = hangman_solved.count(letter) if count == 0: print(f"There are no '{letter}'s in this sentence!") time.sleep(1) # 调用go_again后判断是否继续游戏 return go_again() elif count == 1: print(f"There is only one '{letter}' in this sentence!") else: print(f"There are {count} '{letter}'s in this sentence!") return True # 返回True表示可以继续猜 # 主游戏循环 while True: if remaining_tries <= 0: break choosing_letter = input("\nInput a letter you would like to try! ").strip() # 调用string_count,根据返回值判断是否继续 if not string_count(choosing_letter): break if __name__ == "__main__": main()
关键修复说明
- 移除递归调用:用
while循环作为主游戏流程,代替stringcount()的递归,彻底避免无限循环; - 维护尝试次数状态:用
nonlocal关键字让go_again函数可以修改外部函数的remaining_tries变量,保留计数状态,不再每次重置; - 新增游戏结束判断:当
remaining_tries减到0时,触发游戏结束逻辑并退出循环; - 每次猜谜重新输入字母:把输入逻辑放到主循环里,每次循环都让用户输入新的字母,避免重复判断同一个字母;
- 代码风格优化:变量名改为符合Python规范的蛇形命名,提升代码可读性。
内容的提问来源于stack exchange,提问作者Emrah Sulejmanovic
相关产品推荐
相关产品推荐

