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

如何优化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 22:15:07