""" 生长模拟器 负责模拟植被的生长、繁殖和死亡过程 """ import time from typing import Dict, Any, List, Optional import math import random class GrowthSimulator: """ 生长模拟器 负责模拟植被的生长、繁殖、死亡和生命周期过程 """ def __init__(self, plugin): """ 初始化生长模拟器 Args: plugin: 植被和生态系统插件实例 """ self.plugin = plugin self.enabled = False self.initialized = False # 生长模型参数 self.growth_models = { 'exponential': { 'name': '指数生长', 'description': '快速增长后趋于稳定', 'formula': 'size = max_size * (1 - exp(-rate * time))' }, 'logistic': { 'name': '逻辑生长', 'description': 'S型生长曲线', 'formula': 'size = max_size / (1 + exp(-rate * (time - midpoint)))' }, 'linear': { 'name': '线性生长', 'description': '恒定速率生长', 'formula': 'size = rate * time' }, 'seasonal': { 'name': '季节性生长', 'description': '受季节影响的生长', 'formula': 'size = base_rate * (1 + amplitude * sin(frequency * time + phase))' } } # 默认生长参数 self.default_growth_params = { 'model': 'logistic', # 默认生长模型 'base_rate': 0.1, # 基础生长速率 'max_size': 1.0, # 最大尺寸 'optimal_conditions': { # 最佳生长条件 'temperature': (15, 30), 'humidity': (50, 80), 'light': (0.6, 1.0), 'nutrients': (0.5, 1.0) }, 'stress_factors': { # 压力因子 'drought_tolerance': 0.3, 'cold_tolerance': 0.2, 'heat_tolerance': 0.2, 'shade_tolerance': 0.4 } } # 繁殖参数 self.reproduction_params = { 'rate': 0.05, # 繁殖速率 'method': 'seeds', # 繁殖方式: 'seeds', 'sprouting', 'spores' 'dispersal_distance': 10.0, # 传播距离 'seasonal_factor': 1.0, # 季节性因子 'competition_radius': 2.0 # 竞争半径 } # 死亡参数 self.mortality_params = { 'natural_lifespan': 365, # 自然寿命(天) 'stress_mortality': 0.01, # 压力导致的死亡率 'disease_factor': 0.05, # 疾病因子 'competition_factor': 0.1 # 竞争因子 } # 环境影响因子 self.environment_impacts = { 'temperature_impact': 1.0, 'humidity_impact': 1.0, 'light_impact': 1.0, 'nutrient_impact': 1.0, 'pollution_impact': 0.0 } # 生长阶段定义 self.growth_stages = { 'seedling': { 'name': '幼苗期', 'size_range': (0.0, 0.2), 'duration': 30, # 天 'vulnerability': 0.8 }, 'juvenile': { 'name': '幼年期', 'size_range': (0.2, 0.5), 'duration': 90, 'vulnerability': 0.5 }, 'mature': { 'name': '成熟期', 'size_range': (0.5, 0.9), 'duration': 180, 'vulnerability': 0.2 }, 'old_age': { 'name': '老年期', 'size_range': (0.9, 1.0), 'duration': 90, 'vulnerability': 0.4 } } # 时间配置 self.time_config = { 'simulation_speed': 1.0, # 模拟速度 'update_interval': 60.0, # 更新间隔(秒) 'last_update': 0.0 } # 统计信息 self.growth_stats = { 'total_growth_cycles': 0, 'successful_reproductions': 0, 'natural_deaths': 0, 'stress_deaths': 0, 'average_growth_rate': 0.0 } print("✓ 生长模拟器已创建") def initialize(self) -> bool: """ 初始化生长模拟器 Returns: 是否初始化成功 """ try: self.initialized = True print("✓ 生长模拟器初始化完成") return True except Exception as e: print(f"✗ 生长模拟器初始化失败: {e}") import traceback traceback.print_exc() return False def enable(self) -> bool: """ 启用生长模拟器 Returns: 是否启用成功 """ try: if not self.initialized: print("✗ 生长模拟器未初始化") return False self.enabled = True print("✓ 生长模拟器已启用") return True except Exception as e: print(f"✗ 生长模拟器启用失败: {e}") import traceback traceback.print_exc() return False def disable(self): """禁用生长模拟器""" try: self.enabled = False print("✓ 生长模拟器已禁用") except Exception as e: print(f"✗ 生长模拟器禁用失败: {e}") import traceback traceback.print_exc() def finalize(self): """清理生长模拟器资源""" try: self.disable() self.initialized = False print("✓ 生长模拟器资源已清理") except Exception as e: print(f"✗ 生长模拟器资源清理失败: {e}") import traceback traceback.print_exc() def update(self, dt: float): """ 更新生长模拟器状态 Args: dt: 时间增量 """ try: if not self.enabled: return # 更新时间 self.time_config['last_update'] += dt # 检查是否需要更新 if self.time_config['last_update'] >= self.time_config['update_interval']: # 执行生长更新 self._update_growth(dt) # 重置更新计时器 self.time_config['last_update'] = 0.0 except Exception as e: print(f"✗ 生长模拟器更新失败: {e}") import traceback traceback.print_exc() def _update_growth(self, dt: float): """ 更新植被生长 Args: dt: 时间增量 """ try: if not self.plugin.vegetation_manager: return # 获取所有植被实例 instances = self.plugin.vegetation_manager.get_all_vegetation_instances() for instance_id, instance in instances.items(): if not instance['alive']: continue # 获取植被类型信息 veg_type = instance['type'] veg_info = self.plugin.vegetation_manager.get_vegetation_info(veg_type) if not veg_info: continue # 计算环境影响 environment_factors = self.plugin.vegetation_manager.get_environment_factors() environmental_modifier = self._calculate_environmental_modifier(veg_type, environment_factors) # 更新年龄 age_increase = dt / 86400 * self.time_config['simulation_speed'] # 转换为天 instance['age'] += age_increase # 计算生长速率 growth_rate = veg_info['growth_rate'] * environmental_modifier # 更新大小 size_increase = growth_rate * dt / 86400 instance['size'] = min(1.0, instance['size'] + size_increase) # 更新健康度 health_change = self._calculate_health_change(instance, veg_info, environment_factors) self.plugin.vegetation_manager.update_vegetation_health(instance_id, health_change) # 检查是否应该繁殖 if random.random() < veg_info['reproduction_rate'] * dt / 3600: # 每小时检查 self._attempt_reproduction(instance_id, instance) # 检查是否应该死亡 if self._should_die(instance, veg_info): self.plugin.vegetation_manager.remove_vegetation_instance(instance_id) self.growth_stats['natural_deaths'] += 1 # 更新统计信息 self.growth_stats['total_growth_cycles'] += 1 except Exception as e: print(f"✗ 生长更新失败: {e}") def _calculate_environmental_modifier(self, veg_type: str, environment_factors: Dict[str, float]) -> float: """ 计算环境影响因子 Args: veg_type: 植被类型 environment_factors: 环境因子 Returns: 环境影响因子 (0.0-2.0) """ try: if veg_type not in self.plugin.vegetation_manager.vegetation_types: return 1.0 veg_info = self.plugin.vegetation_manager.vegetation_types[veg_type] preferred_conditions = veg_info['preferred_conditions'] # 计算各因子的适宜性 temperature_suitability = self._calculate_suitability( environment_factors['temperature'], preferred_conditions['temperature'] ) humidity_suitability = self._calculate_suitability( environment_factors['humidity'], preferred_conditions['humidity'] ) # 综合环境影响因子 modifier = (temperature_suitability + humidity_suitability) / 2.0 # 应用环境影响 for factor, impact in self.environment_impacts.items(): modifier *= (1.0 + impact * 0.1) # 轻微影响 return max(0.0, min(2.0, modifier)) except Exception as e: print(f"✗ 环境影响因子计算失败: {e}") return 1.0 def _calculate_suitability(self, current_value: float, preferred_range: tuple) -> float: """ 计算环境因子适宜性 Args: current_value: 当前值 preferred_range: 偏好范围 Returns: 适宜性评分 (0.0-1.0) """ try: min_val, max_val = preferred_range if min_val <= current_value <= max_val: return 1.0 elif current_value < min_val: if min_val > 0: return max(0.0, 1.0 - (min_val - current_value) / min_val) return 0.0 else: # current_value > max_val if max_val > 0: return max(0.0, 1.0 - (current_value - max_val) / max_val) return 0.0 except Exception as e: print(f"✗ 适宜性计算失败: {e}") return 0.5 def _calculate_health_change(self, instance: Dict[str, Any], veg_info: Dict[str, Any], environment_factors: Dict[str, float]) -> float: """ 计算健康度变化 Args: instance: 植被实例 veg_info: 植被信息 environment_factors: 环境因子 Returns: 健康度变化值 """ try: health_change = 0.0 # 基于年龄的影响 age_factor = self._calculate_age_factor(instance['age'], veg_info['lifespan']) health_change += age_factor # 基于环境的压力 stress_factor = self._calculate_stress_factor(environment_factors, veg_info) health_change += stress_factor # 自然恢复 health_change += 0.001 # 缓慢恢复 return max(-0.1, min(0.1, health_change)) except Exception as e: print(f"✗ 健康度变化计算失败: {e}") return 0.0 def _calculate_age_factor(self, age: float, lifespan: float) -> float: """ 计算年龄因子对健康的影响 Args: age: 年龄 lifespan: 寿命 Returns: 年龄因子 """ try: if lifespan <= 0: return 0.0 age_ratio = age / lifespan # 幼年期增长,成年期稳定,老年期下降 if age_ratio < 0.2: # 幼年期 return 0.02 # 快速增长 elif age_ratio < 0.8: # 成年期 return 0.005 # 缓慢增长 else: # 老年期 return -0.03 # 快速下降 except Exception as e: print(f"✗ 年龄因子计算失败: {e}") return 0.0 def _calculate_stress_factor(self, environment_factors: Dict[str, float], veg_info: Dict[str, Any]) -> float: """ 计算环境压力因子 Args: environment_factors: 环境因子 veg_info: 植被信息 Returns: 压力因子 """ try: stress = 0.0 # 温度压力 temp = environment_factors['temperature'] preferred_temp = veg_info['preferred_conditions']['temperature'] if temp < preferred_temp[0] or temp > preferred_temp[1]: stress -= 0.01 # 湿度压力 humidity = environment_factors['humidity'] preferred_humidity = veg_info['preferred_conditions']['humidity'] if humidity < preferred_humidity[0] or humidity > preferred_humidity[1]: stress -= 0.01 # 光照压力 light = environment_factors['light_level'] # 假设光照适宜范围是0.5-1.0 if light < 0.5: stress -= 0.005 return stress except Exception as e: print(f"✗ 压力因子计算失败: {e}") return 0.0 def _should_die(self, instance: Dict[str, Any], veg_info: Dict[str, Any]) -> bool: """ 判断植被是否应该死亡 Args: instance: 植被实例 veg_info: 植被信息 Returns: 是否应该死亡 """ try: # 年龄导致的死亡 if instance['age'] > veg_info['lifespan']: return True # 健康度过低导致的死亡 if instance['health'] <= 0.0: return True # 压力导致的死亡 stress_death_probability = 0.001 * (1.0 - instance['health']) if random.random() < stress_death_probability: return True return False except Exception as e: print(f"✗ 死亡判断失败: {e}") return False def _attempt_reproduction(self, parent_id: int, parent_instance: Dict[str, Any]): """ 尝试繁殖 Args: parent_id: 父代ID parent_instance: 父代实例 """ try: if not self.plugin.vegetation_manager: return # 检查繁殖条件 if parent_instance['health'] < 0.3: # 健康度过低无法繁殖 return if parent_instance['size'] < 0.2: # 太小无法繁殖 return # 计算繁殖位置(在父代附近) parent_pos = parent_instance['position'] dispersal_distance = self.reproduction_params['dispersal_distance'] angle = random.uniform(0, 2 * math.pi) distance = random.uniform(0, dispersal_distance) new_x = parent_pos[0] + distance * math.cos(angle) new_z = parent_pos[2] + distance * math.sin(angle) # 检查竞争 if self._check_competition(new_x, new_z): return # 创建新实例 new_instance_id = self.plugin.vegetation_manager.create_vegetation_instance( parent_instance['type'], (new_x, parent_pos[1], new_z), initial_age=0.0, initial_health=0.5 ) if new_instance_id >= 0: self.growth_stats['successful_reproductions'] += 1 except Exception as e: print(f"✗ 繁殖尝试失败: {e}") def _check_competition(self, x: float, z: float) -> bool: """ 检查新位置的竞争情况 Args: x: X坐标 z: Z坐标 Returns: 是否存在竞争 """ try: if not self.plugin.vegetation_manager: return False instances = self.plugin.vegetation_manager.get_all_vegetation_instances() competition_radius = self.reproduction_params['competition_radius'] for instance in instances.values(): if not instance['alive']: continue instance_x, _, instance_z = instance['position'] distance = math.sqrt((x - instance_x)**2 + (z - instance_z)**2) if distance < competition_radius: return True # 存在竞争 return False except Exception as e: print(f"✗ 竞争检查失败: {e}") return False def get_growth_models(self) -> Dict[str, Dict[str, str]]: """ 获取生长模型 Returns: 生长模型字典 """ return self.growth_models.copy() def set_growth_model(self, model: str): """ 设置生长模型 Args: model: 模型名称 """ try: if model in self.growth_models: self.default_growth_params['model'] = model print(f"✓ 生长模型设置为: {self.growth_models[model]['name']}") else: print(f"✗ 无效的生长模型: {model}") except Exception as e: print(f"✗ 生长模型设置失败: {e}") def set_growth_parameter(self, parameter: str, value: Any): """ 设置生长参数 Args: parameter: 参数名称 value: 参数值 """ try: if parameter in self.default_growth_params: self.default_growth_params[parameter] = value print(f"✓ 生长参数已设置: {parameter} = {value}") else: print(f"✗ 无效的生长参数: {parameter}") except Exception as e: print(f"✗ 生长参数设置失败: {e}") def get_growth_parameters(self) -> Dict[str, Any]: """ 获取生长参数 Returns: 生长参数字典 """ return self.default_growth_params.copy() def set_reproduction_parameter(self, parameter: str, value: Any): """ 设置繁殖参数 Args: parameter: 参数名称 value: 参数值 """ try: if parameter in self.reproduction_params: self.reproduction_params[parameter] = value print(f"✓ 繁殖参数已设置: {parameter} = {value}") else: print(f"✗ 无效的繁殖参数: {parameter}") except Exception as e: print(f"✗ 繁殖参数设置失败: {e}") def get_reproduction_parameters(self) -> Dict[str, Any]: """ 获取繁殖参数 Returns: 繁殖参数字典 """ return self.reproduction_params.copy() def set_mortality_parameter(self, parameter: str, value: Any): """ 设置死亡参数 Args: parameter: 参数名称 value: 参数值 """ try: if parameter in self.mortality_params: self.mortality_params[parameter] = value print(f"✓ 死亡参数已设置: {parameter} = {value}") else: print(f"✗ 无效的死亡参数: {parameter}") except Exception as e: print(f"✗ 死亡参数设置失败: {e}") def get_mortality_parameters(self) -> Dict[str, Any]: """ 获取死亡参数 Returns: 死亡参数字典 """ return self.mortality_params.copy() def set_environment_impact(self, factor: str, impact: float): """ 设置环境影响因子 Args: factor: 影响因子名称 impact: 影响值 """ try: if factor in self.environment_impacts: self.environment_impacts[factor] = impact print(f"✓ 环境影响因子已设置: {factor} = {impact}") else: print(f"✗ 无效的环境影响因子: {factor}") except Exception as e: print(f"✗ 环境影响因子设置失败: {e}") def get_environment_impacts(self) -> Dict[str, float]: """ 获取环境影响因子 Returns: 环境影响因子字典 """ return self.environment_impacts.copy() def set_time_config(self, config: Dict[str, float]): """ 设置时间配置 Args: config: 时间配置字典 """ try: self.time_config.update(config) print(f"✓ 时间配置已更新: {self.time_config}") except Exception as e: print(f"✗ 时间配置更新失败: {e}") def get_time_config(self) -> Dict[str, float]: """ 获取时间配置 Returns: 时间配置字典 """ return self.time_config.copy() def get_growth_stats(self) -> Dict[str, Any]: """ 获取生长统计信息 Returns: 生长统计信息字典 """ return self.growth_stats.copy() def reset_growth_stats(self): """重置生长统计信息""" try: self.growth_stats = { 'total_growth_cycles': 0, 'successful_reproductions': 0, 'natural_deaths': 0, 'stress_deaths': 0, 'average_growth_rate': 0.0 } print("✓ 生长统计信息已重置") except Exception as e: print(f"✗ 生长统计信息重置失败: {e}") def simulate_seasonal_growth(self, season: str) -> float: """ 模拟季节性生长 Args: season: 季节名称 Returns: 季节性生长修正因子 """ try: seasonal_factors = { 'spring': 1.5, # 春季生长旺盛 'summer': 1.2, # 夏季生长良好 'autumn': 0.8, # 秋季生长减缓 'winter': 0.3 # 冬季生长缓慢 } return seasonal_factors.get(season, 1.0) except Exception as e: print(f"✗ 季节性生长模拟失败: {e}") return 1.0