地图教程

地图教程 ======== > 游戏规则

你很快就会想靠自己去遍历 Leek Wars 的地图。但要做到这一点,先得明白它是怎么运作的。

也许你觉得它有点奇怪,甚至有点复杂。其实,只要理解了它的排布方式,用起来相当简单。

几何结构

!地图教程 1

游戏地图采用等距视角。格子其实都是正方形,只是我们从它的一个角、略高一点的位置去看它们。

!地图教程 等距视角

这个视角会让人以为地图是长方形的。但如果把它“放平”,就会得到:

!地图教程 放平

地图其实是一个倾斜 45° 的正方形,看上去更像一个菱形。

把它放进坐标系里,位于地图中心的格子坐标是 [0;0]。地图的四个角分别在坐标 [0;-17]、[0;17]、[-17;0] 和 [17;0]。

由于地图的形状,可以这么写:

其中 x 和 y 是某个格子的坐标,abs() 是取绝对值的函数。

一个格子坐标的绝对值之和不能超过 17。也就是说,比如坐标为 [0;18]、[9;12]、[-12;10] 等等的格子并不存在。

Leek Wars 里,你可以直接拿格子的坐标来做运算。函数 getCellXgetCellY 分别返回指定格子的 x 坐标和 y 坐标。函数 getCellFromXY 则反其道而行,返回位于所给坐标处的格子。 注意,如果传给它的坐标在地图之外,函数会返回 null

也可以由格子的编号反过来算出坐标:

!地图教程 坐标轴

判断两个格子是否处于对角线上

要知道两个格子是否在同一条线上,可以使用函数 isOnSameLine。对角线则要用下面这个公式,设两个格子的坐标为 (x1, y1) 和 (x2, y2):

遍历地图

最后,你也许需要把整张地图遍历一遍。但地图的形状让按坐标遍历稍微麻烦一些。

用坐标的话,得写成这样:

不过地图一共有 613 个格子,编号从 0 到 612。

因此,遍历格子还有一种简单得多、也省下大量操作数的写法:

地图的形状加上格子的编号顺序,带来了一个有趣的性质:格子可以直接由坐标推出来,公式是 306 + 18 * x + 17 * y。也就是说,在 x 轴上偏移一格,格子编号就变化 18;在 y 轴上偏移一格,编号就变化 17。 这个性质能在不少算法里省下大量操作数,但要小心处理地图的左右边界:本想移动一格,却可能错误地得到地图另一侧的格子!

在战斗中,你可以显示格子的编号:在选项里勾选 _显示格子编号_(用来看编号)和 _战术模式_(用来隐藏障碍物)。

格子编号

格子的编号如下:

格子中的内容(障碍物、实体)

你可以用函数 getCellContent(cell)isObstacle(cell)isEntity(cell)isEmptyCell(cell) 查看某个格子里有什么。 你也可以用函数 getObstacles() 取得本场战斗中的全部障碍物。