在我的游戏中,我有一群鱼(10)。每条鱼都有一条视线(它们前面有一个弧形物体)。有鲨鱼,它们是掠食者(它们随机地在房间里移动)。每条鱼在开始时被分配一个情报号码。当一条鲨鱼进入一条鱼的视线时,我希望只有当他的智力数量大于随机生成的数字时,鱼才会改变方向(或者至少在最佳方向上离开)。
问题在于,当我尝试实现这个并且鲨鱼进入鱼的视线时,pygame会一直检测到碰撞,因此python会不断生成一个随机数。例如,一条鱼可能具有非常低的智力水平,但仍然很有可能从鲨鱼中逃脱,因为python一直在检测碰撞,并且它有很多尝试通过该条。就那个例子而言,当鲨鱼在视线中时,我实际上希望鱼很可能不会改变方向。
理想情况下,我希望python能够一次性检测到碰撞,当然,如果鲨鱼再次在另一个时间内再次通过视线,则会再次检测到它。
这是我的代码,不知道它有多大帮助:
class RedFish(pygame.sprite.Sprite):
def __init__(self, newDNA):
pygame.sprite.Sprite.__init__(self)
self.direction = random.uniform(0, math.pi*2)
self.speed = 2
self.intelligence = 100
def update(self):
self.rect.x -= math.sin(self.direction) * self.speed
self.rect.y -= math.cos(self.direction) * self.speed
for shark in sharks:
if pygame.sprite.collide_mask(arcsList[self.arcIndex], shark):
temp = random.randrange(400)
if (temp < self.intelligence):
self.direction = self.direction*-1
谢谢!
答案 0 :(得分:2)
你可以存放鱼和#34;&#34;并在更新循环的每次迭代中进行比较。
注意:我故意遗漏了很多计算代码,以使这个示例尽可能简单。
class RedFish(pygame.sprite.Sprite):
def __init__(self, newDNA):
self.last_shark_seen = None
def update(self):
# track how many sharks we have collisions with
shark_collisions = 0
for shark in sharks:
if pygame.sprite.collide_mask(arcsList[self.arcIndex], shark):
shark_collisions += 1
if shark != self.last_shark_seen:
self.last_shark_seen = shark
# calculate new direction here
break
# no collisions means no sharks seen, reset the fish's memory
self.last_shark_seen = None
答案 1 :(得分:1)
你需要追踪鲨鱼何时被看到,或者看到了哪条鲨鱼。基本上更新碰撞检测器十分之一(或12或100)更新位置。
或者,一旦鱼没有看到鲨鱼,它就注定了,所以你可以将该列表添加到它看到的鲨鱼列表中并且未能避免(如果它看到另一条鲨鱼),那么当你更新时你可以只是通过列表说,为了改变方向,一条鱼必须打败随机数发生器,也没有输给鲨鱼
你可以尝试不同的随机分布,也许是左倾的东西,所以即使愚蠢的鱼有多次尝试,合并的概率仍然很低
然后,如果你试图模拟“真正的”鱼类,有些人可能会做出反应较慢,但他们仍然有多次机会。
也许你可以缩短弧线?