特定の配列パスのアルゴリズムである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のコード内でどこが永遠にループするのか誰にでも教えてくれますか?
更新私はこの問題をさらに深く理解するために完全なコードを追加しました。
あなたのコードループを永遠にさせる部分は 'while(true)'です。デバッガを使用してこのコードを実行するだけで、このループがなぜあなたのリターンに到達しないのかを正確に確認することができます。 – Shadow
もっと良い質問は、*それが永遠にループすることを許可してはいけないことです。 「続ける」よりも「戻る」という2つの状況があります。あなたはそれがいつもその行に当たってはいけないと思いますか?それを保証するためにあなたは何をすることができますか? –
'else'は' return'や 'continue'を使って省略することができます。これは、コード/ループの残りの部分に行くことなく条件を終了させるためです。 –