Клиентское противодействие в многопользовательской игре 1vs1

8

Я разрабатываю простую карточную игру, в которой будет система сватовства, которая поставит вас против другого игрока. Это будет единственный доступный игровой режим, 1 на 1 против другого человека, без ИИ.

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

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

* (только те, кого они могут проверить, не позволяя себе обманывать! например: они не могут проверить, была ли разыгранная карта в руке, потому что им нужно будет знать все карты в руке)

Подводя итог, мои вопросы : это жизнеспособный подход? я действительно буду экономить ресурсы, делая это, или дополнительная сложность на сервере и клиенте для обмена этими сообщениями не стоит? Знаете ли вы какую-нибудь игру, которая успешно или безуспешно пробовала подобный подход?

Спасибо всем за чтение и ответы

garcianavalon
источник
Конечно, тогда вам нужно будет проверить эти проверки на стороне клиента ...
ThorinII
да, идея заключается в том, чтобы сохранить некоторые проверки, проверяя только те проверки на стороне клиента, а не все действия. Но, как сказал Филипп, это, вероятно, преждевременная оптимизация
garcianavalon

Ответы:

8

В зависимости от сложности вашей игры, проверка законности действия может потребовать возврата больших частей игры. Пример: игрок A говорит, что игрок B не может разыграть эту карту прямо сейчас, потому что у него нет ResourceX. PlayerB говорит, что у него много ResourceX. Кто прав? Чтобы выяснить это, вы должны снова смоделировать всю игру от начала до конца, чтобы подсчитать ResourceX, который есть у PlayerB прямо сейчас. Так что только проверка действий игроков, когда кто-то кричит «фол», на самом деле не может быть такой уж оптимизацией.

Но стоит ли оно того?

Я думаю, что у вас может быть случай преждевременной оптимизации здесь. Хотя я не знаю точно, чем вы занимаетесь, карточная игра, как правило, не столь затратна в вычислительном отношении на стороне сервера.

Карточные игры обычно разрабатываются так, чтобы в них можно было играть без поддержки компьютера, поэтому их игровая механика обычно достаточно проста в вычислительном отношении, чтобы ее могли выполнять люди * Кроме того, игрокам-людям обычно требуется несколько секунд, чтобы сделать ход, что для сервера кажется вечностью. Это означает, что ваш сервер выполняет только легкие задачи каждые несколько секунд за игру. Я не знаю, сколько одновременных игроков вы ожидаете, но пока вы все еще находитесь в масштабе некоммерческого хобби-проекта, я сомневаюсь, что даже самый дешевый сервер, который вы можете найти, не сможет справиться с этим. При условии, конечно, что вы знаете, как эффективно программировать.

*) до тех пор, пока вы исключаете принятие решений игроками. Большинство игр основаны на предпосылке, что теоретически можно рассчитать идеальную выигрышную стратегию, но сделать это настолько сложно, что игроки и зачастую даже компьютеры не могут этого сделать, поэтому им необходимо использовать интуицию. Но вы сказали, что не хотите ИИ и хотите только «игрок против игрока», так что это выходит за рамки этого вопроса. Но это также заставляет задуматься о другом аспекте мошенничества: рассматривали ли вы игрока, использующего программу, чтобы помочь им в принятии решений? Как тот, который говорит им точную вероятность того, что у противника есть определенная карта на руке?

Philipp
источник
Я думаю, что вы правы, я пытаюсь избежать перегрузки сервера, прежде чем перегрузить. Тот факт, что вы ответили на мой вопрос тем же вопросом (действительно ли оно того стоит), суммирует его довольно хорошо
garcianavalon
Что касается других посетителей, обратите внимание, что, если они фактически не взаимодействуют с игровым кодом (и, возможно, даже тогда), способность обнаруживать внешнюю программу, предоставляющую «вероятностную» помощь, по существу равна нулю.
Заводная муза
4

«Я хочу предотвратить мошенничество как можно больше». - Так скажем, мы все. :)

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

Это: двойное тестирование на наличие ошибок, которые позволят игрокам выполнять любые незаконные действия, и отправка только зашифрованных данных (через https или пользовательское шифрование), а также шифрование самого приложения, чтобы сделать взлом более трудным. Вот и все.

Игроки, скорее всего, обманывают через ошибки в игре, чем что-либо еще.

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

Если, конечно, вы не имеете в виду реальные деньги и реальные призы.

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

По сути, я говорю, что 100% ваших игроков не будут обманывать, если это невозможно из-за воспроизводимой ошибки и / или ваше приложение не очень популярно. Если ваше приложение станет очень популярным, менее 1% ваших игроков будут обманывать так, как вы даже не можете себе представить.

Таким образом, что касается мошенничества, вы должны защищать себя от очевидных читов (ошибок, шифрования как приложения, так и потока IP) и реагировать только на реальные читы, о которых вы узнали, и обращаться к ним напрямую. Что вам действительно нужно, так это регистрировать все действия игрока, проверять их на сервере и, если вы обнаружите незаконное действие, которое происходит довольно часто, выясните, почему. Может быть ошибкой, может быть эксплойтом, может быть техническим взломом.

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

LearnCocos2D
источник
спасибо, очень хороший ответ тоже. Нет смысла тратить время на то, чтобы найти лучшее решение для борьбы с мошенничеством, в то же время имея уязвимые ошибки. Я буду работать над основными вещами, в которых каждая игра нуждается в защите, а затем устранять возникающие проблемы, а не наоборот!
garcianavalon
0

Я думаю, что вы столкнулись с некоторыми другими проблемами здесь. Что, если игрок притворяется нормальным клиентом (имитируя ваш сетевой трафик) и использует его, чтобы испортить вашу игру из-за неправильной проверки?

Вместо того чтобы пытаться создать пуленепробиваемую клиентскую систему, которая приведет вас к постоянному исправлению ошибок и эксплойтов, а также к бану, я бы попытался упростить систему серверов. Я не знаю достаточно о вашей игровой механике, но, возможно, вы сможете свести информацию на сервере к минимуму.

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

floAr
источник
0

Это немного зависит от того, что вы считаете изменой. Это использует инструмент, чтобы сделать / рассчитать ходы? Это менять колоду карт во время игры? Первым делом будет сложно заняться. Во втором случае вы можете подумать о том, чтобы каждый пользователь вставил свои карточки и создал хеш-код, который отображается с обеих сторон. В конце сервер может вычислить хэш с оставшимися сыгранными картами и картами. Если хеш не совпадает, то пользователь обманул. Если правила не были соблюдены, то вы можете проверить это и на своем сервере. Вы можете сделать это по запросу пользователя для экономии ресурсов. Нет информации о картах становятся доступными. Чтобы сделать генерацию хеша немного более уникальной / сложной, вы можете включить имя пользователя в хеш.


источник