Skip to content

Latest commit

 

History

History
66 lines (35 loc) · 2.57 KB

README.md

File metadata and controls

66 lines (35 loc) · 2.57 KB

投石车

使用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可以实现动态接入。

TODO:

如何精细控制运动?当需要不停调整转轮力度时候,频繁调用命令是否可行?

unit test