2017-11-16 21 views
-5

特定の配列パスのアルゴリズムであるwhileループがあり、javaScriptで作成しました。ここにコードがあります。JavaScript:Whileループが無限ループするのはなぜですか?

var Row1 = [0, 0, 0, 0, 0]; 
var Row2 = [0, 0, 0, 0, 0]; 
var Row3 = [0, 0, 0, 0, 0]; 
var Row4 = [0, 0, 0, 0, 0]; 
var Row5 = [0, 0, 0, 0, 0]; 
var AllRows = []; 

//Add Rows 
AllRows.push(Row1, Row2, Row3, Row4, Row5); 
console.log(AllRows); 

//First Value 
var SV1 = [0, (AllRows.length - 1)]; 
var SV2 = [0, (AllRows.length - 1)]; 

var GetSV1 = Math.floor(Math.random()*(SV1.length - 1)); 
var GetSV2 = Math.floor(Math.random()*(SV2.length - 1)); 
AllRows[GetSV1][GetSV2] = 1; 

var Steps = 1; 
var PD = "false"; 
var RV1 = null; 
var RV2 = null; 
while(PD == "false"){ 
    RV1 = Math.floor(Math.random()*(AllRows.length - 1)); 
    RV2 = Math.floor(Math.random()*(AllRows.length - 1)); 
    if(AllRows[RV1][RV2] == AllRows[GetSV1][GetSV2] || AllRows[RV1][RV2] == "X"){ 
     continue; 
    } else { 
     AllRows[RV1][RV2] = 1; 
    } 

    if(AllRows[0][0] == 1){ 
     if(Steps >= 1 && AllRows[0][1] == 1){ 
      AllRows[1][0] = "X"; 
      Steps++; 
      continue; 
     } else if(Steps >= 1 && AllRows[1][0] == 1){ 
      AllRows[0][1] = "X"; 
      Steps++; 
      continue; 
     } else{ 
      AllRows[0][1] = 0; 
      AllRows[1][0] = 0; 
      AllRows[GetSV1][GetSV2] = 0; 
     } 
     if(Steps >= 2 && AllRows[0][2] == 1){ 
      AllRows[1][1] = "X"; 
      Steps++; 
      continue; 
     } else if(Steps >= 2 && AllRows[1][1] == 1){ 
      AllRows[0][2] = "X"; 
      AllRows[2][0] = "X"; 
      Steps++; 
      continue; 
     } else if(Steps >= 2 && AllRows[2][0] == 1){ 
      AllRows[1][1] = "X"; 
      Steps++; 
      continue; 
     } else{ 
      AllRows[0][2] = 0; 
      AllRows[1][1] = 0; 
      AllRows[2][0] = 0; 
      AllRows[GetSV1][GetSV2] = 0; 
     } 
     if(Steps >= 3 && AllRows[0][3] == 1){ 
      AllRows[1][2] = "X"; 
      Steps++; 
      continue; 
     } else if(Steps >= 3 && AllRows[1][2] == 1){ 
      AllRows[0][3] = "X"; 
      AllRows[2][1] = "X"; 
      Steps++; 
      continue; 
     } else if(Steps >= 3 && AllRows[2][1] == 1){ 
      AllRows[3][0] = "X"; 
      AllRows[1][2] = "X"; 
      Steps++; 
      continue; 
     } else if(Steps >= 3 && AllRows[3][0] == 1){ 
      AllRows[2][1] = "X"; 
      Steps++; 
      continue; 
     } else{ 
      AllRows[0][3] = 0; 
      AllRows[1][2] = 0; 
      AllRows[2][1] = 0; 
      AllRows[3][0] = 0; 
      AllRows[GetSV1][GetSV2] = 0; 
     } 
     if(Steps >= 4 && AllRows[0][4] == 1){ 
      AllRows[1][3] = "X"; 
      Steps++; 
      continue; 
     } else if(Steps >= 4 && AllRows[1][3] == 1){ 
      AllRows[0][4] = "X"; 
      AllRows[2][2] = "X"; 
      Steps++; 
      continue; 
     } else if(Steps >= 4 && AllRows[2][2] == 1){ 
      AllRows[3][1] = "X"; 
      AllRows[1][3] = "X"; 
      Steps++; 
      continue; 
     } else if(Steps >= 4 && AllRows[3][1] == 1){ 
      AllRows[2][2] = "X"; 
      AllRows[4][0] = "X"; 
      Steps++; 
      continue; 
     } else if(Steps >= 4 && AllRows[4][0] == 1){ 
      AllRows[3][1] = "X"; 
      PD = null; 
     } else{ 
      AllRows[0][4] = 0; 
      AllRows[1][3] = 0; 
      AllRows[2][2] = 0; 
      AllRows[3][1] = 0; 
      AllRows[4][0] = 0; 
      AllRows[GetSV1][GetSV2] = 0; 
     } 
     if(Steps >= 5 && AllRows[1][4] == 1){ 
      AllRows[2][3] = "X"; 
      Steps++; 
      continue; 
     } else if(Steps >= 5 && AllRows[2][3] == 1){ 
      AllRows[1][4] = "X"; 
      AllRows[3][2] = "X"; 
      Steps++; 
      continue; 
     } else if(Steps >= 5 && AllRows[3][2] == 1){ 
      AllRows[4][1] = "X"; 
      AllRows[2][3] = "X"; 
      Steps++; 
      continue; 
     } else if(Steps >= 5 && AllRows[4][1] == 1){ 
      AllRows[3][2] = "X"; 
      PD = null; 
     } else{ 
      AllRows[1][4] = 0; 
      AllRows[2][3] = 0; 
      AllRows[3][2] = 0; 
      AllRows[4][1] = 0; 
      AllRows[GetSV1][GetSV2] = 0; 
     } 
     if(Steps >= 6 && AllRows[2][4] == 1){ 
      AllRows[3][3] = "X"; 
      Steps++; 
      continue; 
     } else if(Steps >= 6 && AllRows[3][3] == 1){ 
      AllRows[2][4] = "X"; 
      AllRows[4][2] = "X"; 
      Steps++; 
      continue; 
     } else if(Steps >= 6 && AllRows[4][2] == 1){ 
      AllRows[3][3] = "X"; 
      PD = null; 
     } else{ 
      AllRows[2][4] = 0; 
      AllRows[3][3] = 0; 
      AllRows[4][2] = 0; 
      AllRows[GetSV1][GetSV2] = 0; 
     } 
     if(Steps >= 7 && AllRows[3][4] == 1){ 
      AllRows[4][3] = "X"; 
      Steps++; 
      continue; 
     } else if(Steps >= 7 && AllRows[4][3] == 1){ 
      AllRows[3][4] = "X"; 
      PD = null; 
     } else if(Steps >= 7 && AllRows[4][4] == 1){ 
      PD = null; 
     } else{ 
      AllRows[3][4] = 0; 
      AllRows[4][3] = 0; 
      AllRows[4][4] = 0; 
      AllRows[GetSV1][GetSV2] = 0; 
     } 
    }else{ 
     break; 
    } 
} 

}

