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

如何在while循环中覆盖控制台多次输出(Hangman游戏优化)

解决Hangman游戏控制台输出覆盖问题

问题说明

我为课程制作了一个简单的Hangman(绞刑架)游戏,功能已实现,但希望在while循环中覆盖控制台的重复输出,让界面更整洁、更像真实游戏,而非连续打印语句。

游戏核心逻辑:

  • 从word_list随机选取单词存入chosen_word
  • display列表根据单词长度填充下划线
  • 玩家猜字母,用完6次机会则失败,猜完所有字母则胜利

现有循环代码存在的问题:每次操作后控制台会追加打印内容,无法覆盖之前的绞刑架图案、已猜单词状态等信息。

现有循环代码片段:

while "_" in display:
    counter = 0
    guess = input(f"Please choose a letter: ").lower()

    for letter in chosen_word:
        counter += 1
        if guess == letter:
            display[counter -1] = letter

    if guess in letters_used:
        print("You already used this letter, please choose a different letter.")
        print(" ")
        continue

    letters_used.append(guess)

    if guess not in display:
        loops += 1
        print(stages[loops - 1])
        print(" ".join(display))
        print(f"You guessed {guess}, that's not in the word. You lose a life and have {6 - loops} lives left.")
        print(f"So far you have used the letters: {letters_used}")
        print(" ")
    else:
        print(" ".join(display))
        print(" ")

    if loops == 6:
        print(f"You lose, as expected haha. The word was {chosen_word}")
        exit()

else:
    print("You win, finally...")

解决方案

通过控制台清屏实现输出覆盖,每次循环开始时清空控制台,再打印当前最新的游戏状态(绞刑架图案、待猜单词、剩余生命、已用字母),让界面始终只显示当前游戏信息。

实现思路

  1. 使用跨平台清屏命令:Windows用cls,Linux/macOS用clear,通过os模块判断系统执行对应命令
  2. 统一游戏状态打印逻辑:每次循环先清屏,再打印所有当前状态,避免分散打印导致的内容堆积
  3. 优化重复输入提示:清屏后显示状态+提示,让用户明确当前情况

修改后的完整代码示例

import random
import os

# 自定义单词列表和绞刑架阶段图案(可根据实际需求调整)
word_list = ["apple", "banana", "cherry", "date", "elderberry"]
stages = [
    """
      +---+
          |
          |
          |
         ===
    """,
    """
      +---+
      O   |
          |
          |
         ===
    """,
    """
      +---+
      O   |
      |   |
          |
         ===
    """,
    """
      +---+
      O   |
     /|   |
          |
         ===
    """,
    """
      +---+
      O   |
     /|\\  |
          |
         ===
    """,
    """
      +---+
      O   |
     /|\\  |
     /    |
         ===
    """,
    """
      +---+
      O   |
     /|\\  |
     / \\  |
         ===
    """
]

chosen_word = random.choice(word_list)
display = ["_"] * len(chosen_word)
letters_used = []
loops = 0  # 初始错误次数为0

while "_" in display:
    # 跨平台清屏操作
    os.system('cls' if os.name == 'nt' else 'clear')
    
    # 打印当前完整游戏状态
    print(stages[loops])
    print(" ".join(display))
    print(f"剩余生命: {6 - loops}")
    print(f"已使用字母: {', '.join(letters_used) if letters_used else '无'}")
    
    # 获取用户输入
    guess = input("\n请输入一个字母: ").lower()
    
    # 校验输入格式
    if not guess.isalpha() or len(guess) != 1:
        print("请输入单个英文字母!")
        input("按回车继续...")
        continue
    
    # 处理重复输入
    if guess in letters_used:
        os.system('cls' if os.name == 'nt' else 'clear')
        print(stages[loops])
        print(" ".join(display))
        print(f"剩余生命: {6 - loops}")
        print(f"已使用字母: {', '.join(letters_used)}")
        print("⚠️ 你已经用过这个字母了,请换一个!")
        input("按回车继续...")
        continue
    
    letters_used.append(guess)
    
    # 检查猜测是否正确
    correct_guess = False
    for idx, letter in enumerate(chosen_word):
        if guess == letter:
            display[idx] = letter
            correct_guess = True
    
    # 处理错误猜测及失败判定
    if not correct_guess:
        loops += 1
        if loops == 6:
            os.system('cls' if os.name == 'nt' else 'clear')
            print(stages[loops])
            print(f"You lose, as expected haha. The word was {chosen_word}")
            exit()

# 胜利结算
os.system('cls' if os.name == 'nt' else 'clear')
print(stages[loops])
print(" ".join(display))
print("You win, finally...")

关键修改点

  1. 清屏操作:在每次循环开头和结果展示前执行清屏,确保界面只保留当前状态
  2. 状态统一打印:将绞刑架、待猜单词、剩余生命、已用字母的打印逻辑整合,避免分散输出
  3. 输入校验:新增非字母输入的处理,提升用户体验
  4. 重复输入提示优化:清屏后显示完整状态+提示,用户明确当前情况后再继续

内容的提问来源于stack exchange,提问作者possibly_dehydrated

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 21:35:03