我尝试使用海龟模块在 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
当蛇撞到边界时,这有效,但当蛇撞到自己的身体时,这不起作用..请帮助 😭😭😭
我本以为当蛇撞到自己的身体时游戏就会显示游戏结束,但游戏仍在继续..
这并不完全是一个完整的、可重现的示例,但您可能想要类似的东西:
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)
如果它不是布尔值,并且您想返回布尔值)