2015-08-19 5 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) и значений этих индексов в следующем отверстии (массиве), чтобы разбить фактический массив привязки и левого темпа только одним индексом. – Devsalad

ответ

1

Основная проблема здесь состоит в том, что вы используете slice вместо splice. Возможно, это была опечатка. Вероятно, вы не увеличиваете весь индекс при использовании temp2 внутри цикла while. У меня такое ощущение, что это всегда следующая дыра.

Боковые примечания/рекомендации:

  1. Научитесь использовать отладчик.
  2. Используйте значащие имена для переменных. temp, temp2, arr и другие не очень хорошие.

EDIT: включает в себя фактический код с правильным 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

Отлично, «сращивание» отлично работает, я проверю, что происходит, когда галстуки невозможно сломать. Благодарю. :) – Devsalad

1

я получил ответ, спасибо Данил, ваша помощь была полезной. :)

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

 Смежные вопросы

  • Нет связанных вопросов^_^