[英]While loop ignores initial condition and the browser crashes
長話短說-我正在嘗試構建一個簡單的網球比賽模擬(下面的代碼)。 不幸的是,我的代碼出了點問題,因為我創建的while循環會忽略放在方括號中的條件,並開始進行無數次迭代(瀏覽器崩潰)。 您能否看一下我的代碼,並告訴我錯誤在哪里?
var gamesPlayerOne = Math.floor(Math.random() * 8);
var gamesPlayerTwo = Math.floor(Math.random() * 8);
var tiebreak = Math.floor(Math.random() * 10);
var setsPlayerOne = 0;
var setsPlayerTwo = 0;
var scoreline = [];
function playTheGame(g1, g2) {
while (setsPlayerOne < 2 && setsPlayerTwo < 2) {
if (g1 === 6 && g2 < 5) {
var result = g1.toString() + ":" + g2.toString();
setsPlayerOne += 1;
scoreline.push(result);
} else if (g1 < 5 && g2 === 6) {
var result = g1.toString() + ":" + g2.toString();
setsPlayerTwo += 1;
scoreline.push(result);
} else if (g1 === 6 && g2 === 7) {
var result = g1.toString() + ":" + g2.toString() + "(" + tiebreak + ")";
setsPlayerTwo += 1;
scoreline.push(result);
} else if (g1 === 7 && g2 === 6) {
var result = g1.toString() + ":" + g2.toString() + "(" + tiebreak + ")";
setsPlayerTwo += 1;
scoreline.push(result);
}
}
}
playTheGame(gamesPlayerOne,gamesPlayerTwo);
console.log(scoreline);
例如,當g1等於0且g2等於7時,您沒有指定任何條件來增加setsPlayer [One / Two]。
因此,您應該添加一些條件進行檢查。
如果傳遞給函數的隨機數與任何if
或else if
條件都不匹配,則不會更新任何變量,因此while
循環的條件將永遠保持為真。
如果您要模擬整個網球比賽,則最好不要將任何參數傳遞給函數,而是在while
循環的每次迭代中隨機確定哪個球員剛剛贏得了當前比賽,然后測試其中一位球員是否贏得了比賽。一套,也許像這樣:
function playTheGame() { var g1 = 0; var g2 = 0; var setsPlayerOne = 0; var setsPlayerTwo = 0; var scoreline = []; while (setsPlayerOne < 2 && setsPlayerTwo < 2) { // determine a random winner for the current game if (Math.random() < 0.5) g1++; else g2++; // has one of the players just won a set? if (g1 >= 6 && g2 < g1 - 1) { var result = g1 + ":" + g2; setsPlayerOne += 1; scoreline.push(result); g1 = g2 = 0; } else if (g1 < g2 - 1 && g2 >= 6) { var result = g1 + ":" + g2; setsPlayerTwo += 1; scoreline.push(result); g1 = g2 = 0; } } return scoreline; } console.log(playTheGame());
請注意,您不需要在g1
和g2
上調用.toString()
,因為將它們與字符串":"
串聯會隱式將數字轉換為字符串。
您可以通過將if (Math.random() < 0.5)
改為使用變量而不是硬編碼0.5
來擴展此范圍,以使一個或另一個玩家更有可能獲勝(模擬不同的技能水平)。
附言:我無須費心查找網球規則以確認您如何贏得比賽,但我模糊的回憶是,您必須至少獲得6場比賽, 並且至少領先另一位球員2場比賽,所以我展示的代碼試圖實現什么...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.