Boids捕食者和障碍物行为

我正在使用Python和Pygame进行一个boids模拟。基本行为已经实现,但现在我试图添加障碍物规避和捕食者行为。到目前为止,我在实现这些行为时遇到了困难。

首先,我试图让猎物boids逃跑,捕食者攻击。为此,我需要找到最近的boid。该如何做呢?

另外,关于障碍物规避,有人能解释一下我该如何让猎物避开但不主动逃离静态障碍物吗?

我的完整代码在这里(github)。我非常希望能得到关于如何实现这两点的任何解释。

谢谢!

编辑:

fucas已经向我展示了如何实现这一点,但现在我又遇到了一个新问题。

对于捕食者和猎物的行为,我现在有以下代码:

    def attack(self, prey_list):        nearest_prey = None        shortest_distance = None            for prey in prey_list:                distX = self.rect.x - prey.rect.x                distY = self.rect.y - prey.rect.y                d = distX*distX+distY*distY                if not shortest_distance or d < shortest_distance:                    shortest_distance = d                    nearest_prey = prey                # do something with nearest_prey, shortest_distance                trajectory_x = self.rect.x - nearest_prey.rect.x                trajectory_y = self.rect.y - nearest_prey.rect.y                self.velocityX -= trajectory_x                self.velocityY -= trajectory_y

而对于猎物,则是这样的代码:

    def defend(self, predator_list):        nearest_predator = None        shortest_distance = None            for predator in predator_list:                distX = self.rect.x - predator.rect.x                distY = self.rect.y - predator.rect.y                d = distX*distX+distY*distY                if not shortest_distance or d < shortest_distance:                    shortest_distance = d                    nearest_predator = predator                # do something with nearest_prey, shortest_distance                trajectory_x = self.rect.x - nearest_predator.rect.x                trajectory_y = self.rect.y - nearest_predator.rect.y                self.velocityX += trajectory_x                self.velocityY += trajectory_y

(这些代码在所有其他规则之后应用)。


回答:

要找到最短距离,你可以这样做

def attack(self, prey_list):    d_list = []    for prey in prey_list:        distX = self.rect.x - prey.rect.x        distY = self.rect.y - prey.rect.y        d = distX*distX+distY*distY        d_list.append(d)    shortest_distance = min(d_list)

要获取最短距离和猎物,你可以这样做

def attack(self, prey_list):    nearest_prey = None    shortest_distance = None    for prey in prey_list:        distX = self.rect.x - prey.rect.x        distY = self.rect.y - prey.rect.y        d = distX*distX+distY*distY        if not shortest_distance or d < shortest_distance            shortest_distance = d            nearest_prey = prey   # do something with nearest_prey, shortest_distance   print nearest_prey, shortest_distance

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注