地图中一个格子是空的,不等于有面积的角色可以站在那里。角色中心可行走区域,应当检查整个占地范围是否都落在空地上。否则路径点虽然合法,身体却可能穿进墙里。
先固定规则和输入
地图为七乘七,零表示空地,一表示墙。角色固定占据以中心格为中心的三乘三区域,不允许旋转或部分越界。仅当这九个格子都存在并且全为空时,中心格才被允许。
#墙,.空地;坐标为[横,纵] ....#.. ....#.. .....#. .#....# ......# ....... ....##.
把结果按步骤记下来
第0行原空格6个,允许中心横坐标[]。边界行即使看起来为空,也无法容纳越出地图的占地部分。
第1行原空格6个,允许中心横坐标[1, 2]。边界行即使看起来为空,也无法容纳越出地图的占地部分。
第2行原空格6个,允许中心横坐标[]。边界行即使看起来为空,也无法容纳越出地图的占地部分。
第3行原空格5个,允许中心横坐标[3]。边界行即使看起来为空,也无法容纳越出地图的占地部分。
第4行原空格6个,允许中心横坐标[3, 4]。边界行即使看起来为空,也无法容纳越出地图的占地部分。
第5行原空格7个,允许中心横坐标[1, 2]。边界行即使看起来为空,也无法容纳越出地图的占地部分。
第6行原空格5个,允许中心横坐标[]。边界行即使看起来为空,也无法容纳越出地图的占地部分。
原空地41格,合法中心7格,坐标[[1, 1], [2, 1], [3, 3], [3, 4], [4, 4], [1, 5], [2, 5]]。合法中心是原空地的子集,但两者数量通常相差很多。
自己复核的办法
可以从候选中心向外检查九格,也可以从墙与地图外侧反过来排除受影响的中心。两种方法应得到同一集合。先画原空地,再画允许的中心,便能看到狭窄位置为何消失。
建议先遮住结果,用本例原始输入独立完成一遍,再逐项对照。若出现差异,先找最早不一致的位置,检查索引从零还是从一开始、边界是否包含,以及比较或更新发生的先后。只比较最后一个数,往往无法分辨规则理解与计算步骤分别出了什么问题。
使用这个练习的边界
这不是圆形碰撞体的精确检测。真实角色若更小、可以侧身或允许沿边滑动,规则会不同。站立合法与从一个位置连续移动到另一个位置也不是完全相同的问题。
