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

如何修复Python海龟绘图刽子手游戏的字母定位错误问题?

问题描述

我正在学习基于Python的计算机科学入门课程,当前项目是用Python turtle图形库制作刽子手游戏。预期功能是:用户猜对字母时,在对应位置显示该字母;猜错时,绘制绞刑架的对应部分。但目前猜对字母时,字母位置经常错误,有时甚至不显示。

当前代码逻辑:用for循环遍历目标单词的字母,匹配用户猜测的字母时,让turtle(word_typer)在屏幕对应位置写入字母;将该for循环嵌套在while循环内,还用place变量跟踪字母写入位置,但无法正常工作。

原代码片段:

wrong_guesses = 0
guess_letter = ""
wrong_letters = 0

play = input("The theme of this hangman is chemistry! Would you like to play? y/n ")

def run():
    global play, wrong_guesses, current_word, wrong_letters
    if (play.lower() == 'y'):
        new_word()
        place = 0
        while (wrong_guesses < 6):
            guess_letter = input('Please guess a letter ')
            letters_guessed.append(guess_letter)
            for letter in current_word:
                if guess_letter == letter:
                    word_typer.penup()
                    word_typer.goto(30 * place, 0)
                    word_typer.write(guess_letter, font=("Arial", 20, "bold"))
                    place += 1
            for i in current_word:
                if guess_letter != i:
                    wrong_letters += 1
            if wrong_letters == len(current_word):
                wrong_guesses += 1
                draw_hangman()
    else:
        print("Maybe next time!")
问题根源
  1. place变量逻辑错误:place在while循环外初始化,每次猜对字母会持续累加,导致后续字母位置越来越偏离正确索引。
  2. 猜错判断逻辑错误:通过遍历单词累加wrong_letters,只要猜测字母与单词中任意字母不匹配就计数,会导致误判——比如单词是"apple",猜"p"时,wrong_letters会累加3次(a、l、e不等于p),直接触发猜错判定。
  3. 字母位置计算错误:用累加的place值定位,没有对应单词的实际索引,导致字母位置与单词字符位置不匹配。
修复后的代码
wrong_guesses = 0
letters_guessed = []
current_word = ""

# 假设word_typer是已初始化的turtle对象,draw_hangman()是绘制绞刑架的函数
play = input("这个刽子手游戏的主题是化学!要不要玩?y/n ")

def run():
    global play, wrong_guesses, current_word
    if play.lower() == 'y':
        new_word()  # 该函数负责生成随机目标单词并赋值给current_word
        
        # 先绘制对应长度的下划线,提示单词长度
        word_typer.penup()
        for idx in range(len(current_word)):
            word_typer.goto(30 * idx, -20)
            word_typer.write("_", font=("Arial", 20, "bold"))
        
        while wrong_guesses < 6:
            guess_letter = input("请猜一个字母:").lower()
            # 避免重复猜测
            if guess_letter in letters_guessed:
                print("你已经猜过这个字母了,换一个试试!")
                continue
            letters_guessed.append(guess_letter)
            
            is_correct = False
            # 遍历单词索引与字母,准确定位写入位置
            for idx, letter in enumerate(current_word):
                if guess_letter == letter.lower():
                    is_correct = True
                    word_typer.penup()
                    word_typer.goto(30 * idx, 0)
                    word_typer.write(letter.upper(), font=("Arial", 20, "bold"))
            
            # 判断是否猜错
            if not is_correct:
                wrong_guesses += 1
                draw_hangman()
        
        # 游戏结束判定
        if wrong_guesses >= 6:
            print(f"游戏结束!正确单词是:{current_word}")
        else:
            print("恭喜你猜对了!")
    else:
        print("下次再玩吧!")
修改说明
  • 补充了原代码缺失的变量定义(letters_guessed、current_word)。
  • 游戏开始时先绘制对应长度的下划线,让用户直观了解单词长度。
  • 增加重复猜测检查,避免无效操作。
  • 用enumerate遍历单词的索引和字母,直接通过索引计算位置,确保字母出现在对应下划线上方。
  • 改用is_correct标记是否猜对,修复了原错误的猜错判定逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 12:26:16