使用golang实现的投石车AI对战平台。
sling catapult trebuchet
多AI对战,3D战场,地面有起伏,地面摩擦系数有变化。
有固定重力加速度,有空气阻力,风向和风力有变化。
战车有左右2个动力轮,可独立施加一个正向或反向力,使其正向反向转动,从而控制车体前进、后退和转向。
炮台的方向独立于战车方向控制,当车转向时炮台相对于地面不转动。炮台可转动和调整仰角,不可以水平升降。
炮弹通过纯机械装置发射,方向和速度可控,经过抛物线轨道靠动能物理打击目标。
战车上炮弹装载空间和重量有限。地面上完好的弹药可拾起利用。车上已有的弹药也可以丢下。
炮弹为实心球状,分石弹和铅弹,铅弹和石弹占用不同空间和重量(混合装载时如何堆放更省空间?)。
炮弹破坏力通过动能计算,相同弹道的铅弹动能(当然)更大。
炮弹可躲避,可被拦截。 石弹拦截石弹后两个石弹都粉碎。 两铅弹拦截后弹性碰撞变换轨道,落下砸中战车依然具有破坏性。 铅弹可击碎石弹,击碎后的碎片无伤害,铅弹动能减弱,轨道改变。
掉落空地的石弹和铅弹完好。 砸中战车的石弹和铅弹完好。 砸中散落的弹药时,石弹都破碎,铅弹完好。
战车控制车轮转动、抬动或转动炮台瞄准、发射炮弹 都需要消耗一定能量。
初始时战车有一定能量储备,能量会慢慢收集增加,直到达到一个上限值。
战车重量为战车自身重量加弹药重量,重量大惯性大,将影响运动速度。
分Server端和Client端。client通过独立channel向server通信,发送控制命令和应答channel。server端通过应答channel返回命令结果。
Server收到命令后将命令拆解成指令,并送入此client的指令channel。耗时更多的命令会被拆解成多条指令。
Server每一周期按随机顺序执行每个客户端的一条指令。当一个命令的最后一条指令执行完毕,server将向应答channel写入命令结果。
前期将client实现成一个模块,编译进server。server启动时接入所有client,每个client在独立的goroutine中运行。后期可将命令channel接入部分封装出来,提供mq接口或者api接口,client可以实现动态接入。
如何精细控制运动?当需要不停调整转轮力度时候,频繁调用命令是否可行?
unit test