0

シンプルな JavaScript 2D (キャンバス) ゲームでA* パスファインディング スクリプトを使用しています。ゲームをSSCCEに分解しました。とにかく、私のゲームは横 15 列、下 10 行です。

何が問題ですか?グラフの設定では、ループ内の単純なループを使用して 15 のアクロスと 10 のダウン ボードを設定して、nodes正しく (またはそう思うように)設定しました。forfor

そのため、ページをロードすると、次のエラーが発生します。Uncaught TypeError: Cannot read property '5' of undefined

これは、この行start = graph.nodes[12][5];(SSCCE以下) からのもので、5( Y) を変更すると、エラーの番号が変更されます。

これが私の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>

ご覧のとおり、私の行は上下にあり、列gridは横になっています。しかし、私はそれをそのように解釈しません。1016graph

ここで全体を参照してgraphstar.jsください: http://pastebin.com/xUwghjRR (astar.js完全なパッケージはこちら: http://pastebin.com/YMBtX66W )

これは、次の場所に配置されている場所ですgraphstar.jsNEWLY UPDATED

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長さはどちらに出力する必要があります。次に、正しい出力を出力する必要がある長さで、それ以来、軸を実行しています。11Yrow16X

したがって、ページを開始すると、次のエラーが表示されます。

だから...私はそれを正しくグラフ化したと思いますがXYまだ定義されていません。

4

1 に答える 1

1

ループの条件は最初から false であるため、最初のループに入ることさえありません。

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

また、GraphNodesおそらくsouldの呼び出しは、xではなく使用する必要がありますy

編集:

コードには他にもいくつかの小さなバグがあります。2 番目のループには大文字の L が必要でrowLength、新しいノード オブジェクトを保存する位置xy、切り替える必要があります。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 に答える