猜单词(Hangman)是经典的文字游戏:程序藏起一个单词,只显示字母个数,你一个个猜字母,猜对就亮出位置,猜错就少一次机会。它比猜数字更考验"状态管理"——你需要同时跟踪答案、已猜字母、已亮出的位置、剩余机会,这正是程序设计的核心练习。

玩法介绍

程序从单词库随机选一个英文单词(如 python),显示成 "_ _ _ _ _ _";玩家每次输入一个字母,猜中则所有对应位置亮出,猜错扣 1 次机会;共有 6 次机会,用完之前猜出全部字母即获胜,否则失败并公布答案。重复猜过的字母不扣机会。

第 1 步:准备单词库

用一个列表存单词,random.choice 随机选一个。统一转成小写,避免大小写导致比较失败。

import random

words = ["python", "hangman", "computer", "program", "keyboard"]
answer = random.choice(words).lower()

第 2 步:用状态列表显示进度

用列表 guessed 记录"哪些位置已经猜中",初始全是 False;显示时,猜中的位置输出字母,没猜中的输出下划线 _。这是"数据驱动显示":改数据,画面自动更新。

guessed = [False] * len(answer)

def show():
    line = []
    for i, ch in enumerate(answer):
        line.append(ch if guessed[i] else "_")
    print(" ".join(line))

show()   # 例如: _ _ _ _ _ _

第 3 步:猜字母与输入校验

要求输入单个字母,校验长度与是否为字母;用集合 tried 记录猜过的字母,重复输入不算错、不扣机会,直接提示并重来。

tried = set()   # 已猜过的字母集合

while True:
    ch = input("猜一个字母: ").lower()
    if len(ch) != 1 or not ch.isalpha():
        print("请输入单个英文字母!")
        continue
    if ch in tried:
        print("这个字母猜过了,换一个吧!")
        continue
    tried.add(ch)
    break

第 4 步:更新显示状态

猜中时把所有匹配位置标为 True;猜错时机会减 1。注意区分"哪个位置"和"什么字母"两层信息——enumerate 同时拿到下标和字符,是这段代码的关键。

if ch in answer:
    for i, letter in enumerate(answer):
        if letter == ch:
            guessed[i] = True
    print("猜对啦!")
else:
    lives -= 1
    print(f"没有这个字母,还剩 {lives} 次机会")

第 5 步:判定输赢并组装主循环

全部猜中即获胜——all(guessed) 一行搞定;机会用完则失败并公布答案。把前面几步组装成完整版:

import random

words = ["python", "hangman", "computer", "program", "keyboard"]
answer = random.choice(words).lower()
guessed = [False] * len(answer)
tried = set()
lives = 6

def show():
    print(" ".join(ch if guessed[i] else "_" for i, ch in enumerate(answer)))

while lives > 0 and not all(guessed):
    show()
    ch = input("猜一个字母: ").lower()
    if len(ch) != 1 or not ch.isalpha():
        print("请输入单个英文字母!")
        continue
    if ch in tried:
        print("这个字母猜过了!")
        continue
    tried.add(ch)
    if ch in answer:
        for i, letter in enumerate(answer):
            if letter == ch:
                guessed[i] = True
        print("猜对啦!")
    else:
        lives -= 1
        print(f"没有这个字母,还剩 {lives} 次机会")

if all(guessed):
    print(f"\n恭喜!你猜出了单词: {answer}")
else:
    print(f"\n机会用完啦,答案是: {answer},下次加油!")

第 6 步:完整代码与运行

第 5 步的代码就是完整版,保存为 hangman.py,运行 python3 hangman.py 即可游玩。玩的时候你会发现自己不知不觉在练英语——把单词库换成 function、variable 这类编程术语,边玩边巩固专业词汇。

💡 改进方向:①用 ASCII 画逐步画出"上吊小人",每错一次多画一笔,氛围拉满;②加入提示功能:花 1 次机会显示一个字母;③单词库按难度分组,开局可选;④把 guessed 列表换成字符串拼接版本,练习不同的数据处理思路。