286 lines
9.0 KiB
Python
286 lines
9.0 KiB
Python
"""
|
|
群体间交互完整示例
|
|
演示如何使用群体间交互功能创建复杂的生态系统
|
|
"""
|
|
|
|
from panda3d.core import Vec3
|
|
import random
|
|
|
|
def create_ecosystem_demo(swarm_manager):
|
|
"""
|
|
创建生态系统演示
|
|
包含多个群体和复杂的交互关系
|
|
"""
|
|
print("创建生态系统演示...")
|
|
|
|
# 清理现有群体
|
|
swarm_manager.cleanup()
|
|
swarm_manager.swarms.clear()
|
|
swarm_manager.swarm_id_counter = 0
|
|
|
|
# 创建生产者群体(植物)
|
|
print("创建生产者群体...")
|
|
producer_swarm = swarm_manager.create_example_swarm(
|
|
swarm_type="昆虫",
|
|
member_count=150,
|
|
position_offset=Vec3(0, 0, 2)
|
|
)
|
|
|
|
# 设置生产者群体为绿色
|
|
for member in producer_swarm['members']:
|
|
if 'node' in member:
|
|
member['node'].setColor(0, 1, 0, 1) # 绿色
|
|
|
|
# 创建初级消费者群体(食草动物)
|
|
print("创建初级消费者群体...")
|
|
primary_consumer_swarm = swarm_manager.create_example_swarm(
|
|
swarm_type="鱼类",
|
|
member_count=60,
|
|
position_offset=Vec3(-10, -10, 8)
|
|
)
|
|
|
|
# 设置初级消费者群体为蓝色
|
|
for member in primary_consumer_swarm['members']:
|
|
if 'node' in member:
|
|
member['node'].setColor(0, 0, 1, 1) # 蓝色
|
|
|
|
# 创建次级消费者群体(食肉动物)
|
|
print("创建次级消费者群体...")
|
|
secondary_consumer_swarm = swarm_manager.create_example_swarm(
|
|
swarm_type="鸟类",
|
|
member_count=20,
|
|
position_offset=Vec3(20, 20, 15)
|
|
)
|
|
|
|
# 设置次级消费者群体为红色
|
|
for member in secondary_consumer_swarm['members']:
|
|
if 'node' in member:
|
|
member['node'].setColor(1, 0, 0, 1) # 红色
|
|
|
|
# 创建分解者群体
|
|
print("创建分解者群体...")
|
|
decomposer_swarm = swarm_manager.create_example_swarm(
|
|
swarm_type="昆虫",
|
|
member_count=80,
|
|
position_offset=Vec3(15, -15, 3)
|
|
)
|
|
|
|
# 设置分解者群体为棕色
|
|
for member in decomposer_swarm['members']:
|
|
if 'node' in member:
|
|
member['node'].setColor(0.5, 0.3, 0, 1) # 棕色
|
|
|
|
# 添加环境元素
|
|
print("添加环境元素...")
|
|
# 添加水源
|
|
swarm_manager.create_obstacle(Vec3(-20, -20, 1), 8.0) # 湖泊
|
|
# 添加食物源
|
|
swarm_manager.create_obstacle(Vec3(10, 10, 4), 3.0) # 果树林
|
|
# 添加栖息地
|
|
swarm_manager.create_obstacle(Vec3(-15, 15, 6), 5.0) # 森林
|
|
|
|
# 设置交互关系
|
|
print("设置交互关系...")
|
|
# 初级消费者吃生产者(竞争关系)
|
|
swarm_manager.interaction_manager.add_interaction(
|
|
primary_consumer_swarm,
|
|
producer_swarm,
|
|
'competitive',
|
|
1.2
|
|
)
|
|
|
|
# 次级消费者捕食初级消费者(捕食者-猎物关系)
|
|
swarm_manager.interaction_manager.add_interaction(
|
|
secondary_consumer_swarm,
|
|
primary_consumer_swarm,
|
|
'predator_prey',
|
|
1.5
|
|
)
|
|
|
|
# 分解者与生产者合作(分解有机物,提供养分)
|
|
swarm_manager.interaction_manager.add_interaction(
|
|
decomposer_swarm,
|
|
producer_swarm,
|
|
'cooperative',
|
|
0.8
|
|
)
|
|
|
|
# 分解者与初级消费者竞争(争夺有机物资源)
|
|
swarm_manager.interaction_manager.add_interaction(
|
|
decomposer_swarm,
|
|
primary_consumer_swarm,
|
|
'competitive',
|
|
0.6
|
|
)
|
|
|
|
# 更新配置
|
|
swarm_manager.config.set("interaction_enabled", True)
|
|
swarm_manager.config.set("interaction_weight", 1.0)
|
|
swarm_manager.config.set("cohesion_weight", 0.8)
|
|
swarm_manager.config.set("separation_weight", 1.2)
|
|
swarm_manager.config.set("alignment_weight", 0.6)
|
|
swarm_manager.config.set("max_speed", 6.0)
|
|
swarm_manager.config.set("perception_radius", 12.0)
|
|
|
|
print("生态系统演示创建完成")
|
|
print(f"共创建了 {len(swarm_manager.swarms)} 个群体")
|
|
print("观察生态系统中不同群体之间的复杂交互行为")
|
|
|
|
def create_battle_demo(swarm_manager):
|
|
"""
|
|
创建群体对战演示
|
|
两个敌对群体之间的竞争
|
|
"""
|
|
print("创建群体对战演示...")
|
|
|
|
# 清理现有群体
|
|
swarm_manager.cleanup()
|
|
swarm_manager.swarms.clear()
|
|
swarm_manager.swarm_id_counter = 0
|
|
|
|
# 创建红方群体
|
|
print("创建红方群体...")
|
|
red_swarm = swarm_manager.create_example_swarm(
|
|
swarm_type="鸟类",
|
|
member_count=50,
|
|
position_offset=Vec3(-25, 0, 15)
|
|
)
|
|
|
|
# 设置红方群体为红色
|
|
for member in red_swarm['members']:
|
|
if 'node' in member:
|
|
member['node'].setColor(1, 0, 0, 1) # 红色
|
|
|
|
# 创建蓝方群体
|
|
print("创建蓝方群体...")
|
|
blue_swarm = swarm_manager.create_example_swarm(
|
|
swarm_type="鱼类",
|
|
member_count=50,
|
|
position_offset=Vec3(25, 0, 10)
|
|
)
|
|
|
|
# 设置蓝方群体为蓝色
|
|
for member in blue_swarm['members']:
|
|
if 'node' in member:
|
|
member['node'].setColor(0, 0, 1, 1) # 蓝色
|
|
|
|
# 在中间添加一个资源点
|
|
resource_position = Vec3(0, 0, 10)
|
|
swarm_manager.create_obstacle(resource_position, 4.0)
|
|
|
|
# 设置敌对关系
|
|
swarm_manager.interaction_manager.add_interaction(
|
|
red_swarm,
|
|
blue_swarm,
|
|
'competitive',
|
|
1.8
|
|
)
|
|
|
|
# 更新配置
|
|
swarm_manager.config.set("interaction_enabled", True)
|
|
swarm_manager.config.set("interaction_weight", 1.5)
|
|
swarm_manager.config.set("cohesion_weight", 1.2)
|
|
swarm_manager.config.set("separation_weight", 1.0)
|
|
swarm_manager.config.set("alignment_weight", 0.8)
|
|
swarm_manager.config.set("max_speed", 8.0)
|
|
swarm_manager.config.set("perception_radius", 15.0)
|
|
|
|
print("群体对战演示创建完成")
|
|
print("观察两个敌对群体如何争夺中心资源")
|
|
|
|
def create_symbiosis_demo(swarm_manager):
|
|
"""
|
|
创建共生关系演示
|
|
两个群体相互依赖,共同生存
|
|
"""
|
|
print("创建共生关系演示...")
|
|
|
|
# 清理现有群体
|
|
swarm_manager.cleanup()
|
|
swarm_manager.swarms.clear()
|
|
swarm_manager.swarm_id_counter = 0
|
|
|
|
# 创建植物群体
|
|
print("创建植物群体...")
|
|
plant_swarm = swarm_manager.create_example_swarm(
|
|
swarm_type="昆虫",
|
|
member_count=100,
|
|
position_offset=Vec3(0, 0, 3)
|
|
)
|
|
|
|
# 设置植物群体为绿色
|
|
for member in plant_swarm['members']:
|
|
if 'node' in member:
|
|
member['node'].setColor(0, 1, 0, 1) # 绿色
|
|
|
|
# 创建传粉者群体
|
|
print("创建传粉者群体...")
|
|
pollinator_swarm = swarm_manager.create_example_swarm(
|
|
swarm_type="鸟类",
|
|
member_count=30,
|
|
position_offset=Vec3(10, 10, 12)
|
|
)
|
|
|
|
# 设置传粉者群体为黄色
|
|
for member in pollinator_swarm['members']:
|
|
if 'node' in member:
|
|
member['node'].setColor(1, 1, 0, 1) # 黄色
|
|
|
|
# 设置共生关系
|
|
swarm_manager.interaction_manager.add_interaction(
|
|
plant_swarm,
|
|
pollinator_swarm,
|
|
'cooperative',
|
|
1.5
|
|
)
|
|
|
|
# 添加多个花丛
|
|
for i in range(5):
|
|
angle = i * 2 * 3.14159 / 5
|
|
x = 20 * math.cos(angle)
|
|
y = 20 * math.sin(angle)
|
|
swarm_manager.create_obstacle(Vec3(x, y, 5), 3.0)
|
|
|
|
# 更新配置
|
|
swarm_manager.config.set("interaction_enabled", True)
|
|
swarm_manager.config.set("interaction_weight", 1.2)
|
|
swarm_manager.config.set("cohesion_weight", 1.0)
|
|
swarm_manager.config.set("separation_weight", 1.3)
|
|
swarm_manager.config.set("alignment_weight", 0.7)
|
|
swarm_manager.config.set("max_speed", 5.0)
|
|
swarm_manager.config.set("perception_radius", 10.0)
|
|
swarm_manager.config.set("wander_enabled", True)
|
|
swarm_manager.config.set("wander_weight", 0.8)
|
|
|
|
print("共生关系演示创建完成")
|
|
print("观察植物和传粉者之间的互利共生关系")
|
|
|
|
def run_interaction_demo(swarm_manager, demo_type="ecosystem"):
|
|
"""
|
|
运行群体间交互演示
|
|
|
|
:param swarm_manager: 群体管理器
|
|
:param demo_type: 演示类型 ("ecosystem", "battle", "symbiosis")
|
|
"""
|
|
import math
|
|
|
|
print("=== 群体间交互演示 ===")
|
|
|
|
if demo_type == "ecosystem":
|
|
create_ecosystem_demo(swarm_manager)
|
|
elif demo_type == "battle":
|
|
create_battle_demo(swarm_manager)
|
|
elif demo_type == "symbiosis":
|
|
create_symbiosis_demo(swarm_manager)
|
|
else:
|
|
print(f"未知的演示类型: {demo_type}")
|
|
return
|
|
|
|
# 启用交互功能
|
|
swarm_manager.config.set("interaction_enabled", True)
|
|
|
|
print(f"\n{demo_type} 演示已启动")
|
|
print("使用控制面板可以调整交互参数")
|
|
print("观察不同群体之间的复杂交互行为")
|
|
|
|
return demo_type |