2016-10-07 51 views
0

長篇故事 - 我試圖構建一個簡單的網球比賽模擬(代碼如下)。不幸的是,我的代碼有些問題,因爲我創建的while循環忽略了放在括號中的條件並開始創建無限數量的行程(瀏覽器崩潰)。你能看看我的代碼,並告訴我錯誤在哪裏?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); 
+0

作爲第一次看,你有嘗試放置'其他'的情況? –

+0

你可以在工作中發佈一個簡單的jsfiddle! –

回答

0

如果您傳遞給你的函數的隨機號碼,使while循環的條件永遠保持真不匹配任何的ifelse if條件則沒有你的變量是不斷更新的。

如果您試圖模擬整個網球比賽,那麼更有意義的是不要將任何參數傳遞給函數,而是在每次迭代循環時隨機決定哪個球員剛剛贏得當前比賽,然後測試if無論是玩家獲勝一組的是,也許是這樣的:

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());

注意,你不需要調用.toString()g1g2,因爲串聯他們與字符串":"隱式地將數字轉換爲字符串。

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

P.S.我不能因爲網球規則來確定你是如何贏得一場比賽而煩惱的,但是我的模糊回憶是,你必須至少有6場比賽至少比其他球員早兩場比賽,所以這就是我所展示的代碼試圖實現...

+0

非常感謝你,作品像一個魅力!我添加了一些額外的條件來預見所有可能的結果(包括搶七局,以五種格式中的最佳決定集等),我對最終結果感到非常滿意。儘管我會擅長JS,但我還是有一段長長的路要走。 – pq89

0

例如......你沒有指定任何條件,增加setsPlayer [單/雙當G1是等於0和G2是等於7

所以,你應該添加一些條件檢查它。