【问题标题】:Snake game with turtle module: How to stop it from changing direction too fast带海龟模块的蛇游戏:如何阻止它改变方向过快
【发布时间】:2021-02-13 16:51:55
【问题描述】:

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

我创建了一个名为snake 的类,它将蛇的片段(正方形)创建为海龟对象。第一个方块设置方向,其他部分跟随。这是使蛇移动的方法(self.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)

这似乎确实解决了问题,但又产生了另一个问题 - 蛇的最后一段现在在改变方向时不再“完美连接”,而是在对角线上偏离了一个位置。

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

【问题讨论】:

标签: python turtle-graphics python-turtle


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    例如:

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

    嗯,你可以把它放到转函数中:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多