私は問題を慰めることができないので、私は無限ループにこれを引き起こしているものを見つけることはできませんが、私が知っていることは、それが宣言とは何かを持っていることですRV1とRV2のコード内でどこが永遠にループするのか誰にでも教えてくれますか?

更新私はこの問題をさらに深く理解するために完全なコードを追加しました。

+4

あなたのコードループを永遠にさせる部分は 'while(true)'です。デバッガを使用してこのコードを実行するだけで、このループがなぜあなたのリターンに到達しないのかを正確に確認することができます。 – Shadow

+0

もっと良い質問は、*それが永遠にループすることを許可してはいけないことです。 「続ける」よりも「戻る」という2つの状況があります。あなたはそれがいつもその行に当たってはいけないと思いますか?それを保証するためにあなたは何をすることができますか? –

+0

'else'は' return'や 'continue'を使って省略することができます。これは、コード/ループの残りの部分に行くことなく条件を終了させるためです。 –

答えて

1

数点。 1つは、文字列が文字列値であり、true/falseがブール値であるため、 "false"はfalseまたはtrueと同じではありません。あなたはこのようなコードを書くことができ、けれども:

console.log(new Boolean("false") == true); // true 
 
console.log("false" == String(true));  // false
は、詳細情報を参照してください here

は、文字列と数値との混合配列を持っていません。したがって、 "X"の代わりに、私は99を使用しますが、あなたは合っていると思われる数値を使用することができます。ループを停止させる条件を指定する必要があります。今ではループはもはや無限大ではありません。また、参照here

