nepster-web
@nepster-web

Сравнение пользователей и просчет рейтинга?

Есть массив:

[users] => Array
        (
            [0] => Array
                (
                    [hash] => de2983f989ccf1ea09d1e29a0465fb51
                    [earn] => 32
                )

            [1] => Array
                (
                    [hash] => ef21eb9ea4b5dc9f359024198bf40742
                    [earn] => 23
                )

            [2] => Array
                (
                    [hash] => fff294012895b487157efd570232f0fc
                    [earn] => 22
                )

            [3] => Array
                (
                    [hash] => 3bf51dd7bb302ccf81e335879b97bc5b
                    [earn] => 12
                )

        )


К примеру 4 пользователя играли в игру, игра закончилось и нужно подвести итоги, а именно записать кучу логов в историю и посчитать всем рейтинг.

hash - идентификатор пользователя
earn - достижения в игре. К примеру очки.

Прежде всего входящий массив я сортирую по достижениям:
usort($enter_data['users'], function($a, $b) {
            if ($a['earn'] == $b['earn']) {
                return 0;
            }
            return ($a['earn'] > $b['earn']) ? -1 : 1;
        });


Дальше есть вопросы как продолжать работать с массивом. А именно:
К примеру закончилась игра в карты на 4 игроков, пришел массив с их очками, мы его отсортировали (от большего к меньшему) и нам нужно определить победителя(лей).

1) Как лучше оптимально определить победителя
у нас есть флаг ($allocationToWinner = true or false)
true - победитель тот кто набрал большее кол-во очков. даем ему 100% рейтинга
false - победитель 1 и 2 место, отношение рейтинга 70 / 30 (1 место получает 70%, 2 30% рейтинга)

2) если пользователи набрали очки к примеру вот так (тут $allocationToWinner игнорируется):
user1 = 50
user2 = 50
user3 = 20
user4 = 20
В таком случае, нужно user1 и user2 дать по 50% рейтинга и сделать флаг, о том что ничья у user1 и user2

3) если пользователи набрали очки к примеру вот так ($allocationToWinner = true, отдаем весь рейтинг user1, $allocationToWinner = false, делим 30% рейтинга между user2 и user3):
user1 = 50
user2 = 40
user3 = 40
user4 = 20

В чем возникли сложности:
Пробовал все это сделать в 1 цикле, в результате вышло очень много проверок и сам же в них запутался.

Подскажите пожалуйста как лучше всего выполнить вышенаписанные действия ?
  • Вопрос задан
  • 2605 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы