我正在使用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