Para evitar hackers básicos do Cheat Engine que manipulam os valores de suas variáveis, você deve ocultar esses valores. Normalmente, o Cheat Engine é usado para identificar a localização da memória de variáveis interessantes (por exemplo, a quantidade de ouro ou a vida ou o nível de atualização de uma habilidade), fazendo uma busca pelo valor conhecido da referida variável, jogando mais do jogo e fazendo com que o valor mudar, o Cheat Engine faria uma nova pesquisa a partir do resultado da pesquisa anterior pelo novo valor. Isso permite que o trapaceiro aumente o zoom na localização da memória do valor, agora eles podem alterar o valor dessa localização de memória usando o Cheat Engine.
Por exemplo, tenho 245 GOLD ... com o Cheat Engine, procuro 245 e encontro muitos locais de memória. Depois jogo um pouco mais e trago meu ouro até 314, depois procuro o valor 314 da saída de pesquisa anterior e encontro facilmente o local da memória onde o GOLD está armazenado.
A maneira de evitar isso é nunca ter o valor real armazenado em um local de memória. Por exemplo, armazeno o valor em um objeto que precisa calcular o valor real sob demanda quando necessário. Então, digamos que o jogador tenha 245 GOLD. Se eles pesquisarem um local de memória com o valor 245, poderão encontrar muitos, mas nenhum deles será o local de memória onde o valor de ouro está realmente armazenado, ou seja, porque você não armazena o valor 245 para ouro. Quando o jogo precisar saber quanto ouro, ele perguntará ao objeto que possui o valor, que o calculará sob demanda.
Portanto, a pergunta agora é: como exatamente você armazena um valor de uma maneira que não o revele? Isso fica um pouco complicado e feio e tenho certeza de que há muitas maneiras de fazer isso. O que eu gosto de fazer é armazenar uma matriz booleana (ou matriz de bytes). O comprimento da matriz pode ser qualquer coisa, mas digamos que seja 13. Então você tem um contador que representa quantas vezes 13 entra nesse valor real. Portanto, se quisermos representar 245, o contador terá um valor de 18. Agora, o array terá todos os booleanos configurados como true pelo restante de 245/13 ... basicamente o módulo. Nesse caso, são 11, portanto, os 11 primeiros booleanos da matriz serão configurados para true, e o restante para false. Para recuperar o valor, tudo o que você precisa fazer é multiplicar o contador pelo comprimento da matriz e adicionar 1 para cada conjunto booleano como true (parando no primeiro false). Agora, o número 245 nunca seria armazenado em nenhum lugar e seria difícil encontrar o local da memória que precisaria ser manipulado para alterar a quantidade de ouro. Convém definir o comprimento da matriz para tamanhos diferentes (talvez escolha um número aleatoriamente entre um intervalo razoável) quando esse objeto for criado.
EDIT: Isso é útil para multiplayer e single player. Há trapaça que também pode ser feita no modo multiplayer, onde os valores nos pacotes podem ser alterados. Isso exigiria diferentes técnicas para impedir, como assinar cada pacote.