Advertisement
ProTreo

TTT LFG

Sep 5th, 2017
26
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.78 KB | None | 0 0
  1. Ты отправляешь FindGame
  2. PlayerId = 1 - Выдан тебе после GetProfile
  3. GameMode = 1 - [1 - MpClassic, 2 - MpBlitz, 3 - MpNormal]
  4.  
  5. Соответственно ты шлешь FindGame с какой-нибудь периодичностью. В первом запросе я проверю, чтобы игрок с таким PlayerId не находился в очереди.
  6. Если игрок в очереди - Выполняю проверку и в зависимости от результата возвращаю Searching или Established
  7. Если игрок не в ЛФГ - добавляю в него и возвращаю Searching
  8. Если ты захочешь послать FindGame с тем же PlayerId, но другим GameMode - я не буду обращать на GameMode внимание и просто буду выполнять проверку игры
  9.  
  10. Каждый твой запрос будет вызывать проверку найденной игры для игрока.
  11. Если игра не найдена - я возвращаю
  12. Сode = ResponseCode.Searching
  13. EloYours = 1234
  14. EloEnemy = null
  15. Id = null
  16.  
  17. Если игра найдена - возвращаю
  18. Code = ResponseCode.Established
  19. EloYours = 1234
  20. EloEnemy = 1277
  21. Id = 1
  22.  
  23. Еще я не помню где у нас возвращается ник соперника. Если что, можно тоже здесь.
  24.  
  25. Переменные
  26. minLfgTime = 20*1000; - минимальное время нахождения в ЛФГ - 20 сек
  27. minLfgEloDiff = 50; - минимальная разница в эло для игрока
  28. lfgEloDiffIncrease = 25; - приращение эло
  29.  
  30. Система должна по входному эло игрока находить игру к которой можно присоединиться, с учетом того, что
  31. 1) Человек должен стоять в очереди как минимум 10-20 секунд
  32. 2) Начальная разница в эло не должна быть больше ±50
  33. 3) через каждую минуту, если игра не найдена, разница в эло должна увеличиваться на 25*((кол-во минут)*(кол-во минут))
  34. 0-1 минута ±50 - 0 минут => ±(50+25*0*0) = ±(50+25*0) = ±(50)
  35. 1-2 минута ±75 - 1 минута => ±(50+25*1*1) = ±(50+25*1) = ±(50+25)
  36. 2-3 минута ±150 - 2 минуты => ±(50+25*2*2) = ±(50+25*4) = ±(50+100)
  37. 3-4 минута ±275 - 3 минуты => ±(50+25*3*3) = ±(50+25*9) = ±(50+225)
  38. 4-5 минута ±450 - 4 минуты => ±(50+25*4*4) = ±(50+25*16) = ±(50+400)
  39. ...
  40. n-n+1 минута ±(minLfgEloDiff+lfgEloDiffIncrease*n*n)
  41. 4) Всегда должна выбираться игра с наименьшей разницей эло
  42.  
  43. Детали реализации
  44. 1) У игроков есть:
  45. а) Время нахождения в очереди
  46. б) Эло конкретного игрока
  47. в) Нижняя граница диапазона эло(можно рассчитывать из эло конкретного игрока + времени)
  48. г) Верхняя граница диапазона эло(аналогично)
  49. д) Идентификатор игрока
  50. 2) Лист игроков в ЛФГ
  51. а) Игроки отсортированы по эло от меньшего к большему
  52.  
  53. Как производится поиск?
  54. Берем игрока и проходимся по остальному листу игроков
  55. Проверяем чтобы игрок, которого мы взяли простоял в очереди как минимут minLfgTime
  56. Проверяем чтобы игрок, которого мы взяли не равнялся игроку, с которым мы будем проводить сравнение
  57. Если выбранный игрок == игрок из листа - пропускаем игрока из листа и берем следующего
  58. Если выбранный игрок != игрок из листа - продолжаем проверку
  59. Если диапазон эло выбранного игрока пересекается с диапазоном эло игрока из листа - пара найдена
  60. Если диапазон эло не пересекается - переходим к следующему игроку
  61.  
  62. Как сравнивать диапазоны?
  63. https://stackoverflow.com/a/13513973
  64. Player1.EloStart <= Player2.EloEnd && Player2.EloStart <= Player1.EloEnd
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement