从现实世界的角度来看:如果您从A到B的方向找到了被锁着的门D,您将意识到必须找到钥匙D。因此,如果您的AI像典型的人一样不为人知,这将涉及寻找密钥,这本身就是一组微小的寻路步骤。另一方面,您甚至可能希望AI甚至在尝试路径之前都知道该路线上的门已锁定,在这种情况下,它也可能会知道在哪里找到钥匙。
无论哪种方式,问题都是两个级别的连通性之一。在“地面”级别上,您知道您始终可以在一个未划分的区域内安全移动……也就是说,没有被锁着的门划分的区域。您可以在这里自由使用当前的A *寻路实现。(在一个简单的例子中,您可以将一个区域视为一个房间。如果不打开门就无法进入任何其他房间。实际上,它可能是您的地牢的整个区域。)这是您的地牢的基础。实体移动,但这有点像眼睛向下垂走动,而不是先调查周围的区域-您可能会走进路灯柱。或者在这种情况下,请锁定门。因此,运行A *的地面地图必须限制玩家只能在当前区域内移动。
接下来,有一个更高级别的地图,其本质上比拓扑结构更具拓扑性。它实际上并不关心障碍物的地面细节,仅关注区域之间的连通性。由于该拓扑图显示了地牢中所有区域的理想连通性,因此它们之间甚至存在当前之间已锁定门的区域之间的连接。在它的边缘(每个代表区域之间的一扇门)中,它存储打开该门所需的钥匙(如果有的话),否则认为是打开的。因此,在此图中搜索最短路径时,应在搜索运行时检查边缘数据,从而将找到的路径限制为仅已打开的路径。这里的连通性并不意味着开放,而是潜在的开放。
当您想移至单独区域内的某个点时,请先搜索更高级别的地图以查找路径。(在此级别上可以使用A *或任何其他最短路径算法。)找到路径后,该更高级别的地图还应提供有关从当前区域到另一个区域需要使用哪扇门的信息。现在,您可以在本地区域执行地面AI导航到该门。一旦到达门,您的角色便可以通过该门/门。他现在位于区域B中。如果这是目标区域,则可以使用地面导航转到关键点。如果不是,那么您需要重复第一步,直到到达目标区域。
所寻找的钥匙本身可能位于锁着的门后面……而该门的钥匙也同样存在……等等。这本质上是一个依赖关系解决问题,有几种方法可以解决此问题,其中之一就是Petri Nets。看到这篇优秀的论文。
PS。如果您要按程序创建地牢,那么在您已经知道播放器的起始位置的情况下,可以存储有关依存顺序的信息。