Задать вопрос
@Shavadrius

Как определить игрока быстрее всех нажавшего кнопку (web)?

Добрый день!
Для одного пет-проекта возникла потребность реализовать справедливый/честный алгоритм определения самого быстрого нажатия на кнопку. В чем суть: есть несколько игроков, которые присоединены к одному серверу и в какой-то момент времени они все могут нажать кнопку и нужно определить, кто был первым.
Если бы был какой-то сигнал, то можно было бы вычислять разницу между подачей сигнала на браузере и нажатием кнопки в браузере и прикреплять эту информацию к сообщению, которое отправляется на сервер. На сервере же просто замерять разницу между временем отправки сигнала игрокам и времени ответа от каждого игрока. Получили бы "серверное" время и "клиентское" время и как-то от этого плясать.
Но если нажатие игрока может происходить в любой момент времени, то непонятно от чего измерять время на клиенте. Лучшее что я придумал, это посылать от сервера на клиент "временные метки" раз в 5-10 секунд, а в ответ на нажатие присылать разницу во времени между нажатием и получением последней временной метки.

Но может есть какие-то другие способы решения?
  • Вопрос задан
  • 232 просмотра
Подписаться 1 Средний 3 комментария
Решения вопроса 1
@Akina
Сетевой и системный админ, SQL-программист.
Я вижу решение, близкое к желаемому.

Сначала, при старте клиентского интерфейса, выполняется несколько (навскидку - может, и 10 достаточно, а, может, и 100 потребуется, следует определить экспериментально) передач с клиента на сервер, причём используется тот же протокол, который будет впоследствии использован для передачи информации о нажатии, и в каждой передаче в том числе передаётся точное время клиента (с максимально доступной точностью). Приходящие пакеты маркируются точным штампом времени получения (серверное время), с максимально доступной точностью. Полученный массив обрабатывается статистически, и определяется разница точного времени часов клиента и сервера и погрешность этого определения. Если статистическая ошибка велика, процесс повторяется.

Далее, уже в момент нажатия, по той же технологии передаётся пакет с точным клиентским временем нажатия, и по подсчитанной ранее разности определяется точное время нажатия по времени сервера. Для всех клиентов это время сравнивается, и победителем объявляется тот, у кого время нажатия по серверу минимальное.

Такой алгоритм (практически) не зависит от колебания времени доставки пакета от клиента серверу.

Калибровка разности времени при необходимости может повторяться. Частота рекалибровки зависит достижимой точности определения локального и серверного времени и от требуемой точности вычисления разности. По моим очень приблизительным прикидкам, если требуемая точность составляет 100 мс, то рекалибровку следует проводить ежечасно.

Если после 2-3 повторений калибровки установить точное значение разности не удалось - клиенту следует отказать в участии.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
trapwalker
@trapwalker
Программист, энтузиаст
Вам, похоже, не нужно какое-то абсолютное время. Достаточно отправить игроку сигнал и замерить локальное время реакции на этот сигнал по времени браузера игрока. Браузер игрока знает локальное время, знает когда пришел сигнал с сервера и знает когда отреагировал пользователь. Осталось отправить на сервер локальное время регистрации пришедшего сигнала от сервера и время реакции игрока.

Минус у схемы только один, через отладочную панель можно жульничать.
Чтобы жульничать было труднее, можно заставить клиенты подключиться к веб-сокету сервера и сигнал с реакцией прокидывать через него. Это тоже не убережет от жульничества с автоматизацией реакции.
Наверно самое безопасное в плане жульничества решение потребовало бы стриминга видеопотока с физической реакцией игрока, а все подозрительные случаи выборочно потом проверять и модерировать людьми покадрово на предмет подделки видеосигнала.
Ответ написан
Комментировать
Sanes
@Sanes
Только на сервере. Если есть возможность реагировать со стороны сервера не сразу, то реализовать несколько серверов. Игроки выбирают ближайший.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы