Stepashka20
@Stepashka20
(☞゚ヮ゚)☞

Как реализовать определённые функции в кликере?

Есть кликер.В котором 2 функции:
1)Накопление валюты за ручное кликанье
2)Автоматическое начисление валюты (например, раз в 1 секунду)

Все эти действия должны быть скоординированы с сервером.С кликаньем я решил как.При клике отправляю запрос на сервер,что я кликнул.Также, на стороне клиента,я с помощью JS просто прибавляю к сумме кликов ещё 1 клик(чтобы не было задержек,ведь запрос на сервер и ответ приходят не моментально).
Но также есть автоматическое начисление валюты.Каждую секунду сервер мне присылает итоговый баланс,на котором моя сумма + начисленный автоматически клик. И здесь получается разногласие:
Я очень быстро кликнул 20 раз
Сервер успел принять только 5 и их засчитал.
Автоматическое начисление валюты начислило мне клики к итоговой сумме за ЭТИ 5 кликов.
И тогда на клиенте будет следующие:
Сначала отобразится 20 кликов.Затем появится цифра 5 (так как автоматическое начисление валюты сработало при 5 запросе).А затем опять 20 (так как сервер уже успел принять все 20 кликов и автоматическое начисление валюты уже происходит на 20 клик).
Теперь вопрос.Как мне реализовать этот кликер без таких задержек?Не могу же я делать всё на клиенте,так как может произойти рассинхронизация в валюте.
  • Вопрос задан
  • 139 просмотров
Решения вопроса 1
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Зачем вообще данные с сервера отображать на клиенте? Считайте все локально - и клики и прибавления по таймеру. Единственная причина, которую я могу придумать, зачем вам это может быть нужно - это борьба с читерами.

Для этого отправляйте раз в секунду все действия пользователя на сервер (клики, нажатия кнопок покупок бонусов). Сервер должен повторить всю логику (прибавить клики, автоматические таймеры, включить всякие бонусы, если очков хватает) и отправить назад результирующие очки пользователя к той секунде. Клиент должен при отправке запомнить, сколько у него было очков и при получении ответа сравнить его с тем, что получил от сервера. Если есть расхождение то разница прибавляется к текущему количеству очков.

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

Если клиент не читерит, то все всегда сойдется и никаких проблем не будет. Если же он читерит, то можно прекращать работу или обновлять состояние до того, что говорит сервер ( пользователь секунду будет видеть какие-то бонусы или кучу очков).

Записи в базу данных о рекорде очков, о ачивках или что вы там защитить хотите, сервер делает только согласно своему видению состояния игры. Игрок себе может что угодно нарисовать, и тут вы ему никак не помешаете.

Если же вы хотите какую-то формулу или логику спрятать исключительно на сервере, то без задержек тут ничего не сделать.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
mwizard
@mwizard
Ознакомьтесь с разделом про server reconciliation вот в этом цикле статей — https://www.gabrielgambetta.com/client-side-predic... — и для общего образования прочитайте его целиком, там совсем чуть-чуть и все написано очень простым языком.
Ответ написан
Ваш ответ на вопрос

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

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