
在体育节目竞赛之后,获胜者或仅一名球员在哈布雷(Habré)上发表文章以表明参加比赛有多伟大,并以此作为赢得比赛的选择已成为一种传统。 当然,从他的文章中可以为将来的比赛收获很多。
但是我认为关于在beta测试阶段参加当前比赛的文章很少,很明显您无法发布决定代码,仍然不知道这个决定有多好,而且很多仍然未知,因为现在实际上这仅仅是比赛的开始,但这就是魅力。 作者为读者提供了乘火车出发的机会,并享受新年的游戏策略之旅。
首先,感谢您打开本文,我想立即分享一个秘密:这是一系列文章,我希望其中涉及遗传算法和神经网络。 同时,如前所述,欢迎您前往俄罗斯AI Cup CodeBall。
链接到锦标赛的快速入门页面。在上面的链接中,读者将能够找到锦标赛规则,游戏规则以及创建机器人所需的数学仪器的主要部分。 同样在快速入门页面上,有已经编写的针对各种编程语言的机器人的示例,这极大地方便了初始入门。
让我们从一个简单的CodeBall冠军头衔开始。
代码和球这两个词的完美结合,几乎是足球。 游戏的规则和逻辑也类似于足球,但是每一轮比赛都变得更加复杂/所以我们将以游戏的初始条件为基础。
正如最近一首歌所说的那样,游戏的本质是:玩家必须得分,守门员才能击球。
示意图:

请注意,机器人在XZ竞技场地板的平面中移动,Y轴负责游戏对象的高度。
还示意性地说明了游戏的对象(球和机器人(组织者称其为机器人))

现在一些文字来支持图片。 比赛场地是一个三维封闭的空间,球和机器人都不能超越它。 在这个空间中,“门”的两个区域在被击中时,其中一个球员认为球已得分。 为了计算进球数,必须将球完全放在球门线的后面(图中虚线表示)。
为了简化计算游戏对象(竞技场,球,机器人)的碰撞(碰撞)的计算,机器人和球被视为理想球体(球),用以下值描述:球体半径,球体中心坐标,质量,速度。 竞技场也可以用理想的数学图元来描述,因此无需多边形参与即可避免碰撞计算,从而大大简化了任务。 如果滚动锦标赛规则到最后,读者将在伪代码上找到一个程序,该程序仅负责上述计算。 只需花费很少的精力,该伪代码就可以转换为您选择的编程语言,并且相当可行。 但是稍后会更多。
关于游戏世界物理的几句话。 为了使竞技场中发生的事情可信,引入了重力,即,机器人和球始终受到相对于竞技场地面向下定向的重力的影响。 组织者忽略了其他形式的物理交互,例如对象的摩擦或角速度(旋转),以简化对物理世界的描述。 当击中球馆的墙壁时,球会失去一些能量,但这并不会使世界变得十分复杂,从外部可以理解,没有办法以球的形式制造永动机。
为了使世界看起来更合理,已应用了与Ticks和Mikrotiks一起的计算方案。 在
他的第一篇文章中,作者详细介绍了柚木演奏时间的概念。 正如他所说,在这场比赛中,我们可以查看源代码中的物理引擎,这对我们将来很有用,并且发现对于玩家而言,这是Tics,并且引擎内部的一切都发生在Mikrotik中,默认情况下一次打一次100 Mikrotik,这使得更准确地成为可能描述物体的碰撞,并避免诸如在舞台外物体失效或物体彼此失效导致它们之间相互作用错误之类的令人不快的事情。

我们有点弄清楚了世界(竞技场)和比赛时间,让我们看一下游戏对象:机器人和球。 我们已经从比赛规则中发现了一个球。 简而言之,机器人是半径较小,质量较大的球,可以对其发出以下命令:指示所需的速度(这是包含速度的方向,长度或大小的三维矢量)以及如果从当前角度考虑建议进行跳跃,则为跳跃的强度游戏的逻辑。 在竞赛的这个阶段,已经引入了一种简化,即如果机器人在飞行中(不接触竞技场的墙壁),那么它就没有执行命令来改变速度的能力。
我们转向最困难的情况,反之亦然,这全都取决于读者在处理三维矢量上的经验。 游戏对象位置的描述。 支持图片

让我们开始研究植物学。
在每个游戏滴答声中,您的策略将收到以下对象:
球:
class Ball: x: Float
以及机器人列表,其中包含每个机器人的数据:
class Robot: id: Int player_id: Int is_teammate: Bool
您会立即发现使用此数据很不方便,因此需要引入3D类(对象)和2D类向量。 在很大程度上取决于您选择的编程语言。 通常,这些类已经编写好了,可以在Internet上轻松找到所需的编程语言。 作者现在正在用c ++编写机器人,但将尝试将自己限制为伪代码。 如果引入向量的完整类,则加,减,乘,归一化和其他向量运算将保留在该类内,这将大大简化该策略的工作。
还有一个播放器类,用于指示列表中的哪些机器人是您的,哪些机器人是:
class Player: id: Int me: Bool
将有关游戏世界的数据传输到您的策略输入之后,游戏引擎为您提供控制权并启动计时器进行计算,对于the内的所有操作,计算时间平均受到限制,平均大约为20毫秒。 令人怀疑的是,此时它还包括时间对接收的数据进行反
序列化以及将您的策略发送给服务器
的数据
序列化 。 但是,由于机器人的数量为4(您的2个和2个对手,因此在最后一轮中,机器人的总数将增加到6个),因此可以忽略这些操作的时间。
球队的时候到了。
例如,我们要给机器人一个命令使其朝着球移动。 为了找到所需的速度方向矢量,有必要从球的位置减去机器人的位置,我们得到球的方向矢量,然后可以将其归一化并乘以世界常数中机器人的最大速度。 在图片中更多

读者可能会在幻灯片上注意到,可以对3D矢量和2D矢量执行计算。 如果考虑到机器人在球馆地板上花费更多时间的事实,则将计算简化为两个坐标不会影响拦截球的计算准确性。 当然,您不应该忘记球的高度,但是考虑到重力,球迟早会沉入机器人中。
机器人跳跃是垂直速度(垂直速度)的相加,机器人跳跃的方向将与当前机器人速度的方向重合,并沿Y轴添加一个分量。
如果我们在上述词语中添加更复杂的移动逻辑,那么我们可以得到以下机器人行为:
现在,该站点有了一个沙箱,您可以在其中观看比赛,但是如果您编写策略并关注其比赛,就不会有什么感觉。 实验已经确定,即使是由几十行代码组成的最简单的策略也可以很好地发挥作用。
在想到的简单策略中,有一种策略是分配一个机器人来保护网关,第二个机器人来构成攻击者。 攻击者的主要任务是追逐球,如果成功,则向对手的目标袭来。 充当守门员的机器人通常在田间运动中受到限制,并且主要在目标区域内操作。 所有这些事情都可以使用所选语言的if-else构造轻松描述。 无论如何,在这个阶段,我的读者将不得不想出并制定一个策略。 根据比赛条款,您无法发布该策略的源代码。 但是我认为不禁止讨论设计策略的方法。
在我看来,比赛的组织者为比赛选择了一个有趣的话题,唯一的站点有点慢,但我希望它会尽快解决。
锦标赛参赛者的一些精彩比赛时刻:
我正在等待有关该文章的评论中的反馈意见,该文章将更详细地介绍。
在下一篇文章中,我将尝试描述用于在战略中更有意义的机器人比赛中及时预测球的行为的方法。
同时,恭喜即将到来的2019年新年!
待续。