Estou desenvolvendo um jogo de cartas simples, onde haverá um sistema de matchmaking que o colocará contra outro jogador humano. Este será o único modo de jogo disponível, um 1vs1 contra outro humano, sem IA.
Eu quero evitar trapacear o máximo possível. Eu já li muitas perguntas semelhantes aqui e já sei que não posso confiar no cliente e preciso fazer todas as verificações no lado do servidor. Pretendo ter um servidor (preciso de um para a partida de qualquer maneira) e pretendo fazer algumas verificações no lado do servidor, mas se eu quiser verificar tudo do lado do servidor, isso fará com que meu servidor seja capaz de acompanhar o estado de todos os jogos atuais e verifique todas as ações e não tenho dinheiro / infraestrutura para suportar esse servidor.
Minha idéia é fazer com que os clientes verifiquem e verifiquem algumas das ações feitas pelo oponente * e, se encontrarem alguma ação ilegal, notifiquem a possível trapaça no servidor e façam com que o servidor a verifique. Isso ainda exigirá que meu servidor acompanhe todos os jogos atuais, mas poupará recursos apenas verificando algumas coisas que não podem ser verificadas no lado do cliente (como a ordem das cartas no baralho) e apenas outras coisas quando estiverem erradas.
* (apenas aqueles que eles podem fazer check-out sem se enganar! por exemplo: eles não podem verificar se a carta jogada estava na mão, porque será necessário que eles conheçam todas as cartas na mão)
Resumindo, minhas perguntas são : essa é uma abordagem viável? realmente salvarei recursos fazendo isso ou a complexidade extra no servidor e no cliente para trocar essas mensagens não vale a pena? você conhece algum jogo que tentou com ou sem êxito uma abordagem semelhante?
Obrigado a todos pela leitura e resposta
fonte
Respostas:
Dependendo da complexidade do seu jogo, verificar se uma ação é legal ou não pode exigir o retorno de grandes partes do jogo. Um exemplo: o jogador A diz que o jogador B não pode jogar essa carta agora porque não possui o ResourceX. PlayerB diz que tem bastante ResourceX. Quem está certo? Para descobrir, você simularia o jogo inteiro novamente do início ao fim para contar o ResourceX que o PlayerB possui agora. Portanto, apenas verificar as ações dos jogadores quando alguém grita "falta" pode não ser realmente uma otimização.
Mas o esforço realmente vale a pena?
Eu acho que você pode ter um caso de otimização prematura aqui. Embora eu não saiba exatamente o que você está fazendo, um jogo de cartas geralmente não é tão caro em termos de computação no servidor.
Os jogos de cartas geralmente são projetados para serem jogados sem o suporte do computador; portanto, sua mecânica de jogo é geralmente simples em termos computacionais para ser realizada por humanos *. Além disso, jogadores humanos geralmente levam alguns segundos para fazer uma jogada, que parece uma eternidade para o servidor. Isso significa que seu servidor tem apenas uma tarefa leve para executar a cada poucos segundos por jogo. Não sei quantos jogadores simultâneos você espera, mas enquanto você ainda estiver na escala de um projeto de passatempo não comercial, duvido que mesmo o servidor mais barato que você possa encontrar não possa lidar com isso. Na premissa, é claro, que você sabe programar com eficiência.
*) desde que você exclua a tomada de decisão dos jogadores. A maioria dos jogos é baseada na premissa de que a estratégia ideal de ganhar pode ser teoricamente calculada, mas fazer isso é tão complexa que jogadores e, muitas vezes, até computadores são incapazes de fazê-lo, por isso precisam usar a intuição. Mas você disse que não quer IA e quer apenas jogador contra jogador, portanto isso está fora do escopo desta pergunta. Mas também faz pensar em outro aspecto de trapaça: você considerou um jogador usar um programa para ajudá-lo na tomada de decisões? Como um que lhes diz a probabilidade exata de que o oponente tenha uma determinada carta em mãos?
fonte
"Quero evitar trapacear o máximo possível." - Assim dizemos todos. :)
Talvez uma abordagem mais sensata seja não perder tempo fazendo algo acima e além das medidas razoáveis e geralmente eficazes de combate à fraude.
São eles: teste duplo de bugs que permitiriam aos jogadores executar ações ilegais e enviar apenas dados criptografados (via https ou criptografia personalizada) e criptografar o próprio aplicativo para dificultar a invasão. É isso aí.
É mais provável que os jogadores trapaceiem através de bugs no jogo do que qualquer outra coisa.
Você pode simplesmente fazer melhor, em termos de desenvolvimento, esperar se seus jogadores realmente se importam o suficiente para trapacear. Se o aplicativo não estiver em um "gráfico das 500 maiores" e os trapaceiros não forem simples, os jogadores não se importarão o suficiente para perder seu tempo tentando enganar outras medidas, como modificar o fluxo de IP ou invadir o site. aplicativo.
A menos que você esteja negociando dinheiro real e prêmios reais aqui.
Se seu aplicativo for bem-sucedido e trapacear se tornar um problema, é aí que você deve resolvê-lo. Mas neste momento será um jogo de gato e rato, e os trapaceiros sempre vencerão.
Basicamente, o que estou dizendo é que 100% dos seus jogadores não trapacearão se não for possível através de um bug reproduzível e / ou seu aplicativo não for muito popular. Se seu aplicativo se tornar muito popular, menos de 1% dos seus jogadores trapacearão de maneiras que você nem pode imaginar.
Portanto, no que diz respeito à trapaça, você deve se proteger contra as trapaças óbvias (bugs, criptografar o aplicativo e o fluxo de IP) e reagir apenas às trapaças reais das quais você aprender e abordá-las diretamente. O que você realmente deseja é registrar todas as ações do jogador, fazer com que elas sejam verificadas no servidor e, se você encontrar uma ação ilegal que ocorre com bastante frequência, descubra o porquê. Pode ser um bug, pode ser uma exploração, pode ser um truque técnico.
A medida anti-trapaça mais importante é aprender que os jogadores realmente trapaceiam e como.
fonte
Eu acho que você está enfrentando alguns outros problemas aqui. E se o jogador estiver fingindo ser um cliente normal (simulando o tráfego da rede) e estiver usando para corromper seu jogo por validação incorreta?
Em vez de tentar criar um sistema cliente à prova de balas, o que levará a uma correção e banimento contínuos de bugs / explorações, eu tentaria simplificar o sistema do servidor. Eu não sei o suficiente sobre sua mecânica de jogo, mas talvez você consiga resumir ao mínimo as informações no servidor.
Em geral, você deve presumir que o cliente com quem você está falando pode implantar qualquer código e mecânica de jogo que pareça implantar. E isso torna a validação do lado do cliente quase impossível
fonte
Depende um pouco do que você considera trapaceiro. Está usando uma ferramenta para fazer / calcular os movimentos? É para mudar o baralho de cartas durante o jogo? A primeira coisa será difícil de resolver. No segundo, você pode pensar em fazer com que cada usuário insira seus cartões e faça um código hash que é exibido nos dois lados. No final, o servidor pode calcular o hash com as cartas jogadas e as cartas restantes. Se um hash não corresponder, o usuário trapaceou. Se as regras não foram seguidas, você também pode verificar isso no seu servidor. Você pode fazer isso em uma solicitação do usuário para economizar recursos. Nenhuma informação nos cartões fica disponível. Para tornar a geração do hash um pouco mais exclusiva / complexa, você pode incluir o nome de usuário no hash.
fonte