使用Python的贪吃蛇游戏的碰撞条件不起作用

问题描述 投票:0回答:1

我尝试使用海龟模块在 python 中制作蛇游戏。整体游戏运行良好,但当蛇击中自己的身体时显示游戏结束的条件不起作用。 以下是我用来检查两种类型碰撞(与边界和自身)的函数

def check_collision(自身):

    #to check collision with boundary
    if 298 > self.head.xcor() > -298 and 298 > self.head.ycor() > -298:  

        #to check collision with its body  (s=list containing all parts of snake's body)
        for i in range(self.c):       #c = len(s) - 2
            if self.head.distance(self.s[i]) > 28:   
                f = 1
            else:
                f = 0
    else:
        f = 0

    #returning true or false to continue or terminate the game(false=terminate, true=continue)
    if f == 0:
        return False
    else:
        return True

当蛇撞到边界时,这有效,但当蛇撞到自己的身体时,这不起作用..请帮助 😭😭😭

我本以为当蛇撞到自己的身体时游戏就会显示游戏结束,但游戏仍在继续..

python-3.x turtle-graphics python-turtle
1个回答
0
投票

这并不完全是一个完整的、可重现的示例,但您可能想要类似的东西:

class Snake:
    collision_distance = 28
    screen_size = 298

    # ...
    def in_bounds(self):
        screen_size = self.screen_size
        return (
            -screen_size < self.head.xcor() < screen_size and
            -screen_size < self.head.ycor() < screen_size
        )

    def alive(self):
        dist = self.collision_distance
        return (
            self.in_bounds() and
            all(self.head.distance(x) > dist for x in self.s[:-2])
        )


# usage:
if not snake.alive():
    end_game()

注释/建议:

  • 避免“单次退货”模式。当你想返回时,立即返回,而不是引入更多的变量和控制流。单一返回无缘无故地增加了复杂性,并且似乎是导致错误的原因。具体来说,一旦检测到碰撞,您就设置
    f = 1
    ,然后一旦另一个段不发生碰撞,就有可能将其翻转回 0。如果您必须保留单返回模式,请使用
    break
    退出循环。
  • 避免将
    int
    用作
    bool
    。在过去的 30 多年里,这在 C 中甚至都没有必要,所以它确实是古老且令人困惑的编程风格。
  • 每当您添加类似
    #to check collision with boundary
    的评论时,请将其分解为函数
    check_collision_with_boundary
    并删除评论。
  • 使用
    print()
    调试代码并观察控制流和变量。
  • 避免
    self.c
    。如果它代表
    len(self.s) - 2
    ,请在任何地方都使用
    len(self.s) - 2
    ,因为
    len()
    速度非常快并且包含最新信息。使用
    self.c
    ,你必须记住更新它,更多的状态意味着更复杂的程序,这意味着更多的错误。
  • 避免
    if x: return True; else: return False
    。简直就是
    return x
    ! (或者
    return bool(x)
    如果它不是布尔值,并且您想返回布尔值)
© www.soinside.com 2019 - 2024. All rights reserved.