2015-08-19 52 views
-1

我正在學習JS,我正在製作應用程序以查找高爾夫遊戲中每個洞的獲勝者。較少擊球的球員是該洞的贏家,但有時候不止一名球員可以用相同的數字來打洞,所以,爲了找到洞的勝者,我需要評估來自並列球員的杆數下一個洞並打破領帶,如果領帶持續存在,我需要評估下一個洞等等。休息領帶功能js

foo函數應該返回一個數組,其索引,位置或名稱來自洞中的勝者(如果領帶不可能中斷)。

這裏是我的代碼:

var players = [ 
    "Jug 1", 
    "Jug 2", 
    "Jug 3", 
    "Jug 4" 
]; 

var arrHoyos = [ 
    [4, 3, 3, 4], 
    [4, 5, 4, 5], 
    [4, 4, 5, 6] 
]; 

function foo(array) { 
    var arrWinners = []; 
    //arrHoyos 
    for (var i = 0, len = array.length; i < len; i++) { 
     var arr = array[i]; 
     var arr2 = array[(i + 1) % array.length]; 
     var pos = 0; 
     var min = 0; 
     var tie = false; 
     var temp = []; 
     var temp2 = []; 
     min = Math.min.apply(null, arr); 
     //arr 
     for (var j = 0, len2 = arr.length; j < len2; j++) { 
      if (min == arr[j]) { 
       temp.push(arr.indexOf(min, j)); 
      } 
     } 
     if (temp.length > 1) { 
      tie = true; 
      var counter = 0; 
      while (tie == true) { 
       for (var count = 0; count < temp.length; count++) { 
        pos = temp[count]; 
        temp2[count] = arr2[pos]; 
       } 
       min = Math.min.apply(null, temp2); 
       for (var count2 = 0; count2 < temp.length; count2++) { 
        if (temp2[count2] != min) { 
         temp.slice(count2, 1); 
        } 
       } 
       if (temp.length == 1 || counter == array.length) { 
        tie = false; 
       } 
       counter++; 
      } 
     } 
     arrWinners[i] = players[temp[0]]; 
     console.log(temp, temp2); 
     console.log(arrWinners[i]); 
    } 
} 

foo(arrHoyos); 

Chrome的控制檯結果:

[1, 2] [5, 4] 
Jug 2 
[0, 2] [4, 5] 
Jug 1 
[0, 1] [4, 3] 
Jug 1 
+0

現在的代碼有什麼問題? –

+0

我得到這個結果: – Devsalad

+0

這是不完整的,我只是得到每個洞最好成績的位置(索引)。我需要連接這些位置的值(temp)以及下一個洞(數組)中這些索引的值,以便只用一個索引來打破實際的綁定和左邊的temp數組。 – Devsalad

回答

1

這裏的主要問題是,你正在使用slice代替splice。甚至可能是一個錯字。在循環內使用temp2時,您可能不會增加整個索引。我有一種感覺,它總是下一個洞。

旁註/建議:

  1. 瞭解如何使用調試器。
  2. 爲變量使用有意義的名稱。 temp,temp2,arr等都不好。

編輯:包括與正確splice使用

var players = [ 
    "Jug 1", 
    "Jug 2", 
    "Jug 3", 
    "Jug 4" 
]; 

var arrHoyos = [ 
    [4, 3, 3, 4], 
    [4, 5, 4, 5], 
    [4, 4, 5, 6] 
]; 

function foo(array) { 
    var arrWinners = []; 
    //arrHoyos 
    for (var i = 0, len = array.length; i < len; i++) { 
     var arr = array[i]; 
     var arr2 = array[(i + 1) % array.length]; 
     var pos = 0; 
     var min = 0; 
     var tie = false; 
     var temp = []; 
     var temp2 = []; 
     min = Math.min.apply(null, arr); 
     //arr 
     for (var j = 0, len2 = arr.length; j < len2; j++) { 
      if (min == arr[j]) { 
       temp.push(arr.indexOf(min, j)); 
      } 
     } 
     if (temp.length > 1) { 
      tie = true; 
      var counter = 0; 
      while (tie == true) { 
       for (var count = 0; count < temp.length; count++) { 
        pos = temp[count]; 
        temp2[count] = arr2[pos]; 
       } 

       min = Math.min.apply(null, temp2); 
       for (var count2 = 0; count2 < temp.length; count2++) { 
        if (temp2[count2] != min) { 
         temp.splice(count2, 1); 
        } 
       } 
       if (temp.length == 1 || counter == array.length) { 
        tie = false; 
       } 
       counter++; 
      } 
     } 
     arrWinners[i] = players[temp[0]]; 
     console.log(temp, temp2); 
     console.log(arrWinners[i]); 
    } 
} 

foo(arrHoyos); 
+0

謝謝,我會觀看一些調試視頻並嘗試修復它。 – Devsalad

+0

太棒了,'splice'工作正常,我會測試當關系不可能中斷時會發生什麼。謝謝。 :) – Devsalad

1

我得到了答案實際的代碼,謝謝DANIL,你的幫助是有益的。 :)

var players = [ 
    "Jug 1", 
    "Jug 2", 
    "Jug 3", 
    "Jug 4" 
]; 

var arrFieldStrokes = [ 
    [3, 3, 3, 3], 
    [5, 5, 5, 5], 
    [5, 6, 5, 5], 
    [5, 7, 6, 5], 
    [4, 5, 5, 4], 
    [4, 5, 6, 8], 
    [4, 6, 6, 5], 
    [4, 5, 9, 5], 
    [4, 4, 4, 4] 
]; 

function breakTie(hole, arrTiedPlayers, arrField) { 
    for (var i = 0; i < arrField.length; i++) { 
     var min = 0, count = 0; arrNextScore = []; 
     for (var j = 0; j < arrTiedPlayers.length; j++) { 
      arrNextScore[j] = arrField[(hole + i + 1) % arrField.length][arrTiedPlayers[j]]; 
     } 
     min = Math.min.apply(null, arrNextScore); 
     count = arrNextScore.length; 
     while (count--) { 
      if (arrNextScore[count] != min) { 
       arrTiedPlayers.splice(count, 1); 
      } 
     } 
     if (arrTiedPlayers.length == 1) { 
      return players[arrTiedPlayers[0]]; 
     } 
    } 
    var tiePlayers = []; 
    for (var c = 0; c < arrTiedPlayers.length; c++) { 
     tiePlayers[c] = players[arrTiedPlayers[c]]; 
    } 
    return tiePlayers; 
} 

function winners(arrField) { 
    var arrWinners = []; 
    for (var i = 0; i < arrField.length; i++) { 
     var min = 0, arrTiedPlayers = []; 
     min = Math.min.apply(null, arrField[i]); 
     for (var j = 0; j < arrField[i].length; j++) { 
      if (arrField[i][j] == min) { 
       arrTiedPlayers.push(arrField[i].indexOf(min, j)); 
      } 
     } 
     if (arrTiedPlayers.length == 1) { 
      arrWinners[i] = players[arrTiedPlayers[0]]; 
      console.log("Hoyo-" + (i + 1) + " Winner: " + arrWinners[i]); 
     } 
     else { 
      arrWinners[i] = breakTie(i, arrTiedPlayers, arrField); 
      console.log("Hoyo-" + (i + 1) + " Winner: " + arrWinners[i]); 
     } 
    } 
} 

winners(arrFieldStrokes);