当沿1个方向绕过障碍物时,寻路导致堆栈溢出

时间:2015-11-03 16:00:38

标签: c# path-finding

我一直致力于一个需要相当基本寻路的项目,经过相当多的努力和时间,它几乎可以工作。但是,有一个持久性错误。每当一个单元需要在障碍物上方路径时,它就没有问题,但是当它需要在下面路径时它会产生堆栈溢出。

守则:

在单元类

public void drawMovePath(Tile tarTile)
{
    for (int i = 0; i < moveableTiles.Count; i++) {
        moveableTiles[i].GetComponent<SpriteRenderer>().color = Color.gray;
    }
    path.Clear ();

    List<GameObject> availableTiles = new List<GameObject> ();
    List<int> hValues = new List<int> ();
    calcLists (availableTiles, hValues, tarTile.gameObject);

    curTile.GetComponent<Tile> ().drawMovePathInit (tarTile.gameObject, availableTiles, hValues, path, speed);


    for (int i = 0; i < path.Count; i++) {
        path[i].GetComponent<SpriteRenderer>().color = Color.green;
        print(path[i].GetComponent<Tile>().getHValue());
    }
    pathDrawn = true;
}

在瓷砖类中:

public void drawMovePathInit(GameObject tarTile, List<GameObject> allMoveableTiles, List<int> hValues, List<GameObject> path, int speed, int newHValue = 0)
{

    GameObject curTile = Player.instance.getSelectedUnit ().GetComponent<Unit> ().getCurTile ();
    curTile.GetComponent<Tile> ().setHValue (newHValue);
    path.Add (curTile);

    GameObject nextTile = new GameObject();

    int lowestH = 100000;
    for (int i = 0; i < curTile.GetComponent<Tile>().getSurTiles().Count; i++) {
        int index = allMoveableTiles.IndexOf(curTile.GetComponent<Tile>().getSurTiles()[i]);
        if (index != -1)
        {
            if (hValues[index] <= lowestH)
            {
                lowestH = hValues[index];
                nextTile = allMoveableTiles[index];
            }
        }
    }
    nextTile.GetComponent<Tile> ().drawMovePath (tarTile, allMoveableTiles, hValues, path, speed, curTile.GetComponent<Tile>().getHValue());

}


public void drawMovePath(GameObject tarTile, List<GameObject> allMoveableTiles, List<int> hValues, List<GameObject> path, int speedLeft, int newHValue)
{
    setHValue (newHValue + 10);
    path.Add (this.gameObject);

    if (this.gameObject == tarTile) {
        return;
    }
    if (speedLeft == 0) {
        return;
    }

    GameObject nextTile = new GameObject();

    int lowestH = 100000;
    for (int i = 0; i < surTiles.Count; i++) {
        int index = allMoveableTiles.IndexOf(surTiles[i]);
        if (index != -1)
        {
            if (hValues[index] <= lowestH)
            {
                lowestH = hValues[index];
                nextTile = allMoveableTiles[index];
            }
        }
    }
    nextTile.GetComponent<Tile> ().drawMovePath (tarTile, allMoveableTiles, hValues, path, speedLeft - 1, getHValue());

}

最简单的方法是使用图片来演示问题: enter image description here

在上面的图片中,代码工作正常,从所选单元找到路径到鼠标悬停的图块。

enter image description here

但是,在此图像中,代码无效。单元和鼠标之间没有形成路径。

这个问题与这样一个事实有关:一旦它决定了一条路径,它就会一直沿着这条路走下去。 &#34; if(speedLeft == 0)&#34;在Tile中的drawMovePath()中的escape子句是为什么在第二个图像中只显示1个tile。没有它,会产生堆栈溢出,因为路径查找在上升1,然后下降1,然后上升1,然后下降1等之间循环。

如果我删除了= in&#34; if(hValues [index]&lt; = lowestH)&#34;,那么我有相同的问题,只能反过来,它可以在障碍物下方寻路,但不是上方。

我真的因为这个问题而斗智斗勇,现在已经困扰了我近一个星期了。任何帮助将不胜感激。

提前致谢,

尼克

0 个答案:

没有答案