这是我的代码:
from turtle import Screen, Turtle
screen = Screen()
screen.setup(600, 600)
screen.bgcolor("black")
screen.title("My Snake Game")
screen.tracer(0)
starting_position =[(0, 0), (-20, 0), (-40, 0)]
segments = []
game_is_on = True
for position in starting_position:
new_segment = Turtle("square")
new_segment.color("white")
new_segment.penup()
new_segment.goto(position)
segments.append(new_segment)
screen.update()
while game_is_on:
for seg in segments:
seg.forward(20)
screen.exitonclick()
我编写了另一个代码来绘制一幅肖像画,但也崩溃了。
我正在尝试构建一个贪吃蛇游戏。我使用
screen.tracer(0)
后,屏幕冻结,我什么也做不了。仅当我强行关闭屏幕时,屏幕才会关闭。
while True:
是一个无限循环。 CPU 试图尽可能快地运行它(原始代码在 Ubuntu 上的top
输出)受到猛烈撞击:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1361630 greg 20 0 43976 22868 11136 R 100.3 0.1 0:08.17 python3
CPU 已达到 100% 最大化。
不要使用
while True:
,而是使用 ontimer
,它以相当一致的速度运行,并在帧之间为进程和 CPU 提供执行其他操作的时间:
from turtle import Screen, Turtle
screen = Screen()
screen.setup(600, 600)
screen.bgcolor("black")
screen.title("My Snake Game")
screen.tracer(0)
starting_position = [(0, 0), (-20, 0), (-40, 0)]
segments = []
game_is_on = True
for position in starting_position:
new_segment = Turtle("square")
new_segment.color("white")
new_segment.penup()
new_segment.goto(position)
segments.append(new_segment)
def tick():
if not game_is_on:
return
for seg in segments:
seg.forward(20)
screen.update()
screen.ontimer(tick, 1000 // 5) # ~5 FPS
tick()
screen.exitonclick() # side benefit: now this is reachable
现在
top
很开心:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1362623 greg 20 0 41924 21300 11520 S 0.3 0.1 0:00.20 python3
另请参阅海龟动画在 python 中速度非常快。答案是相同的,但问题有点不同,因为在那个问题中,代码在
.update()
循环中调用 while True:
,而在这个问题中,.update()
没有在循环中调用