假设我使用数组来绘制我的游戏地图:
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1 },
{ 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1 },
{ 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1 },
{ 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1 },
{ 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1 },
{ 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1 },
{ 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1 },
{ 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1 },
{ 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }
我有ArrayList<>
个平铺数字已被阻止而其他数据块未被阻止。我可以通过blocked(X,Y)
进行检查,它会返回true
或false
,方法是检查当前地图上该图块的X和Y,然后它会看到该图块是否在BLOCKED中{ {1}}。无论如何,这里最好的寻路方法是什么?
答案 0 :(得分:3)
您可以使用图搜索算法,例如Breadth-first search。 您可以在谷歌中找到的实现,有很多例子。
答案 1 :(得分:0)
我认为通过寻路你的意思是你想找到从细胞(x1,y1)到细胞(x2,y2)的最短路径。 这里需要更多信息。如何定义相邻的单元格 - 即我可以从一个单元格移动到其4个邻居或6个邻居(包括对角线移动)?移动到任何一个celll的成本是相同的,还是根据单元格的类型或是行/ coloumn移动还是对角移动而变化?
假设所有单元格的移动成本相同,并且每个单元格与4个单元格相邻,它共享边缘,这基本上是在简单的未加权图形中找到最短路径的简单问题。为此,您可以使用breadth first search。图形的节点是单元格,并且每个单元格(除了顶部和底部行以及左侧和最右侧颜色的那些)具有四个边缘(每个相邻单元格一个)。当我们访问每个节点时,我们只是跳过被阻止的节点。
伪代码:
shortest path(start,end, blocked):
cost=map of node:int
visited=set of nodes
dx=array {0,1,0,-1}
dy=array {1,0,-1,0}
Q=queue of nodes
cost[start]=0
add start to Q
while Q is not empty:
node=remove top from Q
for i=0 until 4:
next=new node with next.x=node.x+dx[i], next.y=node.y+dy[i]
if (next is a valid node) and (next is not in visited) and (next is not in blocked):
cost[next]=cost[node]+1
add next to visited
add next to Q
if end is in visited:
return cost[end]
else:
return -1