diff --git a/ThreatSource.Tests/src/Missile/InfraredImagingTerminalGuidedMissileTests.cs b/ThreatSource.Tests/src/Missile/InfraredImagingTerminalGuidedMissileTests.cs index 2481135..5d40544 100644 --- a/ThreatSource.Tests/src/Missile/InfraredImagingTerminalGuidedMissileTests.cs +++ b/ThreatSource.Tests/src/Missile/InfraredImagingTerminalGuidedMissileTests.cs @@ -10,15 +10,12 @@ namespace ThreatSource.Tests.Missile public class InfraredImagingTerminalGuidedMissileTests { private readonly SimulationManager _simulationManager; - private readonly TestSimulationAdapter _testAdapter; private readonly InfraredImagingTerminalGuidedMissile _missile; private readonly MissileProperties _properties; public InfraredImagingTerminalGuidedMissileTests() { _simulationManager = new SimulationManager(); - _testAdapter = new TestSimulationAdapter(_simulationManager); - _simulationManager.SetSimulationAdapter(_testAdapter); _properties = new MissileProperties { @@ -55,44 +52,46 @@ namespace ThreatSource.Tests.Missile [Fact] public void Update_StageTransition_WorksCorrectly() { - // Arrange - var tank = new Tank("target1", new Vector3D(1000, 0, 0), 0, _simulationManager); + // 1. 启动仿真系统 + _simulationManager.StartSimulation(0.1); + + // 2. 发射前检查 + Assert.False(_missile.IsActive); + + // 3. 发射导弹 + _missile.Fire(); + Assert.False(_missile.IsGuidance); + + // 4. 检查实体状态 + var entity = _simulationManager.GetEntityById("missile1"); + Assert.NotNull(entity); + Assert.IsType(entity); + + // 5. 发射阶段 (0.1秒) + _simulationManager.Update(0.1); + Assert.False(_missile.IsGuidance); + + // 6. 巡航阶段 (3秒) + for (int i = 0; i < 30; i++) + { + _simulationManager.Update(0.1); + Assert.False(_missile.IsGuidance); + } + + // 7. 末制导阶段 + var tank = new Tank("target1", new Vector3D(500, 0, 0), 0, _simulationManager); _simulationManager.RegisterEntity("target1", tank); tank.Activate(); - - _missile.Fire(); - _missile.Activate(); - - // Act & Assert - // 发射阶段 - _missile.Update(0.01); - var status = _missile.GetStatus(); - Assert.Contains("Launch", status); - - // 巡航阶段 - for (double time = 0; time < 1.0; time += 0.1) - { - _missile.Update(0.1); - } - status = _missile.GetStatus(); - Assert.Contains("Cruise", status); - - // 末制导阶段 - for (double time = 0; time < 3.0; time += 0.1) - { - tank.Update(0.1); - _missile.Update(0.1); - } - status = _missile.GetStatus(); - Assert.Contains("Terminal", status); + + _simulationManager.Update(0.1); + Assert.True(_missile.IsGuidance); } [Fact] - public void Update_ExceedsMaxFlightTime_SelfDestructs() + public void Update_ExceedsMaxFlightTime_Deactivates() { // Arrange _missile.Fire(); - _missile.Activate(); var maxFlightTime = _properties.MaxFlightTime; // Act @@ -102,15 +101,15 @@ namespace ThreatSource.Tests.Missile } // Assert - Assert.False(_missile.IsActive, "超出最大飞行时间应该自毁"); + string status = _missile.GetStatus(); + Assert.Contains("状态: 非激活", status); } [Fact] - public void Update_ExceedsMaxFlightDistance_SelfDestructs() + public void Update_ExceedsMaxFlightDistance_Deactivates() { // Arrange _missile.Fire(); - _missile.Activate(); var maxDistance = _properties.MaxFlightDistance; var timeToExceedDistance = maxDistance / _properties.InitialSpeed + 1; @@ -121,34 +120,31 @@ namespace ThreatSource.Tests.Missile } // Assert - Assert.False(_missile.IsActive, "超出最大飞行距离应该自毁"); + string status = _missile.GetStatus(); + Assert.Contains("状态: 非激活", status); } [Fact] public void GetStatus_ReturnsCorrectStatus() { + // Arrange + _missile.Fire(); + // Act string status = _missile.GetStatus(); // Assert - var expectedParts = new[] - { - "导弹", - _missile.Id, - "位置", - _missile.Position.ToString(), - "速度", - _missile.Speed.ToString(), - "飞行时间", - _missile.FlightTime.ToString(), - "飞行距离", - _missile.FlightDistance.ToString() - }; - - foreach (var part in expectedParts) - { - Assert.Contains(part, status); - } + Assert.Contains($"导弹 {_missile.Id}", status); + Assert.Contains("状态: 激活", status); + Assert.Contains("位置:", status); + Assert.Contains("速度:", status); + Assert.Contains("速度分量:", status); + Assert.Contains("朝向:", status); + Assert.Contains("飞行时间:", status); + Assert.Contains("飞行距离:", status); + Assert.Contains("发动机工作时间:", status); + Assert.Contains("有引导:", status); + Assert.Contains("失去引导时间:", status); } [Fact] @@ -169,5 +165,33 @@ namespace ThreatSource.Tests.Missile Assert.Equal(_missile.IsGuidance, state.IsGuidance); Assert.Equal(_missile.IsActive, state.IsActive); } + + [Fact] + public void Activate_DeactivateTest() + { + // Arrange & Act + _missile.Activate(); + + // Assert + Assert.True(_missile.IsActive); + + // Act + _missile.Deactivate(); + + // Assert + Assert.False(_missile.IsActive); + } + + [Fact] + public void Fire_InitializesCorrectly() + { + // Act + _missile.Fire(); + + // Assert + Assert.Equal(_properties.InitialSpeed, _missile.Speed); + Assert.Equal(_properties.InitialPosition, _missile.Position); + Assert.Equal(_properties.InitialOrientation, _missile.Orientation); + } } } \ No newline at end of file diff --git a/ThreatSource.Tests/src/Missile/TerminalSensitiveMissileTests.cs b/ThreatSource.Tests/src/Missile/TerminalSensitiveMissileTests.cs index d4dfa02..5b5e411 100644 --- a/ThreatSource.Tests/src/Missile/TerminalSensitiveMissileTests.cs +++ b/ThreatSource.Tests/src/Missile/TerminalSensitiveMissileTests.cs @@ -15,6 +15,7 @@ namespace ThreatSource.Tests.Missile private readonly TestSimulationAdapter _testAdapter; private readonly TerminalSensitiveMissile _missile; private readonly MissileProperties _properties; + private readonly MissileProperties _submunitionProperties; private readonly Tank _tank; public TerminalSensitiveMissileTests(ITestOutputHelper output) @@ -53,7 +54,21 @@ namespace ThreatSource.Tests.Missile Type = MissileType.TerminalSensitiveMissile }; - _missile = new TerminalSensitiveMissile("tank1", _properties, _simulationManager); + _submunitionProperties = new MissileProperties + { + MaxSpeed = 2000, + MaxFlightTime = 60, + MaxFlightDistance = 2000, + MaxAcceleration = 300, + ProportionalNavigationCoefficient = 4, + Mass = 10, + ExplosionRadius = 5, + HitProbability = 0.9, + SelfDestructHeight = 20, + Type = MissileType.TerminalSensitiveSubmunition + }; + + _missile = new TerminalSensitiveMissile("tank1", _properties, _submunitionProperties, 1, _simulationManager); _simulationManager.RegisterEntity("missile1", _missile); } diff --git a/ThreatSource/src/Indicator/LaserDesignator.cs b/ThreatSource/src/Indicator/LaserDesignator.cs index 62b8cb0..c5a68f8 100644 --- a/ThreatSource/src/Indicator/LaserDesignator.cs +++ b/ThreatSource/src/Indicator/LaserDesignator.cs @@ -16,7 +16,7 @@ namespace ThreatSource.Indicator /// - 状态监控 /// 通过激光照射目标实现半主动激光制导 /// - public class LaserDesignator : SimulationElement + public class LaserDesignator : SimulationElement, IIndicator { /// /// 获取或设置目标ID diff --git a/ThreatSource/src/MIssile/BaseMissile.cs b/ThreatSource/src/MIssile/BaseMissile.cs index 92c9927..27bff51 100644 --- a/ThreatSource/src/MIssile/BaseMissile.cs +++ b/ThreatSource/src/MIssile/BaseMissile.cs @@ -270,28 +270,11 @@ namespace ThreatSource.Missile /// /// /// 发射过程: - /// - 激活导弹 /// - 开始计时和计数 /// - 启动发动机 /// - 初始化运动状态 /// public virtual void Fire() - { - OnFire(); - Activate(); - } - - /// - /// 发射导弹 - /// - /// - /// 发射过程: - /// - 激活导弹 - /// - 开始计时和计数 - /// - 启动发动机 - /// - 初始化运动状态 - /// - public virtual void OnFire() { // 子类可以重写此方法来处理发射时的特殊逻辑 } diff --git a/ThreatSource/src/MIssile/InfraredCommandGuidedMissile.cs b/ThreatSource/src/MIssile/InfraredCommandGuidedMissile.cs index d3a8183..c3e6049 100644 --- a/ThreatSource/src/MIssile/InfraredCommandGuidedMissile.cs +++ b/ThreatSource/src/MIssile/InfraredCommandGuidedMissile.cs @@ -107,7 +107,7 @@ namespace ThreatSource.Missile /// - 根据当前阶段更新状态 /// - 调用基类的运动更新 /// - protected override void UpdateMotionState(double deltaTime) + public override void Update(double deltaTime) { // 点亮红外热源 LightInfraredSource(); @@ -122,7 +122,7 @@ namespace ThreatSource.Missile break; } - base.UpdateMotionState(deltaTime); + base.Update(deltaTime); } /// @@ -199,6 +199,20 @@ namespace ThreatSource.Missile SimulationManager.PublishEvent(new InfraredGuidanceMissileLightEvent { RadiationPower = this.RadiationPower, SenderId = this.Id }); } + /// + /// 发射导弹 + /// + /// + /// 发射过程: + /// - 调用基类发射方法 + /// - 设置当前阶段为发射阶段 + /// + public override void Fire() + { + base.Fire(); + currentStage = ICGM_Stage.Launch; + } + /// /// 熄灭红外热源 /// diff --git a/ThreatSource/src/MIssile/InfraredImagingTerminalGuidedMissile.cs b/ThreatSource/src/MIssile/InfraredImagingTerminalGuidedMissile.cs index 6fad821..823197f 100644 --- a/ThreatSource/src/MIssile/InfraredImagingTerminalGuidedMissile.cs +++ b/ThreatSource/src/MIssile/InfraredImagingTerminalGuidedMissile.cs @@ -1,5 +1,6 @@ using ThreatSource.Simulation; using ThreatSource.Guidance; +using ThreatSource.Utils; namespace ThreatSource.Missile { @@ -83,7 +84,6 @@ namespace ThreatSource.Missile public InfraredImagingTerminalGuidedMissile(MissileProperties config, ISimulationManager manager) : base(config, manager) { - currentStage = IRTG_Stage.Launch; guidanceSystem = new InfraredImagingGuidanceSystem( config.Id + "_guidance", config.MaxAcceleration, @@ -104,8 +104,6 @@ namespace ThreatSource.Missile /// public override void Update(double deltaTime) { - base.Update(deltaTime); - switch (currentStage) { case IRTG_Stage.Launch: @@ -118,6 +116,7 @@ namespace ThreatSource.Missile UpdateTerminalGuidanceStage(deltaTime); break; } + base.Update(deltaTime); } /// @@ -133,7 +132,8 @@ namespace ThreatSource.Missile /// private void UpdateLaunchStage(double deltaTime) { - if (FlightTime > 1) // 假设发射阶段持续1秒 + GuidanceAcceleration = Vector3D.Zero; + if (FlightTime > 0.1) // 假设发射阶段持续1秒 { currentStage = IRTG_Stage.Cruise; } @@ -152,7 +152,7 @@ namespace ThreatSource.Missile /// private void UpdateCruiseStage(double deltaTime) { - if (FlightTime > 4) // 假设巡航阶段持续3秒 + if (FlightTime > 3) // 假设巡航阶段持续3秒 { currentStage = IRTG_Stage.TerminalGuidance; } @@ -176,6 +176,20 @@ namespace ThreatSource.Missile GuidanceAcceleration = guidanceSystem.GetGuidanceAcceleration(); } + /// + /// 发射导弹 + /// + /// + /// 发射过程: + /// - 调用基类发射方法 + /// - 设置当前阶段为发射阶段 + /// + public override void Fire() + { + base.Fire(); + currentStage = IRTG_Stage.Launch; + } + /// /// 激活导弹 /// diff --git a/ThreatSource/src/MIssile/LaserBeamRiderMissile.cs b/ThreatSource/src/MIssile/LaserBeamRiderMissile.cs index 6db4c77..a53f1e4 100644 --- a/ThreatSource/src/MIssile/LaserBeamRiderMissile.cs +++ b/ThreatSource/src/MIssile/LaserBeamRiderMissile.cs @@ -72,7 +72,6 @@ namespace ThreatSource.Missile config.MaxAcceleration, config.ProportionalNavigationCoefficient, manager); - currentStage = LBRM_Stage.Launch; } /// @@ -195,6 +194,20 @@ namespace ThreatSource.Missile GuidanceAcceleration = guidanceSystem.GetGuidanceAcceleration(); } + /// + /// 发射导弹 + /// + /// + /// 发射过程: + /// - 调用基类发射方法 + /// - 设置当前阶段为发射阶段 + /// + public override void Fire() + { + base.Fire(); + currentStage = LBRM_Stage.Launch; + } + /// /// 激活导弹 /// diff --git a/ThreatSource/src/MIssile/LaserSemiActiveGuidedMissile.cs b/ThreatSource/src/MIssile/LaserSemiActiveGuidedMissile.cs index 579da41..9275143 100644 --- a/ThreatSource/src/MIssile/LaserSemiActiveGuidedMissile.cs +++ b/ThreatSource/src/MIssile/LaserSemiActiveGuidedMissile.cs @@ -86,7 +86,19 @@ namespace ThreatSource.Missile // 设置制导系统的ParentId属性 guidanceSystem.ParentId = config.Id; - + } + + /// + /// 发射导弹 + /// + /// + /// 发射过程: + /// - 调用基类发射方法 + /// - 设置当前阶段为发射阶段 + /// + public override void Fire() + { + base.Fire(); currentStage = LSAGM_Stage.Launch; } diff --git a/ThreatSource/src/MIssile/MillimeterWaveTerminalGuidedMissile.cs b/ThreatSource/src/MIssile/MillimeterWaveTerminalGuidedMissile.cs index ebebb6a..c17a933 100644 --- a/ThreatSource/src/MIssile/MillimeterWaveTerminalGuidedMissile.cs +++ b/ThreatSource/src/MIssile/MillimeterWaveTerminalGuidedMissile.cs @@ -1,5 +1,6 @@ using ThreatSource.Simulation; using ThreatSource.Guidance; +using ThreatSource.Utils; namespace ThreatSource.Missile { @@ -83,7 +84,6 @@ namespace ThreatSource.Missile public MillimeterWaveTerminalGuidedMissile(MissileProperties properties, ISimulationManager manager) : base(properties, manager) { - currentStage = MWTG_Stage.Launch; guidanceSystem = new MillimeterWaveGuidanceSystem( properties.Id + "_guidance", properties.MaxAcceleration, @@ -105,8 +105,6 @@ namespace ThreatSource.Missile /// public override void Update(double deltaTime) { - base.Update(deltaTime); - switch (currentStage) { case MWTG_Stage.Launch: @@ -119,6 +117,7 @@ namespace ThreatSource.Missile UpdateTerminalGuidanceStage(deltaTime); break; } + base.Update(deltaTime); } /// @@ -134,6 +133,7 @@ namespace ThreatSource.Missile /// private void UpdateLaunchStage(double deltaTime) { + GuidanceAcceleration = Vector3D.Zero; if (FlightTime > 0.1) { currentStage = MWTG_Stage.Cruise; @@ -177,6 +177,20 @@ namespace ThreatSource.Missile GuidanceAcceleration = guidanceSystem.GetGuidanceAcceleration(); } + /// + /// 发射导弹 + /// + /// + /// 发射过程: + /// - 调用基类发射方法 + /// - 设置当前阶段为发射阶段 + /// + public override void Fire() + { + base.Fire(); + currentStage = MWTG_Stage.Launch; + } + /// /// 激活导弹 /// diff --git a/ThreatSource/src/MIssile/TerminalSensitiveMissile.cs b/ThreatSource/src/MIssile/TerminalSensitiveMissile.cs index 91b2777..d3c97ac 100644 --- a/ThreatSource/src/MIssile/TerminalSensitiveMissile.cs +++ b/ThreatSource/src/MIssile/TerminalSensitiveMissile.cs @@ -64,6 +64,29 @@ namespace ThreatSource.Missile /// private const double SeparationRange = 50; + /// + /// 末敏弹的飞行阶段 + /// + /// + /// 枚举定义了末敏弹的飞行阶段 + /// 包括发射阶段、巡航阶段和分离阶段 + /// + private enum TSGM_Stage + { + Launch, // 发射阶段 + Cruise, // 巡航阶段 + Separation // 分离阶段 + } + + /// + /// 导弹当前的飞行阶段 + /// + /// + /// 用于控制导弹的行为状态 + /// 在不同阶段执行不同的更新逻辑 + /// + private TSGM_Stage currentStage; + /// /// 子弹的属性 /// @@ -148,6 +171,20 @@ namespace ThreatSource.Missile } } + /// + /// 发射导弹 + /// + /// + /// 发射过程: + /// - 调用基类发射方法 + /// - 设置当前阶段为发射阶段 + /// + public override void Fire() + { + base.Fire(); + currentStage = TSGM_Stage.Launch; + } + /// /// 更新导弹的状态 /// @@ -168,17 +205,72 @@ namespace ThreatSource.Missile /// public override void Update(double deltaTime) { - base.Update(deltaTime); - - if(IsActive) + switch (currentStage) { - double distanceToSeparationPoint = (separationPoint - Position).Magnitude(); - //距离分离点距离小于50米,则分离 - if (distanceToSeparationPoint <= SeparationRange) - { - PerformSeparation(); - } + case TSGM_Stage.Launch: + UpdateLaunchStage(deltaTime); + break; + case TSGM_Stage.Cruise: + UpdateCruiseStage(deltaTime); + break; + case TSGM_Stage.Separation: + UpdateSeparationStage(deltaTime); + break; } + base.Update(deltaTime); + } + + /// + /// 更新发射阶段的状态 + /// + /// 时间步长,单位:秒 + /// + /// 发射阶段特点: + /// - 不使用制导加速度 + /// - 仅依靠发动机推力 + /// - 持续时间为0.1秒 + /// - 结束后进入巡航阶段 + /// + private void UpdateLaunchStage(double deltaTime) + { + GuidanceAcceleration = Vector3D.Zero; + if (FlightTime > 0.1) + { + currentStage = TSGM_Stage.Cruise; + } + } + + /// + /// 更新巡航阶段的状态 + /// + /// 时间步长,单位:秒 + /// + /// 巡航阶段特点: + /// - 保持稳定飞行 + /// - 不使用制导系统 + /// - 结束后进入分离阶段 + /// + private void UpdateCruiseStage(double deltaTime) + { + double distanceToSeparationPoint = (separationPoint - Position).Magnitude(); + //距离分离点距离小于50米,则分离 + if (distanceToSeparationPoint <= SeparationRange) + { + currentStage = TSGM_Stage.Separation; + } + } + + /// + /// 更新分离阶段的状态 + /// + /// 时间步长,单位:秒 + /// + /// 分离阶段特点: + /// - 分离子弹药 + /// + private void UpdateSeparationStage(double deltaTime) + { + PerformSeparation(); } /// @@ -193,16 +285,6 @@ namespace ThreatSource.Missile /// 5. 将子弹药注册到仿真系统 /// 6. 激活所有子弹药 /// 7. 停用母弹 - /// - /// 子弹药参数设置: - /// - 初始位置:母弹当前位置 - /// - 初始速度:200米/秒 - /// - 最大速度:2000米/秒 - /// - 最大飞行时间:50秒 - /// - 最大飞行距离:1000米 - /// - 最大加速度:50米/秒² - /// - 比例导引系数:3 - /// - 质量:10千克 /// private void PerformSeparation() { @@ -254,6 +336,7 @@ namespace ThreatSource.Missile Debug.WriteLine($"注册末敏弹子弹 {submunitions[i].Id}"); submunitions[i].Activate(); Debug.WriteLine($"激活末敏弹子弹 {submunitions[i].Id}"); + submunitions[i].Fire(); } // 母弹完成任务,可以被移除 diff --git a/ThreatSource/src/MIssile/TerminalSensitiveSubmunition.cs b/ThreatSource/src/MIssile/TerminalSensitiveSubmunition.cs index 6109b76..f2724f4 100644 --- a/ThreatSource/src/MIssile/TerminalSensitiveSubmunition.cs +++ b/ThreatSource/src/MIssile/TerminalSensitiveSubmunition.cs @@ -189,8 +189,9 @@ namespace ThreatSource.Missile /// /// 用于控制螺旋扫描的方向 /// 影响传感器的指向 + /// 初始角度为0(北) /// - private double spiralAngle; + private double spiralAngle = 0; /// /// 扫描方向向量 @@ -273,8 +274,6 @@ namespace ThreatSource.Missile { TargetId = targetId; - currentStage = SubmunitionStage.Separation; - spiralAngle = 0; // 初始化扫描方向为正北 scanDirection = new Vector3D(0, 0, 1).Normalize(); @@ -285,6 +284,19 @@ namespace ThreatSource.Missile rangefinder = new LaserRangefinder(this, 500, 1.06, 100, 0.5); // 激光测距仪,测量距离500米,波长1.06µm,测量频率100Hz,测量精度0.5米 } + /// + /// 发射子弹 + /// + /// + /// 发射过程: + /// - 调用基类发射方法 + /// + public override void Fire() + { + base.Fire(); + currentStage = SubmunitionStage.Separation; + } + /// /// 更新子弹状态 /// @@ -298,8 +310,6 @@ namespace ThreatSource.Missile /// public override void Update(double deltaTime) { - base.Update(deltaTime); - // 更新传感器 infraredDetector.Update(deltaTime); radiometer.Update(deltaTime); @@ -327,6 +337,7 @@ namespace ThreatSource.Missile UpdateAttackStage(deltaTime); break; } + base.Update(deltaTime); } /// diff --git a/ThreatSource/src/Simulation/SimulationManager.cs b/ThreatSource/src/Simulation/SimulationManager.cs index 5ee1fea..add088a 100644 --- a/ThreatSource/src/Simulation/SimulationManager.cs +++ b/ThreatSource/src/Simulation/SimulationManager.cs @@ -422,7 +422,6 @@ namespace ThreatSource.Simulation { if (entities.TryGetValue(id, out var entity)) { - Debug.WriteLine($"[实体管理] 获取实体: {id} ({entity.GetType().Name})"); return entity; } @@ -431,7 +430,6 @@ namespace ThreatSource.Simulation var externalEntity = _simulationAdapter.GetEntity(id); if (externalEntity != null) { - Debug.WriteLine($"[实体管理] 从外部系统获取实体: {id}"); return externalEntity; } } @@ -464,7 +462,6 @@ namespace ThreatSource.Simulation result.Add(typedEntity); } } - Debug.WriteLine($"[实体管理] 获取类型 {typeof(T).Name} 的实体,找到 {result.Count} 个"); return result; } } diff --git a/tools/ComprehensiveMissileSimulator.cs b/tools/ComprehensiveMissileSimulator.cs index c6cf1da..87b767a 100644 --- a/tools/ComprehensiveMissileSimulator.cs +++ b/tools/ComprehensiveMissileSimulator.cs @@ -23,9 +23,9 @@ namespace ThreatSource.Tools.MissileSimulation public event EventHandler? SimulationEnded; private readonly ISimulationManager simulationManager; - private readonly Dictionary missiles; + private readonly Dictionary missiles; private readonly Dictionary targets; - private readonly Dictionary sensors; + private readonly Dictionary indicators; private Dictionary missileActiveStatus; private readonly double timeStep = 0.01; // 时间步长,单位:秒 @@ -35,9 +35,9 @@ namespace ThreatSource.Tools.MissileSimulation public ComprehensiveMissileSimulator() { simulationManager = new SimulationManager(); - missiles = new Dictionary(); + missiles = new Dictionary(); targets = new Dictionary(); - sensors = new Dictionary(); + indicators = new Dictionary(); missileActiveStatus = new Dictionary(); InitializeSimulation(); } @@ -60,13 +60,6 @@ namespace ThreatSource.Tools.MissileSimulation // 添加各种传感器和指示器 AddSensorsAndDesignators(); - - // 初始化所有导弹的激活状态为false - foreach (var missile in missiles.Keys) - { - missileActiveStatus[missile] = false; - missiles[missile].Activate(); // 激活导弹,但不会更新状态 - } } /// @@ -80,7 +73,6 @@ namespace ThreatSource.Tools.MissileSimulation }; targets[targetId] = target; simulationManager.RegisterEntity(targetId, target); - target.Activate(); // 添加这行,激活目标 Console.WriteLine($"添加目标 {targetId},位置:{position}"); } @@ -109,7 +101,7 @@ namespace ThreatSource.Tools.MissileSimulation var missile = new LaserSemiActiveGuidedMissile(properties, simulationManager); missiles["LSGM_1"] = missile; simulationManager.RegisterEntity("LSGM_1", missile); - Console.WriteLine($"注册激光半主动导弹 LSGM_1"); + Console.WriteLine($"注册激光半主动制导导弹 LSGM_1"); } /// @@ -137,7 +129,7 @@ namespace ThreatSource.Tools.MissileSimulation var missile = new LaserBeamRiderMissile(properties, simulationManager); missiles["LBRM_1"] = missile; simulationManager.RegisterEntity("LBRM_1", missile); - Console.WriteLine($"注册激光束骑导弹 LBRM_1"); + Console.WriteLine($"注册激光驾束制导导弹 LBRM_1"); } /// @@ -178,7 +170,7 @@ namespace ThreatSource.Tools.MissileSimulation var missile = new TerminalSensitiveMissile("Tank_1", properties, submunitionProperties, 1, simulationManager); missiles["TSM_1"] = missile; simulationManager.RegisterEntity("TSM_1", missile); - Console.WriteLine($"注册末敏导弹 TSM_1"); + Console.WriteLine($"注册末敏弹 TSM_1"); } /// @@ -206,7 +198,7 @@ namespace ThreatSource.Tools.MissileSimulation var missile = new InfraredCommandGuidedMissile(properties, simulationManager); missiles["ICGM_1"] = missile; simulationManager.RegisterEntity("ICGM_1", missile); - Console.WriteLine($"注册红外指令导弹 ICGM_1"); + Console.WriteLine($"注册红外指令制导导弹 ICGM_1"); } /// @@ -234,7 +226,7 @@ namespace ThreatSource.Tools.MissileSimulation var missile = new InfraredImagingTerminalGuidedMissile(properties, simulationManager); missiles["ITGM_1"] = missile; simulationManager.RegisterEntity("ITGM_1", missile); - Console.WriteLine($"注册红外成像导弹 ITGM_1"); + Console.WriteLine($"注册红外成像末制导导弹 ITGM_1"); } /// @@ -262,7 +254,7 @@ namespace ThreatSource.Tools.MissileSimulation var missile = new MillimeterWaveTerminalGuidedMissile(properties, simulationManager); missiles["MMWG_1"] = missile; simulationManager.RegisterEntity("MMWG_1", missile); - Console.WriteLine($"注册毫米波导弹 MMWG_1"); + Console.WriteLine($"注册毫米波末制导导弹 MMWG_1"); } /// @@ -285,7 +277,7 @@ namespace ThreatSource.Tools.MissileSimulation }, simulationManager ); - sensors["LD_1"] = laserDesignator; + indicators["LD_1"] = laserDesignator; simulationManager.RegisterEntity("LD_1", laserDesignator); Console.WriteLine("注册激光目标指示器 LD_1"); @@ -304,7 +296,7 @@ namespace ThreatSource.Tools.MissileSimulation }, simulationManager ); - sensors["LBR_1"] = laserBeamRider; + indicators["LBR_1"] = laserBeamRider; simulationManager.RegisterEntity("LBR_1", laserBeamRider); Console.WriteLine("注册激光驾束仪 LBR_1"); @@ -324,7 +316,7 @@ namespace ThreatSource.Tools.MissileSimulation }, simulationManager ); - sensors["IT_1"] = infraredTracker; + indicators["IT_1"] = infraredTracker; simulationManager.RegisterEntity("IT_1", infraredTracker); Console.WriteLine("注册红外测角仪 IT_1"); } @@ -346,9 +338,9 @@ namespace ThreatSource.Tools.MissileSimulation missileActiveStatus[id] = false; missiles[id].Deactivate(); } - foreach (var sensor in sensors.Values) + foreach (var indicator in indicators.Values) { - sensor.Deactivate(); + indicator.Deactivate(); } // 激活选中的导弹 @@ -379,22 +371,22 @@ namespace ThreatSource.Tools.MissileSimulation switch (missileId) { case "LSGM_1": // 激光半主动制导导弹 - if (sensors.ContainsKey("LD_1")) + if (indicators.ContainsKey("LD_1")) { - sensors["LD_1"].Activate(); + indicators["LD_1"].Activate(); } break; case "LBRM_1": // 激光驾束制导导弹 - if (sensors.ContainsKey("LBR_1")) + if (indicators.ContainsKey("LBR_1")) { - sensors["LBR_1"].Activate(); + indicators["LBR_1"].Activate(); } break; case "ICGM_1": // 红外指令制导导弹 case "ITGM_1": // 红外成像末制导导弹 - if (sensors.ContainsKey("IT_1")) + if (indicators.ContainsKey("IT_1")) { - sensors["IT_1"].Activate(); + indicators["IT_1"].Activate(); } break; case "TSM_1": // 末敏弹 @@ -496,17 +488,10 @@ namespace ThreatSource.Tools.MissileSimulation { if (missileActiveStatus[missile.Id]) { - missile.Activate(); + missile.Fire(); } } - // 确保所有目标都处于激活状态 - foreach (var target in targets.Values) - { - target.Activate(); - Console.WriteLine($"激活目标:{target.Id}"); - } - // 打印仿真开始前的组件状态 PrintSimulationRegisteredComponents(); @@ -565,7 +550,7 @@ namespace ThreatSource.Tools.MissileSimulation } // 打印激活的传感器状态 - foreach (var sensor in sensors.Values.Where(s => s.IsActive)) + foreach (var sensor in indicators.Values.Where(s => s.IsActive)) { Console.WriteLine("\n========== 传感器状态 =========="); Console.WriteLine(sensor.GetStatus()); @@ -624,7 +609,7 @@ namespace ThreatSource.Tools.MissileSimulation // 重置所有传感器状态 var activeSensors = simulationManager.GetEntitiesByType() - .Where(e => sensors.ContainsValue(e)); + .Where(e => indicators.ContainsValue(e)); foreach (var sensor in activeSensors) { sensor.Deactivate(); @@ -674,11 +659,11 @@ namespace ThreatSource.Tools.MissileSimulation /// /// 获取当前活动的传感器列表 /// - public (string Id, string Name, bool IsActive)[] GetActiveSensors() + public (string Id, string Name, bool IsActive)[] GetActiveIndicators() { - return sensors.Select(s => ( + return indicators.Select(s => ( s.Value.Id, - GetSensorDisplayName(s.Value), + GetIndicatorDisplayName(s.Value), s.Value.IsActive )).ToArray(); } @@ -686,30 +671,30 @@ namespace ThreatSource.Tools.MissileSimulation /// /// 获取传感器的显示名称 /// - private string GetSensorDisplayName(SimulationElement sensor) + private string GetIndicatorDisplayName(SimulationElement indicator) { - return sensor switch + return indicator switch { LaserDesignator _ => "激光目标指示器", LaserBeamRider _ => "激光驾束仪", InfraredTracker _ => "红外测角仪", - _ => sensor.Id + _ => indicator.Id }; } /// /// 切换传感器的激活状态 /// - public void ToggleSensor(string sensorId) + public void ToggleIndicator(string indicatorId) { - if (sensors.TryGetValue(sensorId, out var sensor)) + if (indicators.TryGetValue(indicatorId, out var indicator)) { - if (sensor.IsActive) - sensor.Deactivate(); + if (indicator.IsActive) + indicator.Deactivate(); else - sensor.Activate(); + indicator.Activate(); - Console.WriteLine($"传感器 {GetSensorDisplayName(sensor)} 已{(sensor.IsActive ? "激活" : "停用")}"); + Console.WriteLine($"指示器 {GetIndicatorDisplayName(indicator)} 已{(indicator.IsActive ? "激活" : "停用")}"); } } } diff --git a/tools/Program.cs b/tools/Program.cs index 63302fa..3b78ad5 100644 --- a/tools/Program.cs +++ b/tools/Program.cs @@ -142,10 +142,10 @@ namespace ThreatSource.Tools.MissileSimulation { Console.WriteLine("\n第二步:配置传感器和指示器"); Console.WriteLine("当前传感器状态:"); - var sensors = simulator.GetActiveSensors(); - for (int i = 0; i < sensors.Length; i++) + var indicators = simulator.GetActiveIndicators(); + for (int i = 0; i < indicators.Length; i++) { - Console.WriteLine($" {i + 1}. {sensors[i].Name} [{(sensors[i].IsActive ? "激活" : "未激活")}]"); + Console.WriteLine($" {i + 1}. {indicators[i].Name} [{(indicators[i].IsActive ? "激活" : "未激活")}]"); } Console.WriteLine(" 0. 继续下一步"); Console.WriteLine(" exit. 退出程序"); @@ -157,9 +157,9 @@ namespace ThreatSource.Tools.MissileSimulation if (int.TryParse(input, out int choice)) { if (choice == 0) return true; - if (choice >= 1 && choice <= sensors.Length) + if (choice >= 1 && choice <= indicators.Length) { - simulator.ToggleSensor(sensors[choice - 1].Id); + simulator.ToggleIndicator(indicators[choice - 1].Id); continue; } }