我必须模拟两个玩家之间的战斗。它可以持续一到六轮。攻击者可以拥有 13 种不同类型的宇宙飞船,防御者 - 额外的 9 种防御结构。问题是我要将模拟限制在每侧 1kk 个单位,所以它会非常大。
每个单元都将成为以下类的实例
class Unit()
{
UInt16 id; // unit type
Int32 structuralIntegrity;
Int16 shieldPower;
public Unit(UInt16 unitType, Int16 playerId)
{
id = unitType;
switch (playerId)
{
case 0: {structuralIntegrity = player0BaseStructuralIntegrity[id]; shieldPower = player0BaseshieldPower[id];}
case 1: {structuralIntegrity = player1BaseStructuralIntegrity[id]; shieldPower = player1BaseshieldPower[id];}
}
}
};
用于不变值的数组。
player1技术
- 装甲技术
- 盾牌技术
- 武器技术
player2技术
- 装甲技术
- 盾牌技术
- 武器技术
player1Base结构完整性
等于默认*装甲技术
等等...
然后我会用每个玩家单位传播两个列表。
一轮是这样的:
- 选择随机单位//实际上我认为它是否随机并不重要
- 选择随机目标
- 如果武器威力低于目标护盾的 1%,则不会造成伤害
- 目标的护盾吸收伤害,其余部分用于目标的结构完整性
- 如果目标的结构完整性低于其初始值的 30%,则它有 1-structuralIntegrity/baseStructuralIntegrity 爆炸的概率
- 检查快速射击的概率,如果命中则转到步骤 2
- 进入步骤 1 直到所有单位攻击 | 笔记!被摧毁的船只 - 结构完整性低于 1 的船只仍然可以受到攻击。编辑:他们也可以攻击这一轮
- 对对手重复步骤 1-7。
- 移除被摧毁的船只
- 恢复盾牌
战斗持续六轮或直到一方被击败。
让我们考虑一个由 100 架轰炸机和 200 架火箭发射器组成的攻击机队。轰炸机在攻击火箭发射器后有 95% 的几率再次开火。所以每个轰炸机平均会攻击 96 次,给我们 9600 次攻击。假设防守者很幸运,一个火箭发射器幸存了下来。他还摧毁了10架轰炸机。现在我们有 90 架轰炸机攻击一个火箭发射器,又给了我们 8640 次射击。想想 100k 轰炸机和 200k 火箭发射器。
您对如何改进这种模拟(性能)有什么建议吗?我应该运行多少次才能获得可信的平均结果?
更新
我想我可能会坚持我的模拟,因为即使你找到了一个数学解决方案,由于我目前的教育水平,我也不会理解它。
有人询问更多细节。
对应科技每升一级,初始值增加10%,但对模拟来说并不重要,所以假设双方玩家的科技都是0。让我们考虑一个由 1 个巡洋舰对 2 个导弹发射器 + 1 个重型激光器组成的攻击舰队。巡洋舰有 2700 结构完整性、50 盾和 400 武器。我会把它写成 2700:50:400
- 巡洋舰 2700:50:400 x1
对比 - 导弹发射器 200:20:80 x2
- 重型激光 800:100:250 x1
导弹发射器和重型激光没有快速射击。巡洋舰对重型激光的快速射击为 0,对导弹发射器的快速射击为 10,使其在攻击导弹发射器后再次开火的概率为(10-1)/10= 0.90 。
一种可能的结果可能如下:
第1轮
攻击者向防御者开火
巡洋舰以 2700:50:400 向 Missile Laucher 以 200:20:80 开火;结果是 Missile Laucher 与 -180:0:80
熊熊大火:
- 巡洋舰对导弹发射器有快速射击。
- 骰子为 0.62,与 0.90 相比:Cruiser 再次出手。
巡洋舰以 2700:50:400 向 Missile Laucher 以 200:20:80 开火;结果是 -180:0:80 的导弹发射器
熊熊大火:
- 巡洋舰对导弹发射器有快速射击。
- 骰子为 0.09,与 0.90 相比:Cruiser 再次出手。
巡洋舰 2700:50:400 以 -180:0:80 向导弹发射器开火;结果是 -580:0:80 的导弹发射器
熊熊大火:
- 巡洋舰对导弹发射器有快速射击。
- 骰子为 0.83,与 0.90 相比:Cruiser 再次出手。
巡洋舰以 2700:50:400 向重型激光发射 800:100:250;结果是 500:0:250 的重型激光
熊熊大火:
- 巡洋舰对重型激光没有快速射击。
防御者向攻击者开火
Missile Laucher -580:0:80 以 2700:50:400 向 Cruiser 开火;结果是 2670:0:400 的 Cruiser
Missile Laucher -180:0:80 以 2670:0:400 向 Cruiser 开火;结果是 2590:0:400 的 Cruiser
500:0:250 的重型激光以 2590:0:400 向巡洋舰射击;结果是 2340:0:400 的 Cruiser
移除船只并恢复护盾
巡洋舰仍然有完整性,恢复它的盾牌。
Missile Laucher 失去了所有的完整性,将其从战斗中移除。
Missile Laucher 失去了所有的完整性,将其从战斗中移除。
重激光仍有完整性,恢复它的护盾。
第二轮
攻击者向防御者开火
巡洋舰以 2340:50:400 向重型激光发射 500:100:250;结果是 200:0:250 的重型激光
- 爆炸概率为 75.00%(1-200/800):骰子值 0.30 与 0.75 相比:单位爆炸。
结果是 9:0:250 的重型激光
熊熊大火:
- 巡洋舰对重型激光没有快速射击。
防御者向攻击者开火
9:0:250 的重型激光以 2340:50:400 向 Cruiser 开火;结果是 2140:0:400 的 Cruiser
移除船只并恢复盾牌。
巡洋舰仍然有完整性,恢复它的盾牌。
重型激光失去了所有完整性,将其从战斗中移除。
战斗在2回合后以攻击者获胜而结束。