【发布时间】:2017-12-28 23:17:28
【问题描述】:
我正在研究在基于网格的 RTS 城市建设游戏中放置道路的寻路工作,因为我已经使用 A* 算法对车辆进行寻路,我认为将它用于此任务也会很方便。由于我们的道路只是简单的正方形,我不能使用原始算法,因为道路会像图片一样: Roadplacement
原始算法检查它旁边的每个网格正方形是这样的:
for (int x = -1; x <= 1; x++)
{
for (int y = -1; y <= 1; y++)
{
if (x == 0 && y == 0))
{ continue; }
//the rest of the code goes here
我认为避免这些对角线放置的最简单方法是阻止使用的选项,然后每个网格方块不会检查它周围的 8 个方块,而只会检查 4 个加号:
for (int x = -1; x <= 1; x++)
{
for (int y = -1; y <= 1; y++)
{
if ((x == 0 && y == 0)|| (x != 0 && y != 0))
{ continue; }
//the rest of the code goes here
唯一的问题是寻找路径的时间会急剧增加,我的意思是在很长的距离上它会从 6 ms 跳到 ~70 ms。 有没有人有我可以使用的解决方案,或者对更适合此类问题的另一种算法的建议?
提前致谢!
【问题讨论】:
-
您是否调整了启发式以考虑到您已删除对角连接?
-
按照 harold 所说的,您对这次搜索的启发式应该类似于
abs(destination_x - x) + abs(destination_y - y)(即“曼哈顿距离”)。虽然可以稍微优化您生成的要测试的点,但您所做的更改应该会加快速度,因为您检查的点更少。 -
如果您的车辆可以沿对角线移动,那么您的道路也应该可以。你展示的图片让它看起来很难看,但那是因为你需要瓷砖,在适当的对角线一侧有道路,另一侧是风景,填补空白。本质上,您需要对道路进行抗锯齿处理。
-
我和我的团队决定只希望汽车沿着 x 和 y 轴直线行驶。我看不出应该如何修改距离计算,因为它是相对于其他网格方格的。
-
禁止对角线移动通常会增加距离,除非在某些特殊情况下。使用现在比以前低估 更多 的启发式方法(因为它相同,但实际距离增加了)意味着探索了更多的图块。
标签: algorithm path-finding a-star