Логика для золота, серебра, бронзы - PullRequest
0 голосов
/ 25 января 2011

Я создаю игру в javascript и генерирую свои результаты.

var score = array("5", "5", "1");

Таким образом, у игрока 1 - 5, у игрока 2 - 5, а у игрока 3 - 1.

Я хочу отображать свои результаты в 3-х уровнях - Золото, Серебро и Бронза, однако, если два верхних результата совпадают, я хочу, чтобы они оба были золотыми, оставляя серебро с самым низким счетом.

Каков наилучший способ решить эту проблему с помощью JavaScript?

В идеале мой массив результатов для этого конкретного набора оценок должен выглядеть следующим образом:

var results = array("gold", "gold", "silver");

Спасибо.

Ответы [ 5 ]

1 голос
/ 25 января 2011

Вот код, который делает это:

var scores = [5, 8, 1];
scores.sort(function(a, b) {
    return (a > b) ? 1 : ((a < b) ? -1 : 0);
}).reverse();
var medals = {};
var medalsUsed = 0;
var availableMedals = ['Gold', 'Silver', 'Bronze'];
for(var i = 0; i < scores.length; i++) {
    var score = scores[i];
    var medal;
    if(medals[score]) { // already have a medal for this score value? use it
        medal = medals[score];
    }
    else { // use next available medal
        if(i >= 3) return; // but not if we've already given out 3 medals
        medal = availableMedals.shift();
        medals[score] = medal;
    }

    alert('medal for ' + i + ': ' + medal);
}

Демонстрация: http://jsfiddle.net/ASdb8/1/

1 голос
/ 25 января 2011

Я бы сначала отсортировал массив, а затем сравнил значения (1 с 2 и 2 с 3).Чтобы отсортировать массив чисел, вам нужно передать функцию сортировки другую функцию в качестве аргумента.

var medals = ['Gold', 'Silver', 'Bronze']; 

score = score.sort(compare);

//Return descending order
function compare(a,b){
    return b-a;
}

results[0] = medals.shift();
//I'm assuming you only want top 3  scores    
for(var i = 1; i < 3; i++){
    if(score[i] == score[i-1]){
        results[i] = results[i-1];
    }else{
        results[i] = medals.shift();
    }
}

Этот код сортирует баллы, и, если любое из них равно, устанавливает то же значение медалиодин перед ним.

Подтверждение концепции: http://jsfiddle.net/Fttmj/1/

0 голосов
/ 25 января 2011

еще один метод

var results = ['Gold', 'Silver', 'Bronze'];
var arr = [5, 5, 5];
arr.sort().reverse();
var currentScore = arr[0];
var idx = 0;
for(var i=0; i< arr.length; i++){
    if(arr[i]!= currentScore){
        idx++;
        currentScore = arr[i];
    }
    alert(arr[i]+ ' has ' + results[idx] + ' medal');
}

обновление: скрипка здесь

0 голосов
/ 25 января 2011

Другое решение - использовать функцию max () в Javascript, а затем сравнивать баллы золото / серебро и бронза / серебро. если золото и серебро равны, замените серебро на золото и бронзу на серебро, а если серебро и бронзу равны, замените бронзу на серебро.

0 голосов
/ 25 января 2011

Первый цикл по массиву и определение самого высокого и следующих двух самых высоких баллов.

Затем прокрутите счет игроков и присвойте «Золото» любому баллу, который соответствует наибольшему баллу, «Серебро» - любому баллу, который соответствует второму по величине, и «Бронзу» - любому баллу, который соответствует третьему наивысшему баллу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...