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

Python Turtle入门游戏分数更新异常问题求助

问题分析与修复方案

核心问题

你猜的没错,问题确实出在score变量的作用域上:

  • 在play_game函数里,每次收集到球时都重新定义score = 0,再加2只会得到固定值2,完全无法累积分数。
  • 另外collection_ball_restart函数里重复调用定时器和移动逻辑,会导致逻辑叠加冗余。

修复后的完整代码

import turtle
import random
import math

screen = turtle.Screen()
screen.title("My game by python code")
screen.bgcolor("black")
screen.setup(width=600, height=600)

# 用户控制的气泡
bubble = turtle.Turtle()
bubble.color("red")
bubble.shape("circle")
bubble.penup()
speed = 3

# 可收集的小球
collection_ball = turtle.Turtle()
collection_ball.color("red")
collection_ball.penup()
collection_ball.shape("circle")
collection_ball.shapesize(0.5, 0.5, 0.5)
ball_cor1 = random.randint(30, 280)
ball_cor2 = random.randint(30, 280)
collection_ball.setposition(ball_cor1, ball_cor2)
collection_ball.color("yellow")

# 分数显示
points = turtle.Turtle()
points.color("yellow")
style = ('Courier', 30, 'italic')
points.penup()
points.goto(-200, 250)
points.write("Points: 0", font=style)
points.hideturtle()

# 全局分数变量,用于累积分数
score = 0

# 转向控制
def turn_left():
    bubble.left(90)

def turn_right():
    bubble.right(90)

# 判断是否收集到小球
def collection(a, b):
    return abs(a.xcor() - b.xcor()) < 10 and abs(a.ycor() - b.ycor()) < 20

# 重置小球位置
def collection_ball_restart():
    collection_ball.color("black")
    ball_cor1 = random.randint(30, 280)
    ball_cor2 = random.randint(30, 280)
    collection_ball.goto(ball_cor1, ball_cor2)
    collection_ball.color("yellow")

def play_game():
    global score  # 声明使用全局变量score
    if collection(bubble, collection_ball):
        score += 2  # 直接累积分数
        points.clear()
        points.write("Points: " + str(score), font=style)
        collection_ball_restart()
    
    bubble.forward(speed)
    screen.ontimer(play_game, 10)  # 统一在函数末尾设置定时器,避免叠加

turtle.onkeypress(turn_left, "Left")
turtle.onkeypress(turn_right, "Right")

screen.listen()

play_game()

screen.mainloop()

关键修改点

  • 将score定义为全局变量,在play_game函数中用global声明引用,确保每次收集球时分数持续累积。
  • 移除collection_ball_restart函数中的重复移动和定时器逻辑,统一在play_game函数末尾处理,避免逻辑冲突。
  • 简化play_game分支结构,不管是否收集到球,最后都执行移动和定时器设置,代码更简洁可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 08:55:26