我可以使用什么algorithm处理两种types的HP,其中一种可能是未定义的?

在我的游戏中,每个单位有两种types的HP:硬和软。 软代表单位的人的一部分,而硬代表任何机械的。 例如,一个普通的步枪手将有100个软硬件,0个硬盘。 另一个例子是坦克有100软,1000硬(平衡)。

现在,我面临的问题是这样一个事实,即这些types的HP中的一个对于单位死亡应该是足够的 – 如果没有其驱动器,坦克就不能工作,并且需要它的齿轮,螺母和螺栓才能正常工作。

起初我是想为一个单位设置软硬值,但是对于硬HP却留下了一个未定义的值,比如步兵,但是当武器伤害一个单位时,这成为一个问题:武器会伤害到硬柔软的。 检查未定义的值也成为一个问题,因为许多其他的事情也会影响惠普,因此需要在许多地方进行这种检查,这在我看来是非常多余的。 我想到的另外一件事情就是把步兵的HP设置得exception高,直到“永远”不会达到0,但是我相信这肯定会在以后咬我。 我可以用其他方法轻易地克服这个障碍,但是我会喜欢一些新鲜的眼光,以防有什么明显的解决办法。

有什么建议么? 伪代码将不胜感激。

congusbongus的解决scheme是好的,但我会建议一个可扩展到更多HPtypes的解决scheme。 这种方法的优点是你可以随时轻易地增加更多的伤害types,而不需要编辑任何不应该拥有它们的旧单位,例如只影响高科技单位的EMP伤害或只影响灵能的PSI伤害单位。

使用键HpType和值int ,将单位的HP值作为关联数组(在某些编程语言中也称为“Dictionary”)实现。 该arrays可以有任意数量的条目(包括没有,这将是一个完全无懈可击的单位)。 定义文件可能如下所示:

 units = [ { name: "Rifleman", HP: { soft: 100 }, }, { name: "Psyker", HP: { soft: 80 psi: 100 } }, { name: "Tank", HP: { soft: 100 hard: 1000 }, }, { name: "Anti-Grav Laser Tank", HP: { soft: 100 hard: 1500 emp: 50 } }, { name: "Psi Cyber Mecha Bot 3000", HP: { soft: 80 hard: 3000 emp: 100 psi: 100 } } ] 

降低一个单元的HP量的方法需要两个参数, HpTypevalue 。 该方法首先检查单位是否实际上在HP关联arrays中具有用于该损伤types的条目。 当它没有find一个,它什么都不做。 当它find一个相应的条目时,这个值是递减的,当这个单位零或者零后,这个单位被销毁:

 function reduceHpIfApplicable(HpType type, int amount) { if (this.HP[type] != null) { this.HP[type] -= amount; if (this.HP[type] <= 0) { this.isAlive = false; } } } 

tl; dr:这是“未定义”解决scheme的变体。

对于惠普而言,“未定义”或者“特殊”的价值是一个很好的select,但是只要你把它抽象出来,你不用担心在很多地方要检查它。

有很多方法可以做到这一点,但是根据你的语言,更抽象的方法之一就是使用不同的策略 ,并用它来处理你想从惠普对象中所有的东西,不用担心它是如何表示的 – 数字或其他。 在你的例子中,你可能想要damage() ,或者问一下isDead() 。 所以关注这些接口:

 class HP { // private; don't worry about this if you're not the HP class int value; // used for things like the UI func getString() { return value; } func damage(amount) { value -= amount; } func isDead() { return value <= 0; } } 

然后你有一个“未定义”惠普的特殊类:

 class UndefinedHP : HP { // in your UI you may want to handle this like display a grayed-out bar func getString() { return "undefined"; } // does nothing func damage(amount) { } // always alive func isDead() { return false; } } 

然后你的单位可能看起来像:

 units = [ {name: "rifleman", softHP: HP(100), hardHP: UndefinedHP()}, {name: "tank", softHP: HP(100), hardHP: HP(100)} ] 

然后你对这些单位造成硬性/软性伤害,事情就会起作用 – 步枪手永远不会因为严重的伤害而死亡,等等。