var Row1 = [0, 0, 0, 0, 0]; 
 
var Row2 = [0, 0, 0, 0, 0]; 
 
var Row3 = [0, 0, 0, 0, 0]; 
 
var Row4 = [0, 0, 0, 0, 0]; 
 
var Row5 = [0, 0, 0, 0, 0]; 
 
var AllRows = []; 
 

 
//Add Rows 
 
AllRows.push(Row1, Row2, Row3, Row4, Row5); 
 
console.log(AllRows); 
 

 
//First Value 
 
var SV1 = [0, (AllRows.length - 1)]; 
 
var SV2 = [0, (AllRows.length - 1)]; 
 

 
var GetSV1 = Math.floor(Math.random()*(SV1.length - 1)); 
 
var GetSV2 = Math.floor(Math.random()*(SV2.length - 1)); 
 
AllRows[GetSV1][GetSV2] = 1; 
 

 
var Steps = 1; 
 
var PD = true; // "false" to true 
 
var RV1 = null; 
 
var RV2 = null; 
 

 
while(PD === true){ 
 
    RV1 = Math.floor(Math.random()*(AllRows.length - 1)); 
 
    RV2 = Math.floor(Math.random()*(AllRows.length - 1)); 
 
    if(AllRows[RV1][RV2] == AllRows[GetSV1][GetSV2] || AllRows[RV1][RV2] == 99){ 
 
     continue; 
 
    } else { 
 
     AllRows[RV1][RV2] = 1; 
 
    } 
 

 
    if(AllRows[0][0] == 0){ 
 
     if(Steps >= 1 && AllRows[0][1] == 1){ 
 
      AllRows[1][0] = 99; 
 
      Steps++; 
 
      continue; 
 
     } else if(Steps >= 1 && AllRows[1][0] == 1){ 
 
      AllRows[0][1] = 99; 
 
      Steps++; 
 
      continue; 
 
     } else{ 
 
      AllRows[0][1] = 0; 
 
      AllRows[1][0] = 0; 
 
      AllRows[GetSV1][GetSV2] = 0; 
 
     } 
 
     if(Steps >= 2 && AllRows[0][2] == 1){ 
 
      AllRows[1][1] = 99; 
 
      Steps++; 
 
      continue; 
 
     } else if(Steps >= 2 && AllRows[1][1] == 1){ 
 
      AllRows[0][2] = 99; 
 
      AllRows[2][0] = 99; 
 
      Steps++; 
 
      continue; 
 
     } else if(Steps >= 2 && AllRows[2][0] == 1){ 
 
      AllRows[1][1] = 99; 
 
      Steps++; 
 
      continue; 
 
     } else{ 
 
      AllRows[0][2] = 0; 
 
      AllRows[1][1] = 0; 
 
      AllRows[2][0] = 0; 
 
      AllRows[GetSV1][GetSV2] = 0; 
 
     } 
 
     if(Steps >= 3 && AllRows[0][3] == 1){ 
 
      AllRows[1][2] = 99; 
 
      Steps++; 
 
      continue; 
 
     } else if(Steps >= 3 && AllRows[1][2] == 1){ 
 
      AllRows[0][3] = 99; 
 
      AllRows[2][1] = 99; 
 
      Steps++; 
 
      continue; 
 
     } else if(Steps >= 3 && AllRows[2][1] == 1){ 
 
      AllRows[3][0] = 99; 
 
      AllRows[1][2] = 99; 
 
      Steps++; 
 
      continue; 
 
     } else if(Steps >= 3 && AllRows[3][0] == 1){ 
 
      AllRows[2][1] = 99; 
 
      Steps++; 
 
      continue; 
 
     } else{ 
 
      AllRows[0][3] = 0; 
 
      AllRows[1][2] = 0; 
 
      AllRows[2][1] = 0; 
 
      AllRows[3][0] = 0; 
 
      AllRows[GetSV1][GetSV2] = 0; 
 
     } 
 
     if(Steps >= 4 && AllRows[0][4] == 1){ 
 
      AllRows[1][3] = 99; 
 
      Steps++; 
 
      continue; 
 
     } else if(Steps >= 4 && AllRows[1][3] == 1){ 
 
      AllRows[0][4] = "X"; 
 
      AllRows[2][2] = "X"; 
 
      Steps++; 
 
      continue; 
 
     } else if(Steps >= 4 && AllRows[2][2] == 1){ 
 
      AllRows[3][1] = "X"; 
 
      AllRows[1][3] = 99; 
 
      Steps++; 
 
      continue; 
 
     } else if(Steps >= 4 && AllRows[3][1] == 1){ 
 
      AllRows[2][2] = 99; 
 
      AllRows[4][0] = "X"; 
 
      Steps++; 
 
      continue; 
 
     } 
 
     else 
 
     if(Steps >= 4 && AllRows[4][0] == 1){ 
 
      AllRows[3][1] = 99; 
 
      PD = false; 
 
     } else{ 
 
      AllRows[0][4] = 0; 
 
      AllRows[1][3] = 0; 
 
      AllRows[2][2] = 0; 
 
      AllRows[3][1] = 0; 
 
      AllRows[4][0] = 0; 
 
      AllRows[GetSV1][GetSV2] = 0; 
 
     } 
 
     if(Steps >= 5 && AllRows[1][4] == 1){ 
 
      AllRows[2][3] = 99; 
 
      Steps++; 
 
      continue; 
 
     } else if(Steps >= 5 && AllRows[2][3] == 1){ 
 
      AllRows[1][4] = 99; 
 
      AllRows[3][2] = 99; 
 
      Steps++; 
 
      continue; 
 
     } else if(Steps >= 5 && AllRows[3][2] == 1){ 
 
      AllRows[4][1] = 99; 
 
      AllRows[2][3] = 99; 
 
      Steps++; 
 
      continue; 
 
     } else 
 
      if(Steps >= 5 && AllRows[4][1] == 1){ 
 
      AllRows[3][2] = 99; 
 
      PD = false; //null to false 
 
     } else{ 
 
      AllRows[1][4] = 0; 
 
      AllRows[2][3] = 0; 
 
      AllRows[3][2] = 0; 
 
      AllRows[4][1] = 0; 
 
      AllRows[GetSV1][GetSV2] = 0; 
 
     } 
 
     if(Steps >= 6 && AllRows[2][4] == 1){ 
 
      AllRows[3][3] = 99; 
 
      Steps++; 
 
      continue; 
 
     } else if(Steps >= 6 && AllRows[3][3] == 1){ 
 
      AllRows[2][4] = 99; 
 
      AllRows[4][2] = 99; 
 
      Steps++; 
 
      continue; 
 
     } else if(Steps >= 6 && AllRows[4][2] == 1){ 
 
      AllRows[3][3] = 99; 
 
      PD = false; 
 
     } else{ 
 
      AllRows[2][4] = 0; 
 
      AllRows[3][3] = 0; 
 
      AllRows[4][2] = 0; 
 
      AllRows[GetSV1][GetSV2] = 0; 
 
     } 
 
     if(Steps >= 7 && AllRows[3][4] == 1){ 
 
      AllRows[4][3] = 99; 
 
      Steps++; 
 
      continue; 
 
     } else if(Steps >= 7 && AllRows[4][3] == 1){ 
 
      AllRows[3][4] = 99; 
 
      PD = false; 
 
     } else if(Steps >= 7 && AllRows[4][4] == 1){ 
 
      PD = false; 
 
     } else{ 
 
      AllRows[3][4] = 0; 
 
      AllRows[4][3] = 0; 
 
      AllRows[4][4] = 0; 
 
      AllRows[GetSV1][GetSV2] = 0; 
 
     } 
 
    } 
 
    else{ 
 
     break; 
 
    } 
 
    
 
}

は、それが厳密にMDNあたりブールとブール値を比較することが最善であることに注意してください。このため、この例では比較に「===」演算子を使用し、PDを明示的にtrueまたはfalseに設定しています。

関連する問題