<p>实施中的问题:</p>
<p>通过使食物成为<code>dot()</code>,你没有办法干净地删除它,而是使用一个圆形的海龟和<code>stamp()</code>,因为它返回一个可以通过<code>clearstamp()</code>干净删除的图章ID。在</p>
<p>为了更好地处理,事件处理程序应该在处理当前事件时阻止新事件。在</p>
<p>您不了解<code>global</code>的用途,您需要它来实现某些功能,但没有您声明的那样频繁。在</p>
<p>你的乌龟移动太快,无法控制。如果你没有代码来控制它在屏幕的边界内,它很容易丢失。在</p>
<p>以下代码尚未完成,但实现了基本功能:您可以移动乌龟,吃了食物就消失了,新的食物出现了,乌龟在吃食物时明显变胖了:</p>
<pre><code>from turtle import Turtle, Screen
from random import randrange
FRAMES_PER_SECOND = 10
WIDTH, HEIGHT = 500, 500
STAMP_SIZE = 20
DOT_SIZE = 10
def turnRight():
screen.onkey(None, 'Right')
turtle.right(15)
screen.onkey(turnRight, 'Right')
def turnLeft():
screen.onkey(None, 'Left')
turtle.left(15)
screen.onkey(turnLeft, 'Left')
def dotGood(food):
x = randrange(DOT_SIZE - WIDTH//2, WIDTH//2 - DOT_SIZE)
y = randrange(DOT_SIZE - HEIGHT//2, HEIGHT//2 - DOT_SIZE)
food.goto(x, y)
return ((x, y), food.stamp())
def eaten(food):
global dot
((x, y), stamp_id) = dot
if abs(turtle.xcor() - x) < DOT_SIZE and abs(turtle.ycor() - y) < DOT_SIZE:
food.clearstamp(stamp_id)
dot = dotGood(food)
return True
return False
def move():
global score
if not moving:
return
if eaten(food):
score += 1
turtle.shapesize((STAMP_SIZE + 5 * score) / STAMP_SIZE)
turtle.forward(1)
screen.ontimer(move, 10 // FRAMES_PER_SECOND)
def start():
global moving
moving = True
move()
def stop():
global moving
moving = False
screen = Screen()
screen.setup(WIDTH, HEIGHT)
screen.bgcolor('black')
turtle = Turtle(shape='turtle')
turtle.speed('slowest')
turtle.color('green')
turtle.penup()
food = Turtle(shape='circle', visible=False)
food.speed('fastest')
food.turtlesize(DOT_SIZE / STAMP_SIZE)
food.color('red')
food.penup()
# globals
moving = False
dot = dotGood(food)
score = 0
screen.onkey(turnRight, 'Right')
screen.onkey(turnLeft, 'Left')
screen.onkey(start, 'Up')
screen.onkey(stop, 'Down')
screen.listen()
screen.mainloop()
</code></pre>
<p>为了使示例更简单,我放弃了边界代码。在</p>