2012-05-06 28 views
0

私はA* pathfinding scriptを単純なJavaScriptの2D(キャンバス)ゲームで使用しています。私はSSCCEに私のゲームを壊した。とにかく、私のゲームは縦15列、下10行です。JavaScript - forループでxとyが正しく割り当てられない

問題が何ですか?グラフを設定すると、forループ内の単純なforループを使用して、15と10のダウンボードを設定すると、nodesが正しく設定されています。

だから私はページをロードするとき、私はこのエラーを取得:Uncaught TypeError: Cannot read property '5' of undefined

あなたは5Y)を変更した場合、エラーの数字が変更されます。このラインstart = graph.nodes[12][5];(以下SSCCEから)からのものであること。

ここは私の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は上下10行と列にわたって16です。しかし私のはそれをそのように解釈しません。

は、ここに全体graphstar.jsを参照してください:http://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ループはどれくらいの時間を見て行われますかgridgrid長さは11に出力する必要があります。Y軸を最初にループしているためです。次にrowの長さによって、16が出力されます。それ以来、私たちはX軸を実行しています。私はページを起動したときに

は、だから私はこのエラーを取得する:

そう...私は私のXYはまだ未定義与えるしかし、私は右のそれをグラフ化だと思います。ループ上

+1

'row = grid [x]'? 'row = grid [y]'ではなく? – Imp

+0

それは悲しいことに違いない。まだ同じエラー。 :\ – nn2

答えて

1

あなたの条件が偽で最初からそれも最初のループに入ることはありませんので、それはGraphNodesへの呼び出しは、おそらくxはなくy

を使用することsouldも

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

する必要があります編集:

コードにもいくつかの小さなバグがあり、2番目のループは大文字のLがrowLengthで、xあなたがnodes[y][x] =

EDIT2切り替えることが必要に新しいノードオブジェクトの保存されている麻薬でy:私は使いやすさのためにGraphNodesへの関数呼び出しを削除用心、

機能を作業には、いくつかのコンソールもあります他のすべてのコードは、x、ループはあなたがここに持っているようにyと座標を見ているため、問題がある可能性があり

:あなたは

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を削除したいと思うでしょう呼び出すの.log 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; 
} 
+0

OKあなたが言ったことに変更しました。しかし、私はそれを実行します。このエラーが発生します。Uncaught TypeError:未定義のプロパティ 'length'を読み込めません。この行の原因: 'rowLength = row.length ;} '行= grid [y];ではないので、私はそれを変更し、' Uncaught TypeError:プロパティ '5'を読み取れません。定義されていない ' – nn2

+0

の2番目のforループは、最初のものと同じ問題を抱えています。私は答えの中で働いている関数 – Gilsham

+0

Hmを入れます。だから私はこれを行い、 'start'と' end'ノードの 'x'と' y'を入れ替えなければならなかったので、 'result.length' =' 0'を実行します。 – nn2

関連する問題