Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Ты отправляешь FindGame
- PlayerId = 1 - Выдан тебе после GetProfile
- GameMode = 1 - [1 - MpClassic, 2 - MpBlitz, 3 - MpNormal]
- Соответственно ты шлешь FindGame с какой-нибудь периодичностью. В первом запросе я проверю, чтобы игрок с таким PlayerId не находился в очереди.
- Если игрок в очереди - Выполняю проверку и в зависимости от результата возвращаю Searching или Established
- Если игрок не в ЛФГ - добавляю в него и возвращаю Searching
- Если ты захочешь послать FindGame с тем же PlayerId, но другим GameMode - я не буду обращать на GameMode внимание и просто буду выполнять проверку игры
- Каждый твой запрос будет вызывать проверку найденной игры для игрока.
- Если игра не найдена - я возвращаю
- Сode = ResponseCode.Searching
- EloYours = 1234
- EloEnemy = null
- Id = null
- Если игра найдена - возвращаю
- Code = ResponseCode.Established
- EloYours = 1234
- EloEnemy = 1277
- Id = 1
- Еще я не помню где у нас возвращается ник соперника. Если что, можно тоже здесь.
- Переменные
- minLfgTime = 20*1000; - минимальное время нахождения в ЛФГ - 20 сек
- minLfgEloDiff = 50; - минимальная разница в эло для игрока
- lfgEloDiffIncrease = 25; - приращение эло
- Система должна по входному эло игрока находить игру к которой можно присоединиться, с учетом того, что
- 1) Человек должен стоять в очереди как минимум 10-20 секунд
- 2) Начальная разница в эло не должна быть больше ±50
- 3) через каждую минуту, если игра не найдена, разница в эло должна увеличиваться на 25*((кол-во минут)*(кол-во минут))
- 0-1 минута ±50 - 0 минут => ±(50+25*0*0) = ±(50+25*0) = ±(50)
- 1-2 минута ±75 - 1 минута => ±(50+25*1*1) = ±(50+25*1) = ±(50+25)
- 2-3 минута ±150 - 2 минуты => ±(50+25*2*2) = ±(50+25*4) = ±(50+100)
- 3-4 минута ±275 - 3 минуты => ±(50+25*3*3) = ±(50+25*9) = ±(50+225)
- 4-5 минута ±450 - 4 минуты => ±(50+25*4*4) = ±(50+25*16) = ±(50+400)
- ...
- n-n+1 минута ±(minLfgEloDiff+lfgEloDiffIncrease*n*n)
- 4) Всегда должна выбираться игра с наименьшей разницей эло
- Детали реализации
- 1) У игроков есть:
- а) Время нахождения в очереди
- б) Эло конкретного игрока
- в) Нижняя граница диапазона эло(можно рассчитывать из эло конкретного игрока + времени)
- г) Верхняя граница диапазона эло(аналогично)
- д) Идентификатор игрока
- 2) Лист игроков в ЛФГ
- а) Игроки отсортированы по эло от меньшего к большему
- Как производится поиск?
- Берем игрока и проходимся по остальному листу игроков
- Проверяем чтобы игрок, которого мы взяли простоял в очереди как минимут minLfgTime
- Проверяем чтобы игрок, которого мы взяли не равнялся игроку, с которым мы будем проводить сравнение
- Если выбранный игрок == игрок из листа - пропускаем игрока из листа и берем следующего
- Если выбранный игрок != игрок из листа - продолжаем проверку
- Если диапазон эло выбранного игрока пересекается с диапазоном эло игрока из листа - пара найдена
- Если диапазон эло не пересекается - переходим к следующему игроку
- Как сравнивать диапазоны?
- https://stackoverflow.com/a/13513973
- Player1.EloStart <= Player2.EloEnd && Player2.EloStart <= Player1.EloEnd
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement