0

我在一个简单的 JavaScript 2D(画布)游戏中使用A* 寻路脚本。我将我的游戏分解为SSCCE。无论如何,我的游戏有 15 列和 10 行。

问题是什么?设置图表,我在一个循环中nodes使用一个简单的循环来正确设置(或者我认为),以设置一个 15 跨板和 10 块板。forfor

所以当我加载页面时,我得到这个错误:Uncaught TypeError: Cannot read property '5' of undefined

那是从这一行start = graph.nodes[12][5];(从SSCCE下面)开始,如果您更改5Y),那么错误中的数字将会改变。

这是我的SSCCE

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>    
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type='text/javascript' src='graphstar.js'></script>
<script type="text/javascript">
    var board;
</script>
<script type='text/javascript' src='astar.js'></script>
<script type="text/javascript">
    $(document).ready(function()
{
        // UP to DOWN - 10 Tiles (Y)
        // LEFT to RIGHT - 15 Tiles (X)
        graph = new Graph([
        [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, 1, 13, 13, 13, 13, 13, 1, 1, 1, 1, 1, 13, 13, 1], 
        [1, 13, 1, 1, 13, 1, 1, 13, 1, 13, 13, 1, 13, 13, 13, 1], 
        [1, 13, 13, 1, 1, 1, 13, 13, 1, 13, 13, 1, 1, 1, 13, 1], 
        [1, 13, 13, 1, 13, 1, 13, 13, 13, 13, 13, 1, 13, 13, 13, 1], 
        [1, 13, 13, 13, 13, 1, 13, 13, 13, 13, 13, 1, 13, 13, 13, 1], 
        [1, 13, 1, 13, 13, 13, 13, 13, 1, 1, 1, 1, 13, 13, 13, 1], 
        [1, 13, 1, 1, 1, 1, 13, 13, 13, 13, 1, 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]
        ]);
        //Let's do an example test.
        start = graph.nodes[12][5]; // X: 12, Y: 5
        end = graph.nodes[2][4]; // X: 2, Y: 4
        result = astar.search(graph.nodes, start, end);
    });
</script>
</head>
<body>
Loading... pathfinding. Look in Chrome Console/Firefox Firebug for more information.
</body>
</html>

如您所见,我grid10上下行和16列。然而,我graph并没有那样解释它。

在这里查看全部内容:http graphstar.js: //pastebin.com/xUwghjRR(这里是astar.js完整包: http: //pastebin.com/YMBtX66W

这是它的布局graphstar.js新更新

function Graph(grid) {
    var nodes = [];

var row, rowLength, len = grid.length;
for(var y = 0; y < len; ++y){
    row = grid[y];
    rowLength = row.length; // Expected: 16;
    nodes[y] = new Array(len);
    for (var x = 0; x == rowLength - 1; ++x){

            nodes[y][x] = new GraphNode(x, y, row[y]);

    }
}

    this.input = grid;
    this.nodes = nodes;
}

如您所见,for循环是通过查看grid. grid长度应该输出到11哪个是正确的,因为我们Y首先循环轴。然后按row应该输出16正确的长度,从那时起我们正在做X轴。

因此,当我启动页面时,我收到此错误:

所以......我想我把它画在了正确的位置,但是我X仍然Y给出了未定义的。

4

1 回答 1

1

你的循环条件从一开始就是假的,所以它甚至永远不会进入第一个循环,它应该是

for(var y = 0; y < len; ++y){

还呼吁GraphNodes可能会使用x而不是y

编辑:

代码中还有一些其他的小错误,第二个循环需要一个大写 L inrowLength以及你保存新节点对象的位置中的顺序x需要y切换nodes[y][x] =

编辑2:

工作功能,请注意我删除了对 GraphNodes 的函数调用以方便使用,还有一些 console.log 调用您需要删除

function Graph(grid) {
    var nodes = [];

    var row, len = grid.length;
    console.log(len);
    for (var y = 0; y < len; ++y) {
        console.log(y);
        row = grid[y];
        console.log(row);
        var rowLength = row.length; // Expected: 16;
        nodes[y] = new Array(len);
        for (var x = 0; x < rowLength; ++x) {

            nodes[y][x] = row[x];
            console.log(nodes);

        }
    }

    this.input = grid;
    this.nodes = nodes;
}

编辑3:

问题可能是因为您的所有其他代码都将坐标视为 x,y 此处的循环并存储它们 y,x 如果您像这样更改代码,它应该让您保留所有其他代码使用x,y

function Graph(grid) {
    var nodes = [];

    var row, len = grid.length;
    for (var y = 0; y < len; ++y) {
        row = grid[y];
        var rowLength = row.length; // Expected: 16;

        for (var x = 0; x < rowLength; ++x) {
        if(!nodes[x]){      
                nodes[x] = new Array(len);
        }
            nodes[x][y] = row[x];

        }
    }

    this.input = grid;
    this.nodes = nodes;
}
于 2012-05-06T22:02:27.777 回答