1)我想一个游戏,我们可以建造采用多块瓷砖的建筑物,例如3x3。
所以在开始构建之前,我需要将字符移动到相邻的tile。那么有一种算法可以找到建筑区域的最短路径吗?
我们是否有义务在区域建筑的每块瓷砖上使用A *并选择最短的?
编辑,例如:
对于这个例子,(0; 0)坐标位于具有此标志的图像的左上角: 想象你的角色是(0; 0)
我正在寻找算法将角色cloest移动到图像上的左侧。 [坐标:(1; 2),(8,2),(1,10),(8,10)]
目标不是像#"正常"案件,但是一个aera(有4分)。
那么从单个起始坐标[此处,(0,0)]到区域[此处:(1; 2),(8,2),(找到最近的位置)(最好的方法)是什么? 1,10),(8,10)]?
我想要算法返回数组的解决方案,所以如果在这个例子中有多种方式:[(0,2),(1,1)],没有选择解决方案,juste给我所有等价的解决方案。< / p>
2)与没有瓷砖的地图系统相同的问题,但只是坐标?
答案 0 :(得分:0)
我们是否有义务在区域建筑的每块瓷砖上使用A *并选择最短的?
不,A *可以接受目标谓词,当前坐标等于这个坐标时,它不一定是&#34;它很容易be&#34;当某个set / area&#34;中包含当前坐标时。这并没有改变算法的全局结构,只是退出测试。
当然,你必须保持你的启发式可以接受。
澄清,而不是这个&#34;狭窄&#34; A *的伪代码:(从wiki复制)
current := the node in openSet having the lowest fScore[] value
if current = goal
return reconstruct_path(cameFrom, current)
你可以拥有:
current := the node in openSet having the lowest fScore[] value
if current ∈ goals
return reconstruct_path(cameFrom, current)
或者这个:
current := the node in openSet having the lowest fScore[] value
if satisfiesGoalCondition(current)
return reconstruct_path(cameFrom, current)
可以进行一些测试,例如&#34;当前坐标在目标矩形内#34;。
答案 1 :(得分:0)
好array/grid version of A*
可以停止目标区域中的任何匹配,因此只需从起点开始增长,直到达到任何目标坐标,然后backtrack。
是的,您也可以使用图形/矢量版本来设置任何障碍物作为节点。
如果您的瓷砖是(半)可走路的,那么A*
的网格版本会更好,因为您可以利用它。您只需对每个标记可行走和墙壁区域的图块进行 2D 表示。像这样:
这也允许你在你的建筑物中导航......但我没有看到你的建筑物内部,所以我的赌注是你到现在为止没有想到这一点。看看:
我正在使用 3D 网格,所以我得到了 3D 地形,而且建筑物也可以有等级......你只需要调整视图以选择性地切割高于玩家的等级像这样的东西: