如何优化Python实现的Hangman猜词游戏代码,精简while True与if else语句?
Hangman猜单词游戏代码优化方案
一、移除两个while True的实现方法
两个死循环本质是没有把终止条件明确写在循环判断位,调整后可以完全去掉break跳出逻辑:
- 尝试次数输入循环:初始将次数设为
None,循环条件设为while no_of_tries is None,只有输入合法数值时才给变量赋值,自然退出循环 - 游戏主循环:新增
game_over状态变量,循环条件设为while not game_over,玩家耗尽次数/猜对单词时将状态设为True,即可自然终止循环,不需要调用sys.exit
二、减少if else嵌套的优化思路
采用前置拦截+提前终止的逻辑,把不符合要求的输入先做校验,校验不通过直接continue跳过后续逻辑,完全不需要多层嵌套:
- 先校验输入是不是纯字母,不满足就提示后直接进入下一轮循环
- 再校验输入长度是不是1位,不满足就提示后直接进入下一轮循环
- 新增重复输入校验,已经猜过的字母直接提示跳过,不会扣次数也不会重复记录
- 输赢判断独立抽出来,不用嵌在字母是否命中的分支里
三、其他代码整洁化建议
- 固定不变的常量用全大写命名,比如目标单词
TARGET_WORD,避免运行中被误修改 - 简化冗余逻辑:初始化占位符列表可以直接用
["_"] * len(TARGET_WORD),替代原来的for循环append写法;查询字母索引的函数可以直接合并到主逻辑里,不需要单独封装 - 功能拆分清晰:可以把状态打印、输入校验逻辑抽成独立小函数,后续修改调整更方便
- 尽量避免使用全局变量,后续如果要扩展多轮游戏功能,封装成类会更易维护
优化后完整代码
# 常量统一大写命名 TARGET_WORD = "stackoverflow" def main(): user_word = ["_"] * len(TARGET_WORD) used_letters = set() # 用set查询重复比列表更快 no_of_tries = None game_over = False # 替换第一个while True,明确循环终止条件 while no_of_tries is None: try: no_of_tries = int(input("Enter number of tries: ")) except ValueError: print("Enter numeric value :)") # 替换第二个while True,用状态变量控制循环 while not game_over: letter = input("Enter a letter: ").lower() # 前置校验,不满足直接continue,无嵌套 if not letter.isalpha(): print("Enter letter") continue if len(letter) != 1: print("Enter ONE letter") continue if letter in used_letters: print(f"You have already guessed '{letter}', try another one") continue used_letters.add(letter) # 命中逻辑 if letter in TARGET_WORD: # 替换原find_indexes函数逻辑 for idx, char in enumerate(TARGET_WORD): if char == letter: user_word[idx] = letter print("".join(user_word)) # 判断是否获胜 if "".join(user_word) == TARGET_WORD: print("WOW, VICTORY!!! :D") game_over = True # 未命中逻辑 else: print("There's no such letter in your word :(") no_of_tries -= 1 print(f"Tries left: {no_of_tries}") # 判断是否失败 if no_of_tries == 0: print("It was nice...to meet you") game_over = True print(f"Used letters: {list(used_letters)}") if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者ddream
相关产品推荐
相关产品推荐

