带乌龟模块的Snake游戏:如何阻止它过快地改变方向



作为Python初学者课程的一部分,我刚刚用turtle模块完成了经典Snake游戏的编码。我注意到一个问题,在课程的解决方案代码中没有提到,所以我想在这里问一个可能的解决方案。

我已经创建了一个名为snake的类,它将蛇的片段(方块)创建为海龟对象。第一个正方形确定了方向,其他部分跟随。这是使蛇移动的方法。Head被设置为索引为0的段列表中的项:

def move(self):
for segment_num in range(len(self.segments) - 1, 0, -1):
new_x = self.segments[segment_num - 1].xcor()
new_y = self.segments[segment_num - 1].ycor()
self.segments[segment_num].goto(new_x, new_y)
self.head.forward(MOVE_DISTANCE)

方向键触发以下方法,这些方法可以改变方向,防止蛇自己移动:

def up(self):
if self.head.heading() != DOWN:
self.head.setheading(UP)
def down(self):
if self.head.heading() != UP:
self.head.setheading(DOWN)
def left(self):
if self.head.heading() != RIGHT:
self.head.setheading(LEFT)
def right(self):
if self.head.heading() != LEFT:
self.head.setheading(RIGHT)

现在的问题是,如果用户非常快速地按下两个方向键(例如,当蛇向右移动时向上和向左),方向在程序有机会在两者之间移动之前就改变了。这允许蛇自己移动,导致游戏结束。

我试着让它在每次改变方向时向前移动,像这样:

def left(self):
if self.head.heading() != RIGHT:
self.head.setheading(LEFT)
self.head.forward(20)

这似乎解决了问题,但产生了另一个问题-蛇的最后一段现在不再是"完美附着"的时刻,当改变方向,但一个位置对角线。

有谁知道一个好的解决方案吗?如果相关的话,我很乐意在此发布我为这款游戏编写的更多代码。

确保所有内容保持同步的一种方法是添加一个"移动队列";存储用户命令。
你将有2个任务,一个用于用户输入,另一个用于snake处理,这将是一个生产者-消费者问题。
一旦你上传你的代码,我可以更新我的答案与一个例子

在你的主游戏循环中有一个time.sleep()调用,对吗?

例如:

delay = 0.1
while True:
time.sleep(delay)
# Your game code

你可以把它放到turn函数中:

def up(self):
if self.head.heading() != DOWN:
time.sleep(delay)
self.head.setheading(UP)
def down(self):
if self.head.heading() != UP:
time.sleep(delay)
self.head.setheading(DOWN)
def left(self):
if self.head.heading() != RIGHT:
time.sleep(delay)
self.head.setheading(LEFT)
def right(self):
if self.head.heading() != LEFT:
time.sleep(delay)
self.head.setheading(RIGHT)

最新更新