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
相关产品推荐
相关产品推荐

