簡體   English   中英

While循環忽略初始條件,瀏覽器崩潰

[英]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]。

因此,您應該添加一些條件進行檢查。

如果傳遞給函數的隨機數與任何ifelse 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()); 

請注意,您不需要在g1g2上調用.toString() ,因為將它們與字符串":"串聯會隱式將數字轉換為字符串。

您可以通過將if (Math.random() < 0.5)改為使用變量而不是硬編碼0.5來擴展此范圍,以使一個或另一個玩家更有可能獲勝(模擬不同的技能水平)。

附言:我無須費心查找網球規則以確認您如何贏得比賽,但我模糊的回憶是,您必須至少獲得6場比賽, 並且至少領先另一位球員2場比賽,所以我展示的代碼試圖實現什么...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM