C#巨杀机器人小游戏FireLaser伤害计算逻辑异常排查
C# GiantKillerRobotMiniGame 中FireLaser伤害逻辑失效修复
现有代码的核心问题
你的伤害逻辑不生效是语法错误、逻辑疏漏叠加导致的,问题点如下:
- 静态引用错误:
(int)Robot.Intens是尝试访问Robot类的静态字段,但Intens是Robot的实例字段,写法本身不符合C#语法规则 - 无效方法调用:
var cth = this Target();既缺少方法调用的()运算符,也没有在Robot类中定义Target()方法,代码根本无法通过编译 - 扣血逻辑完全未落地:你计算完
cth.Health - Damage后,立刻把原始的cth.Health值重新赋值给了局部变量Health,等于计算步骤完全作废;且全程没有把扣减后的血量回写到目标实例的Health字段上,目标血量永远不会变化 - 类字段命名不一致:最初定义Robot类的生命字段是
RobotHealth,实际类里写的是HealthRobot,后续维护很容易出现赋值错误 - 冗余字段:Target类里定义的私有
Damage字段完全没有使用,伤害值属于机器人激光的属性,不需要存在Target类中 - 逻辑缺失:FireLaser方法没有接收攻击目标的入口,根本不知道要对哪个对象造成伤害
修正后可运行代码
1. 保留原有Intensity枚举定义
enum Intensity { Low = 10, Medium = 20, High = 30, Kill = 40, }
2. 修正Robot类
internal class Robot { // 统一字段命名 int RobotHealth; public Intensity Intens; public bool isActive() { return RobotHealth > 0; } public Robot(int healthRobot, Intensity intensity) { RobotHealth = healthRobot; Intens = intensity; } /// <summary> /// 发射激光攻击指定目标 /// </summary> /// <param name="target">要攻击的目标实例</param> /// <returns>目标剩余血量</returns> public int FireLaser(Target target) { // 读取当前机器人实例的激光伤害值 int damage = (int)this.Intens; // 扣血后血量最低为0,避免出现负数血量的逻辑异常 target.Health = Math.Max(0, target.Health - damage); return target.Health; } }
3. 修正Target类
public class Target { public int Health; public bool CurrentTargetisAlive() { return Health > 0; } }
4. Planets类无需修改,保持原有实现即可
public class Planets { public Target[] Habitant; public Planets(Target[] habitant) { this.Habitant = habitant; } }
核心玩法逻辑调用示例
// 初始化星球:3个居民,血量分别为45、70、25 Target[] habitants = new Target[] { new Target(){ Health = 45 }, new Target(){ Health = 70 }, new Target(){ Health = 25 } }; Planets earth = new Planets(habitants); // 初始化机器人:自身血量100,激光强度为High(30点伤害) Robot giantKiller = new Robot(100, Intensity.High); // 遍历所有居民攻击,直到全部目标死亡 foreach (var person in earth.Habitant) { while (person.CurrentTargetisAlive() && giantKiller.isActive()) { int hpLeft = giantKiller.FireLaser(person); Console.WriteLine($"命中目标,目标剩余血量:{hpLeft}"); } } Console.WriteLine("星球所有居民已被消灭");
内容的提问来源于stack exchange,提问作者Costea Raul
相关产品推荐
相关产品推荐

