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

 Есть кликер.В котором 2 функции:  

1)Накопление валюты за ручное кликанье  

2)Автоматическое начисление валюты (например, раз в 1 секунду)  

  

Все эти действия должны быть скоординированы с сервером.С кликаньем я решил как.При клике отправляю запрос на сервер,что я кликнул.Также, на стороне клиента,я с помощью JS просто прибавляю к сумме кликов ещё 1 клик(чтобы не было задержек,ведь запрос на сервер и ответ приходят не моментально).  

Но также есть автоматическое начисление валюты.Каждую секунду сервер мне присылает итоговый баланс,на котором моя сумма + начисленный автоматически клик. И здесь получается разногласие:  

Я очень быстро кликнул 20 раз  

Сервер успел принять только 5 и их засчитал.  

Автоматическое начисление валюты начислило мне клики к итоговой сумме за ЭТИ 5 кликов.  

И тогда на клиенте будет следующие:  

Сначала отобразится 20 кликов.Затем появится цифра 5 (так как автоматическое начисление валюты сработало при 5 запросе).А затем опять 20 (так как сервер уже успел принять все 20 кликов и автоматическое начисление валюты уже происходит на 20 клик).  

Теперь вопрос.Как мне реализовать этот кликер без таких задержек?Не могу же я делать всё на клиенте,так как может произойти рассинхронизация в валюте. 

 Зачем вообще данные с сервера отображать на клиенте? Считайте все локально - и клики и прибавления по таймеру. Единственная причина, которую я могу придумать, зачем вам это может быть нужно - это борьба с читерами.   

  

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

  

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

  

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

  

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

  

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

 Ознакомьтесь с разделом про server reconciliation вот в этом цикле статей — [https://www.gabrielgambetta.com/client-side-predic...](https://www.gabrielgambetta.com/client-side-prediction-server-reconciliation.html) — и для общего образования прочитайте его целиком, там совсем чуть-чуть и все написано очень простым языком.