设计一个位置随机的八个智能体追逐一个移动的目标,最终智能体能以固定形状成功围捕目标的python程序,要求智能体之间不能碰撞,绘制出追逐和围捕目标的全过程
时间: 2023-04-08 14:02:49 浏览: 148
基于python实现目标运动与目标跟踪
以下是一个可能的 Python 程序,实现了八个智能体追逐一个移动的目标,并最终以固定形状成功围捕目标的过程。程序使用了 Pygame 库来绘制图形界面,可以直观地展示追逐和围捕的全过程。
```python
import pygame
import random
# 定义常量
WIDTH = 800
HEIGHT = 600
AGENT_RADIUS = 10
TARGET_RADIUS = 20
AGENT_SPEED = 5
TARGET_SPEED = 3
NUM_AGENTS = 8
TARGET_POS = (WIDTH // 2, HEIGHT // 2)
# 初始化 Pygame
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Chasing Game")
# 定义智能体类
class Agent:
def __init__(self, pos):
self.pos = pos
self.vel = (0, 0)
self.color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
def update(self, target_pos, agents):
# 计算与目标的距离和方向
dx = target_pos[0] - self.pos[0]
dy = target_pos[1] - self.pos[1]
dist = (dx ** 2 + dy ** 2) ** 0.5
if dist > AGENT_RADIUS + TARGET_RADIUS:
dir_x = dx / dist
dir_y = dy / dist
# 计算与其他智能体的距离和方向
sep_x = 0
sep_y = 0
for agent in agents:
if agent != self:
dx = agent.pos[0] - self.pos[0]
dy = agent.pos[1] - self.pos[1]
dist = (dx ** 2 + dy ** 2) ** 0.5
if dist < AGENT_RADIUS * 2:
sep_x -= dx / dist
sep_y -= dy / dist
# 计算速度
self.vel = (dir_x + sep_x, dir_y + sep_y)
speed = (self.vel[0] ** 2 + self.vel[1] ** 2) ** 0.5
if speed > AGENT_SPEED:
self.vel = (self.vel[0] * AGENT_SPEED / speed, self.vel[1] * AGENT_SPEED / speed)
else:
self.vel = (0, 0)
def move(self):
self.pos = (self.pos[0] + self.vel[0], self.pos[1] + self.vel[1])
def draw(self, screen):
pygame.draw.circle(screen, self.color, (int(self.pos[0]), int(self.pos[1])), AGENT_RADIUS)
# 定义目标类
class Target:
def __init__(self, pos):
self.pos = pos
self.vel = (random.uniform(-1, 1) * TARGET_SPEED, random.uniform(-1, 1) * TARGET_SPEED)
self.color = (255, 0, 0)
def update(self):
# 检查是否碰到边界
if self.pos[0] < TARGET_RADIUS or self.pos[0] > WIDTH - TARGET_RADIUS:
self.vel = (-self.vel[0], self.vel[1])
if self.pos[1] < TARGET_RADIUS or self.pos[1] > HEIGHT - TARGET_RADIUS:
self.vel = (self.vel[0], -self.vel[1])
# 更新位置
self.pos = (self.pos[0] + self.vel[0], self.pos[1] + self.vel[1])
def draw(self, screen):
pygame.draw.circle(screen, self.color, (int(self.pos[0]), int(self.pos[1])), TARGET_RADIUS)
# 创建智能体和目标
agents = [Agent((random.randint(0, WIDTH), random.randint(0, HEIGHT))) for i in range(NUM_AGENTS)]
target = Target(TARGET_POS)
# 主循环
running = True
while running:
# 处理事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 更新智能体和目标
target.update()
for agent in agents:
agent.update(target.pos, agents)
agent.move()
# 绘制图形界面
screen.fill((255, 255, 255))
target.draw(screen)
for agent in agents:
agent.draw(screen)
pygame.display.flip()
# 检查是否成功围捕目标
if all(abs(agent.pos[0] - TARGET_POS[0]) < AGENT_RADIUS * 2 and abs(agent.pos[1] - TARGET_POS[1]) < AGENT_RADIUS * 2 for agent in agents):
running = False
# 显示固定形状
screen.fill((255, 255, 255))
pygame.draw.rect(screen, (0, 0, 0), (WIDTH // 4, HEIGHT // 4, WIDTH // 2, HEIGHT // 2), 5)
pygame.display.flip()
# 等待退出
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
```
注意:这个程序并不是唯一的实现方式,也不一定是最优的实现方式。它只是一个可能的解决方案,供参考。
阅读全文