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

水果打字游戏按键统计与准确率显示功能故障求助

水果主题打字游戏统计显示问题

我正在开发一款水果主题的打字游戏,核心需求是当按下屏幕最后一个字母时,显示正确按键数、总按键数及按键准确率。目前仅能触发最后字母按下的逻辑,但统计信息无法在屏幕上正常显示,怀疑是全局变量使用不当或代码逻辑缺失导致,以下是完整代码及问题分析:


初始设置代码

import turtle as trtl
import random as rand

#-----setup-----]
apple_image = "apple.gif"
pear_image = "pear.gif" # Store the file name of your shape
font_setup = ('Ariel', 20, 'normal')

wn = trtl.Screen()
wn.bgpic("background.gif")
wn.setup(width=1.0, height=1.0)
wn.addshape(apple_image) # Make the screen aware of the new file
wn.addshape(pear_image)

letters = ['A', 'B', 'C', 'D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
curr_letters = []

correct = 0
total = 0

游戏主体逻辑代码

这部分负责字母绘制、水果掉落及重置逻辑:

def draw_fruit(active_fruit, letter):
    vowels = ['A','E','I','O','U']
    if letter in vowels:
        active_fruit.shape(pear_image)
    else:
        active_fruit.shape(apple_image)
    draw_letter(active_fruit, letter)
    wn.update()


def apple_drop(letter):
    index = curr_letters.index(letter)
    curr_letters.pop(index)
    active_apple = apples.pop(index)
    active_apple.clear()
    curr_xcor = active_apple.xcor()
    active_apple.goto(curr_xcor,-150)
    active_apple.hideturtle()
    apple_reset(active_apple)
    apples.append(active_apple)
    

def draw_letter(active_apple, curr_letter):
    global letters, curr_letters
    curr_xcor = active_apple.xcor()
    curr_ycor = active_apple.ycor()
    active_apple.color("white")
    wn.tracer(False)
    active_apple.goto(curr_xcor - 18, curr_ycor - 40)
    active_apple.write(curr_letter, font=("Ariel", 55, 'bold'))
    active_apple.goto(curr_xcor , curr_ycor)
    wn.tracer(True)

def apple_reset(active_apple):
    if len(letters) != 0:
        rand_x = rand.randint(-200,200)
        rand_y = rand.randint(-25,100)
        active_apple.goto(rand_x, rand_y)
        active_apple.showturtle()
        curr_letter = letters.pop(rand.randint(0,len(letters)-1))
        curr_letters.append(curr_letter)
        draw_fruit(active_apple, curr_letter)

统计显示问题代码

这是核心问题区域:按下最后一个字母后,统计信息无任何显示:

def correct_presses():
    global correct, total
    correct_displayer.hideturtle()
    correct_displayer.penup()
    correct_displayer.goto(-250,250)
    correct_displayer.pendown()
    correct_displayer.write("You got",correct,"amount of keypresses!", font=font_setup)

def total_presses():
    global correct, total
    total_displayer.hideturtle()
    total_displayer.penup()
    total_displayer.goto(250,250)
    total_displayer.pendown()
    total_displayer.write("You clicked",total,"amount of times.", font=font_setup)

def accuracy_of_presses():
    global correct, total
    accuracy_displayer.hideturtle()
    accuracy_displayer.penup()
    accuracy_displayer.goto(0,250)
    accuracy_displayer.pendown()
    accuracy_displayer.write("You got",correct//total*100,"percent of your keypresses correct.", font=font_setup)

def end_of_game():
    global correct, total
    if len(curr_letters) == 26:
        correct_presses()
        total_presses()
        accuracy_of_presses()

初始化及收尾代码

apples = []
for apple in range(5):
    apple = trtl.Turtle()
    apple.speed(0)
    apple.penup()
    apple.hideturtle()
    apples.append(apple)
    apple_reset(apple)
print(curr_letters)

correct_displayer = trtl.Turtle()
total_displayer = trtl.Turtle()
accuracy_displayer = trtl.Turtle()

问题修复点

  1. write函数参数错误:write方法仅接受单个字符串参数,需用字符串格式化整合变量,示例修改:

    correct_displayer.write(f"You got {correct} amount of keypresses!", font=font_setup)
    

    同理修改total_presses和accuracy_of_presses中的write语句,注意准确率计算要避免除以0,可加判断:

    accuracy = (correct / total) * 100 if total > 0 else 0
    accuracy_displayer.write(f"You got {accuracy:.1f} percent of your keypresses correct.", font=font_setup)
    
  2. end_of_game触发条件错误:curr_letters是当前屏幕显示的字母列表,按下最后一个字母后它会被移除,此时长度为0,且原letters列表已空,修改条件:

    def end_of_game():
        global correct, total
        if len(letters) == 0 and len(curr_letters) == 0:
            correct_presses()
            total_presses()
            accuracy_of_presses()
    
  3. 显示海龟初始化缺失:给统计用海龟设置初始状态,避免痕迹:

    correct_displayer = trtl.Turtle()
    correct_displayer.hideturtle()
    correct_displayer.penup()
    correct_displayer.color("black")
    
    total_displayer = trtl.Turtle()
    total_displayer.hideturtle()
    total_displayer.penup()
    total_displayer.color("black")
    
    accuracy_displayer = trtl.Turtle()
    accuracy_displayer.hideturtle()
    accuracy_displayer.penup()
    accuracy_displayer.color("black")
    
  4. 按键触发逻辑缺失:绑定键盘事件,更新计数并触发结束检查:

    def handle_keypress(key):
        global correct, total
        total += 1
        key = key.upper()
        if key in curr_letters:
            correct += 1
            apple_drop(key)
        end_of_game()
    
    # 绑定大小写字母按键
    for letter in letters:
        wn.onkeypress(lambda l=letter: handle_keypress(l), letter.lower())
        wn.onkeypress(lambda l=letter: handle_keypress(l), letter.upper())
    
    wn.listen()
    wn.mainloop()
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 02:30:58