O cérebro humano, por sua própria natureza, é muito pobre em avaliar a probabilidade de ocorrência de eventos aleatórios, com base em uma determinada classificação numérica. E muito bom com base nas classificações de qualidade. E tudo porque uma pessoa mentalmente faz a conversão de probabilidades numéricas em estimativas qualitativas, e o faz muito subjetivamente:
- 80% de um arremesso no jogo - bem, este é um golpe quase garantido;
- 80% do fato de o seu camarada pagar pelo menos um dia uma dívida é não-não-não, não vai funcionar, isso é muito risco;
- 5% receberam dano crítico, ele é o NPC do inimigo - é improvável que o risco possa ser ignorado;
- 1% de risco de queda de gelo se você andar sob o teto com pingos de metros de altura - o que mais, é melhor se deslocar do outro lado da calçada;
- 51% de chance de ganhar um mini-jogo em um grande RPG - você pode esperar que, depois de 20 apostas, eu ganhe um pouco ou pelo menos fique com as minhas ... depois de 20 apostas ... como isso aconteceu? ouro? Aqui o gerador de números aleatórios está claramente quebrado!
As seguintes perguntas serão consideradas no artigo:
- suposições errôneas na estimativa de probabilidades;
- exemplos específicos de equívocos dos jogadores e probabilidades reais de eventos "raros";
- gerador de números aleatórios (geralmente pseudo-aleatórios);
- primeiros geradores de números pseudo-aleatórios simples, usando Final Fantasy I como exemplo;
- abordagens para a implementação de eventos aleatórios com reprodutibilidade e sem;
- exemplos de diferentes abordagens e manipulações implementadas com sucesso no Fire Emblem.
I. Suposições errôneas na estimativa de probabilidades
No processo de evolução, o cérebro humano aprendeu a operar muito bem com avaliações qualitativas de eventos e imagens de sua experiência. Uma pessoa apresentou números e uma estimativa numérica abstrata da probabilidade de eventos "aleatórios" relativamente recentemente [
1 ]. Não obstante, as pessoas em suas estimativas ainda converterão esses números em representações qualitativas: um pouco, um pouco, muito, perigoso, seguro, o suficiente.
Essas avaliações sempre dependem do contexto e da atitude subjetiva em relação a esse contexto. Essa é precisamente a principal causa de suposições numéricas errôneas.
Como exemplo, o jogo baseado em turnos Disciples 2 [
2 ] será considerado. Esta parte do artigo não considerará a qualidade da geração de números aleatórios especificamente neste jogo. Haverá dados suficientes sobre sua geração na segunda parte do artigo.
Discípulos 2 - Miss típica [ 2 ]Um ataque corpo a corpo padrão tem 80% de chance de acertar. Geralmente essa chance é percebida pelo jogador como “
quase sempre ”, e o risco de uma falta é “
ocasionalmente / ocasionalmente ”. A chance de errar duas vezes seguidas com dois ataques é de 4%. O jogador percebe esse risco como "
quase nunca / isso acontecerá extremamente raramente ". E quando isso acontece, os jogadores ficam indignados com a "curva aleatória": [
3 ]; [
4 ]
Mas em situações com duas faltas consecutivas e uma avaliação de risco de 4%, uma avaliação rápida do jogador tem várias suposições erradas:
1.
4% não é " quase nunca " . Este é um evento que acontecerá em cada 25º experimento independente (em média).
2.
A avaliação é realizada no intervalo de tempo errado . O intervalo mínimo de medição de ataque de 80% deve ser realizado não em dois ataques, mas em todos os ataques da mesma classe (~ 80%) durante a memória do jogador "cauteloso". Na maioria das vezes, durante esse período, você pode fazer uma longa sessão de jogo ou todo o jogo em geral, tudo depende do tipo de jogo, da memória do jogador e das preferências do jogador.
Como não tenho estatísticas reais sobre o uso deste jogo, procederei da suposição de que uma longa sessão de jogo em Disciples 2 dura 3 horas e, durante esse período, são feitos cerca de 250 ataques com uma precisão de ~ 80%. Vale ressaltar que os erros do inimigo devem ser ignorados, porque suas faltas o jogador não está com raiva, e ele raramente se lembra deles.
Portanto, a situação deve ser avaliada: "Para todos os 250 ataques, 2 faltas consecutivas nunca acontecerão".
Para calcular a probabilidade da verdade desse evento, foi utilizada a fórmula de recorrência: P1 (n) = 0,8 * P1 (n-1) + 0,16 * P1 (n-2). Ao derivar essa fórmula, peguei a ajuda da comunidade, uma citação dos cálculos, detalhes e o resultado são apresentados abaixo.
Você pode tentar usar indução. Introduzimos alguma notação. A probabilidade de reter a pata após o enésimo passeio é indicada por P (n). Representamos essa probabilidade como a soma de duas probabilidades
P (n) = P1 (n) + P2 (n), em que P1 (n) é a probabilidade com que a n-ésima excursão acabou sendo bem-sucedida e P2 (n) - sem êxito.
Pode parecer que P1 e P2 sejam proporcionais a 0,8 e 0,2, mas não é assim. Devido ao fato de que não estamos considerando possíveis resultados, mas apenas aqueles que salvaram a pata de guaxinim.
Agora vamos tentar derivar uma fórmula de recorrência
P1 (n) = 0,8 * (P1 (n-1) + P2 (n-1))
P2 (n) = 0,2 * P1 (n-1)
Substitua P2 na fórmula de P1 que obtemos
P1 (n) = 0,8 * P1 (n-1) + 0,16 * P1 (n-2)
Solução adicional de relações de recorrência [5]
Citação do usuário Serbbit [ 6 ]Para resolver o problema, em vez de entender os métodos para resolver as relações de recorrência, um pequeno código javascript foi escrito para o console do navegador e o resultado foi calculado.
var P1 = []; P1[0] = 1; P1[1] = 1; for (var n=2; n<=250; n++) { P1[n] = 0.8 * P1[n-1] + 0.16 * P1[n-2]; console.log(n + ') ' + P1[n]); }
A resposta é: 0.0001666846271670716
Ou
0,0167%Essa resposta coincide com a resposta de outro autor Kojiec9: 0.000166684627177505 [
6 ], que usou seu método desenvolvido com um sistema de números decimais e calculou o resultado usando sua fórmula em Pascal. Aparentemente, pequenas diferenças nas respostas são explicadas pelo arredondamento dos números flutuantes.
Assim, em 3 horas jogando Disciples 2, um jogador tem a chance de evitar uma falta dupla com 80% de precisão, com apenas
0,0167% . Agora, isso é realmente muito improvável. (e a probabilidade de
pelo menos um erro duplo é de
99,9833% , respectivamente).
Um aumento na probabilidade de pelo menos uma falha dupla com um aumento no número de experimentosSobre as imperfeições e distorções da memória humana, a propósito, em geral, existem estudos e livros completos: “Ilusões do cérebro. Distorções cognitivas devido a uma superabundância de informações ”[
7 ]; “Não acredite no seu cérebro” [
8 ], se você estiver interessado neste tópico, recomendo que você se familiarize com esses artigos.
3. A terceira suposição incorreta é a
expectativa de dependência em experimentos mutuamente independentes .
Ou seja, após a primeira falta, o jogador pensa:
“Então, o personagem errou com uma precisão de 80%. Agora ele definitivamente acertará, porque o risco de uma falta dupla é de apenas 4%. "
Mas não. Após a primeira falha, o risco de outra falha também será de 20%. Afinal, o ataque passado já aconteceu e não afeta o tiro no futuro. Além disso, se antes do primeiro ataque a probabilidade de uma falta dupla era de 4%, depois do primeiro erro, a probabilidade de uma falha dupla já era de 20%, ou seja, em relação às expectativas do jogador, o risco só aumenta.
Esse recurso do cérebro humano é especialmente atraente para manipulações do cassino (e similares) no jogo (mais sobre o dispositivo de caça-níqueis do fabricante [
9 ]).
Exemplos mais interessantes das ilusões do cérebro humano podem ser encontrados em artigos sobre o equilíbrio de Jan Schreiber, “Nível 5:
Probabilidade e aleatoriedade ficaram horrivelmente erradas” (
Nível 5. Probabilidade e aleatoriedade foram desfeitas ) [
10 ].
II Gerador de números aleatórios
O termo "gerador de números aleatórios" (RNG / gerador de números aleatórios) usado em jogos quase sempre significa realmente "gerador de números pseudo-aleatórios" [
11 ]. A principal característica deste gerador é sua reprodutibilidade. Reprodutibilidade significa que, conhecendo o elemento gerador inicial (ou semente), a mesma sequência de números aleatórios (
pseudo-aleatórios ) sempre será obtida. Em alguns jogos, esse efeito se manifesta no fato de que, após reiniciar o jogo, a sequência de acertos e acertos permanece inalterada. Mas em outros jogos não permanece o mesmo.
E o problema é como esse gerador de números pseudo-aleatórios é usado e quais objetivos de design o desenvolvedor persegue.
Para entender melhor o princípio de operação do gerador de números pseudoaleatórios, podemos considerar a maneira como ele é implementado nos primeiros jogos clássicos, quando os recursos dos computadores (e consoles) eram especialmente severamente limitados. (Para uma
descrição detalhada dos exemplos e de seus recursos, consulte o artigo “Como os jogos clássicos fazem uso inteligente da geração aleatória de números” [ 12 ]. )
Como os jogos clássicos fazem uso inteligente da geração aleatória de números [ 12 ]Final Fantasy Usei várias tabelas com números fixos predefinidos com 256 valores em cada tabela:
- para calcular batalhas aleatórias com cada etapa do mapa do jogo, o algoritmo se movia ao redor da mesa, alterando o índice em 1 por vez, percorrendo gradualmente todos os valores possíveis - tanto o fato da colisão quanto um possível grupo de oponentes dependiam disso;
- Para calcular os resultados da batalha, também foi usada uma tabela semelhante de 256 valores fixos, mas a movimentação ocorreu não apenas a cada uso subsequente do número pseudo-aleatório, mas também a cada 2 quadros. Ou seja, a cada 2 quadros, o algoritmo rolava a tabela de maneira ociosa com números, reduzindo assim o risco de sequências idênticas previstas. A fonte da entropia aqui era a incerteza de quanto tempo o jogador pensaria antes de escolher o próximo time.
O Final Fantasy I usa o número de série (índice) de um valor fixo na tabela como um grão (genatrix). Ou seja, sabendo o local a partir do qual os números aleatórios serão selecionados ainda mais, pode-se prever com precisão qual número aleatório será emitido após 1000 verificações. Nos algoritmos de geração de números pseudoaleatórios mais complexos, o grão não é tão facilmente usado, mas o princípio e o efeito básicos permanecem.
Agora, para a geração de números pseudo-aleatórios, as bibliotecas padrão de linguagens de programação usadas são usadas principalmente. A hora atual do sistema é mais frequentemente usada como fonte de entropia. Para as necessidades da indústria de jogos, as características das bibliotecas padrão geralmente são suficientes. As desvantagens do gerador e a fonte de entropia raramente são usadas pelos jogadores devido à complexidade de seu cálculo e manipulação. Normalmente, isso continua sendo o grande número de programadores de speedraner (
por exemplo, invadindo
a lógica do Pokemon Colosseum [ 13 ] ), o que significa que os desenvolvedores são mais sábios em ignorar essas sutilezas.
III Diferentes abordagens para usar o gerador
1. O grão é fixado no momento do início da missão ou campanha do jogo.Consequências para o jogador : recarregar o jogo não mudará o fato de uma falta do personagem (vamos chamá-lo de
louco de Fidel ), mesmo que a probabilidade de seu acerto seja de 99%. No entanto, antes de tentar acertar, o jogador pode executar alguma outra ação que use um número aleatório, por exemplo, se assemelha a outro personagem - o
careca Mick . Como resultado disso, o azarado número aleatório será usado pelo careca Mick, e o próximo número aleatório na sequência será usado no louco Fidel - então ele provavelmente conseguirá.
Como um jogador pode abusar : se um tiro com precisão de 50% resultar em um erro, você poderá reiniciar e tentar o ataque com uma precisão um pouco mais alta (55%) até acertar. Após o acerto, salve e repita isso com outros lances.
Consequências positivas para o desenvolvedor :
1) O jogo pode ser reproduzido passo a passo, se apenas o estado inicial, a granulação e a sequência de ações forem armazenadas. Graças a isso, é possível mostrar repetições e até armazenar de maneira muito compacta os arquivos salvos. O método permite economizar muito espaço no disco / memória.
2) Proteção do jogo interno, para que o salvamento / carregamento não permita que o jogador vá à falência de todos os oponentes do NPC encontrados.
Um exemplo :
O jogo rogue-like Brogue [
14 ] usa esse método, começando com a geração do mundo do jogo e terminando com um erro de cálculo de todas as ações do jogador. Como resultado, apenas o grão inicial e a sequência de comandos do jogo são armazenados no arquivo salvo. Um bônus adicional desse efeito é que o jogo pode ser iniciado com o número de grãos selecionado, depois de selecionar o mundo mais interessante nas tabelas dos mundos Brogue gerados [
15 ].
Brogue roguelike - Site Oficial [ 14 ]2. O grão não é fixo ou atualizado todas as vezes após uma reinicialização.Consequências para o jogador : qualquer reinicialização altera todos os cálculos nas chances de acertos.
Como um jogador pode abusar : muito simples - várias reinicializações e o cenário mais improvável podem se tornar realidade.
Consequências positivas para o desenvolvedor :
1) Os jogadores percebem esse jogo como mais honesto, com aleatoriedade real, simplesmente por falta de conhecimento da mecânica interna.
2) Os jogadores recebem um modo fácil informal, que, se desejado, pode facilitar muito áreas complexas.
3) Um desenvolvedor pode encobrir um brinde usando métodos diferentes: um salvamento automático por jogo (ou seja, salvar sobrescritos e morte permanente) ou proibir o salvamento durante uma missão (em diferentes variações). E as áreas mais sensíveis (mini-jogos de azar) podem ser calculadas com base em um único grão constante, embora tecnicamente seja muito mais difícil.
Um exemplo :
A Batalha por Wesnoth [
16 ] usa grãos não fixados com aleatoriedade essencialmente honesta. A honestidade reside no fato de que, às vezes, sequências completamente improváveis de falhas são possíveis, e o mecanismo do jogo não as corrige. O resultado disso são os posts irritados periódicos de jogadores irritados contra os desenvolvedores de jogos.
Reddit é uma sereia super hábil em Wesnoth [ 17 ]Além disso, antes do ataque, o jogo fornece cálculos detalhados das probabilidades de cada um dos possíveis resultados do ataque: o dano causado, o dano recebido e a probabilidade de morte de um dos oponentes. A conclusão dessas probabilidades apenas aumenta a raiva dos "sem sucesso", porque garantindo boas chances de um ataque, é difícil chegar a um acordo com um resultado que tenha uma pontuação de 1 em 1000.
3. O grão não é fixo e os próprios resultados estão sujeitos a manipulações adicionais.Por manipulações, quero dizer esses ajustes dinâmicos, como resultado dos quais o sentimento de aleatoriedade correta (
justa ) aumenta devido à perda de pseudo-aleatoriedade real nos números resultantes.
Conseqüências para o jogador : semelhante aos jogos com recarga de grãos não fixa, você pode contar os resultados.
Como um jogador pode abusar : com a ajuda de scamming, você pode escolher uma combinação favorável de ataques, mas isso depende muito do método de implementação e da disponibilidade de mecanismos de proteção por parte do desenvolvedor.
Consequências positivas para o desenvolvedor : o desenvolvedor pode controlar a raridade de resultados indesejáveis, dar a aparência de um "
acaso honesto ", aumentar e diminuir a complexidade do jogo. Se o desenvolvedor, ao calcular a chance de acertar, armazenar e separadamente levar em consideração os pontos positivos de cada equipe, ele poderá reduzir bastante o abuso de golpes de salvamento, garantindo que o jogador ainda receba sua parte média aritmética do dano.
Exemplos :
O desenvolvedor Carsten Germer usa a função de aleatoriedade controlada para eventos raros e não apenas [
18 ]. Por exemplo, para garantir a perda periódica de um bônus particularmente raro com uma chance de 1 em 10.000, após cada "falha", aumenta as chances na ordem: 1 em 9.900; 1 a 9800; 1 a 9700 ... e assim sucessivamente até o evento ser gravado. E, para garantir a ausência de raridades frequentes, ele introduziu uma variável adicional que bloqueia a operação em 100% durante as próximas 10 verificações após a última operação.
No meu pãozinho Grue the Monster [
19 ], eu também usei manipulação aleatória. Normalmente, ao perseguir as vítimas, o personagem do jogador deve se esconder atrás delas, esperando que elas dêem um passo para trás e caiam em suas patas. Geralmente, essa chance é igual a 1/6 no espaço aberto (1/2 nos corredores e 1/1 nos becos sem saída), mas para reduzir o efeito irritante de situações especialmente azaradas, antes de cada verificação da direção da vítima em 15% dos casos, era garantido que ela seguisse para Gro .
O caso mais interessante: no jogo Fire Emblem: The Binding Blade [
20 ], a mecânica oculta de determinar golpes durante ataques [
21 ] foi implementada. Tradicionalmente para as séries, a probabilidade de acertar é mostrada pelo jogo como uma porcentagem de 0 a 100%. Em jogos anteriores da série, o fato de um acerto era determinado por um número aleatório de 1 a 100: se o número de abandono (por exemplo, 61) é menor ou igual à probabilidade de um acerto (por exemplo, 75), um acerto é contado, se mais, depois uma falta.
Emblema de Fogo: A Lâmina Encadernadora [ 20 ]Nesta parte, um sistema de economia foi introduzido: em vez de um número aleatório, a média de dois números aleatórios foi obtida e essa média foi comparada com o valor de precisão. Ou seja, um número aleatório tende a um valor maior de 50. Isso leva a uma distorção do efeito linear da aleatoriedade do acerto: lutadores com um acerto maior que 50% acerto com mais frequência do que em 50% dos casos e com acerto menor que 50% com muito menos frequência. E como no jogo a grande maioria dos personagens do jogador é mais precisa e a maioria dos inimigos é menor, o jogador recebe uma vantagem oculta muito séria [
21 ]. Abaixo está um gráfico desse efeito, em que as linhas azuis mostram a frequência de acertos no sistema antigo e a frequência de acertos vermelhos no novo sistema, dependendo da porcentagem de precisão do atacante. Por exemplo, com a probabilidade mostrada de atingir 90%, a probabilidade real será de 98,1%, com 80% - 92,2% e com 10% - apenas 1,9%!
Distorção do acaso No eixo y, a probabilidade real, no eixo x - mostrada ao jogadorEsses, é claro, não são os únicos exemplos de manipulações com números aleatórios e equilíbrio, mas é muito difícil encontrá-los. Portanto, a ajuda da comunidade aqui será especialmente valiosa.
Quero observar que não atribuo a geração processual à aleatoriedade manipulada como tal. Exemplo: um bagel gerou um nível aleatório com um conjunto aleatório de inimigos, armadilhas, paredes e becos sem saída. Se, ao mesmo tempo, um nível impossível de passar foi criado, um exemplo de curva de desenvolvimento, design insuficientemente pensado ou teste ruim. O desenvolvedor deve verificar proceduralmente pelo menos os problemas básicos da geração aleatória:
- a passagem para a saída deve sempre ser pelo menos no singular. Qualquer algoritmo de localização de caminho ajuda aqui;
- uma série de traps deve ser capaz de contornar e, se houver muitos deles em um único local, o algoritmo deverá calcular sua densidade e remover os desnecessários;
- inimigos poderosos demais devem fornecer pelo menos uma das maneiras disponíveis para "ultrapassá-los": força bruta; pergaminhos e poções; artefatos especiais ou a capacidade de simplesmente fugir deles.
Essa intervenção em resultados aleatórios não é uma manipulação, mas é simplesmente a regra de uma abordagem minimamente competente para o desenvolvimento. Essas verificações são usadas em todos os métodos de geração de números pseudo-aleatórios.
4. Geralmente remova o elemento aleatório da mecânica do jogo.Ou seja, os resultados de cada ataque sempre têm 100% de chance de acertar e causar dano fixo, além de regras constantes para desencadear efeitos adicionais. Em vez disso, você pode usar cálculos aleatórios para fins cosméticos: "mastigação" periódica de caracteres aguardando a sua vez; voando para longe os números dos danos causados; efeitos de colisões e explosões. Não há diferença em como gerar números aleatórios e em quão uniformemente a distribuição.
Embora neste caso, você possa usar os três primeiros métodos nos cálculos de inteligência artificial, quando os personagens inimigos podem, até certo ponto, escolher aleatoriamente alvos para ataque ou andar em equipe em ordem aleatória. Mas isso será menos perceptível para o jogador e situações irritantes serão muito menores.
Consequências para o player : a reinicialização não afeta os resultados de nenhuma maneira ou afeta um pouco.
Como um jogador pode abusar : um jogador pode calcular ou encontrar uma estratégia dominante estável na rede e usá-la apenas. Vale ressaltar que, para certos grupos de jogadores, esse é o principal interesse no jogo.
Consequências positivas para o desenvolvedor : é muito mais fácil
para o desenvolvedor equilibrar esse jogo. Como sinal de menos - nesse caso, as estratégias dominantes emergentes se tornam estáveis, o que significa que mesmo a má sorte de um jogador não será capaz de derrotá-lo, mas levará ao desaparecimento de quaisquer surpresas, tédio e remoção do jogo. Jogadores de classe alta quase sempre vencem jogadores de classe baixa, para vários tipos de jogos isso pode ser uma vantagem e uma desvantagem.
Um exemplo :
Qualquer xadrez com regras clássicas.
Os roguelike lógicos também são adequados aqui. Por exemplo, este método é muito bem implementado no Desktop Dungeons Alpha [
22 ].
Masmorras de mesa Alpha ( 22 )Aqui, os resultados da sequência de ataque são sempre os mesmos e calculados com antecedência. No entanto, devido à geração aleatória (procedural) de masmorras de jogos e à presença de um nevoeiro de guerra, o jogo adquire sua replayability única dos melhores bagels.
Conclusão
Assim, o artigo considera dois subtópicos da aleatoriedade nos jogos:
- Suposições errôneas na estimativa de probabilidades . Ele descreve as suposições intuitivas que o jogador faz e que muitas vezes acabam erradas devido à sua subjetividade. A principal conclusão: a verdadeira aleatoriedade não apenas garante que os usuários serão satisfeitos, mas pode até levar ao efeito oposto.
- Geração de números pseudo-aleatórios . Diferentes abordagens para o uso da aleatoriedade são descritas. Exemplos de implementação bem-sucedidos mostram que, independentemente da abordagem escolhida, o jogo pode se tornar interessante, inesperado e com um bom grau de repetibilidade.
O uso consciente e consistente da abordagem escolhida permite que os desenvolvedores enfatizem seus aspectos positivos e minimizem os negativos.