2017-11-10 11 views
0

私は今 '地雷船'に取り組んでいます。フィールドを設定しました。鉱山の隣人を確認する

私にはカップルの質問があります。まず、鉱山の数は1からfieldSize-1でなければなりません。これが正しいかどうかは分かりませんが、私は 'minesNum'と宣言します。 第2に、鉱山の数が正しいと仮定すると、私は鉱山の隣人をチェックしたいので、私は9個のif文を持っていますが、2番目のif文にエラーメッセージがあります。 'Uncaught TypeError: 'of undefined'

私は約5時間も苦労していますが、それでもわかりません。誰もそれで私を助けることができますか? ありがとうございました!

var arr=new Array(30,40); 
var min=1; 
var max= rows * columns; 
minesNum=Math.floor(Math.random()*(max-min)+min); 

for(var i=0; i<rows;i++){ 
    for(var j=0;j<columns;j++){ 
     arr[i][j]=0; 
    } 
} 

for (var i=0; i<=minesNum; i++){ 
    var x = Math.floor(Math.random()*rows); 
    var y = Math.floor(Math.random()*columns); 
    if(arr[x][y]==-1){ 
     i--; 
     continue; 
    }   
    arr[x][y]=-1; 
} 

for(var i=0;i<rows;i++){ 
    for(var j=0;j<columns;j++){ 
     if(arr[i][j]==-1){ //mine 
      continue; 
     } 


     if(this.arr[i-1][j]==-1){ 
      arr[i][j]=arr[i][j]+1; 
     } 

     if(arr[i][j-1]==-1){ 
      arr[i][j]=arr[i][j]+1; 
     } 
     if(arr[i+1][j]==-1){ 
      arr[i][j]=arr[i][j]+1; 
     } 
     if(arr[i][j+1]==-1){ 
      arr[i][j]=arr[i][j]+1; 
     } 
     if(arr[i+1][j+1]==-1){ 
      arr[i][j]=arr[i][j]+1; 
     } 
     if(arr[i-1][j-1]==-1){ 
      arr[i][j]=arr[i][j]+1; 
     } 
     if(arr[i-1][j+1]==-1){ 
      arr[i][j]=arr[i][j]+1; 
     } 
     if(arr[i+1][j-1]==-1){ 
      arr[i][j]=arr[i][j]+1; 
     } 
    } 
} 

答えて

0

まず、あなたは間違った方法で2次元配列を作成している:

var arr=new Array(30,40); 
var min=1; 
var max= rows * columns; 
minesNum=Math.floor(Math.random()*(max-min)+min); 

for(var i=0; i<rows;i++){ 
    for(var j=0;j<columns;j++){ 
     arr[i][j]=0; 
    } 
} 

を、これがあるべきで:

var arr=new Array(); 
var min=1; 
var max= rows * columns; 
minesNum=Math.floor(Math.random()*(max-min)+min); 

for(var i=0; i<rows;i++){ 
    arr[i]=new Array() 
    for(var j=0;j<columns;j++){ 
     arr[i][j]=0; 
    } 
} 

その後、変更の有効な配列インデックスに基づいて、あなたのロジック

+0

最大サイズは40×30で、私は右、私はあまりにも、配列のサイズを宣言するべきだと思いますか? – user6428015

+0

これを行う必要はありません。新しい配列(30,40)は、要素30と40の配列を作成します –

0

あなたの質問の第2部分に答えるには、まずあなたがチェックインしているポジションif文が有効かどうか。 したがって、arr [i-1] [j]にアクセスする前に、(i-1)がゼロより小さくないことを最初に確認する必要があります。値が0より小さい場合は、エラーが発生する無効な位置にアクセスしようとしていることを意味します。すべてのif文でこれを行う必要があります。まず、アクセスしようとしている位置が有効であることを確認します。したがって

、文は次のようになる場合のためにあなたのコード - 私のフィールドの

if((i-1) >=0 && this.arr[i-1][j].holds==-1){ 
     arr[i][j]=arr[i][j]+1; 
    } 

    if(j-1 >=0 && arr[i][j-1]==-1){ 
     arr[i][j]=arr[i][j]+1; 
    } 
    if(i+1 < rows && arr[i+1][j]==-1){ 
     arr[i][j]=arr[i][j]+1; 
    } 
    if(j+1 <= columns && arr[i][j+1]==-1){ 
     arr[i][j]=arr[i][j]+1; 
    } 
    if(i+1 < rows && j+1 < columns && arr[i+1][j+1]==-1){ 
     arr[i][j]=arr[i][j]+1; 
    } 
    if(i-1 >= 0 && j-1 >= 0 && arr[i-1][j-1]==-1){ 
     arr[i][j]=arr[i][j]+1; 
    } 
    if(i-1 >=0 && j+1 < rows && arr[i-1][j+1]==-1){ 
     arr[i][j]=arr[i][j]+1; 
    } 
    if(i+1 < rows && j-1 >=0 && arr[i+1][j-1]==-1){ 
     arr[i][j]=arr[i][j]+1; 
    } 
+0

ありがとうございます!どうもありがとうございました! – user6428015

関連する問題