Estou mexendo há algum tempo com um jogo e estou tendo muitos problemas com algo:
Eu tenho dois caracteres, cada um com atributos (cerca de dez) em um intervalo (entre 1 e 20). Eu quero usar esses atributos para gerar um 'roll', de modo que o roll mais alto ganhe esse encontro específico. Vale a pena notar que os dois personagens não estão se danificando / se defendendo. Ambos estão rolando para ver se passam no que eu acho que poderíamos chamar de verificação de habilidade. Ambos estão rolando para passar / falhar contra um valor comum. Eles não interagem um com o outro.
No entanto, quando um dos personagens tem até uma pequena vantagem numérica, qualquer fórmula que eu crie resulta no que é sempre ligeiramente superior, ganhando uma grande maioria do tempo. Isso é indesejável.
Tentei ponderar o atributo 'mais relevante' para o teste em 80% e a soma dos outros atributos em 20%. Também tentei comparar médias para produzir uma diferença relativa e usá-la para aumentar o caráter mais fraco. Ambas as abordagens resultaram nas vantagens significativas que estou tentando remover (por exemplo, se eu executar o encontro 5.000 vezes, produz regularmente um lado vencendo todos os 5.000).
A adição de um componente "sorte" só é importante, ao que parece, se for ponderado de alguma forma a favor do personagem menor, e eu não consegui um bom equilíbrio lá.
Que abordagens posso adotar para atenuar o impacto de uma pequena vantagem numérica, mas ainda preservar e aumentar essa vantagem à medida que a diferença relativa de atributos aumenta?
Por solicitação, aqui estão os detalhes que tenho até agora. Algumas coisas que eu ainda não descobri, então elas permanecem generalidades:
No momento, o rolo é gerado como
0.8 * (mainAttribute) + 0.2 (1/3 * subAttA + 1/3 * subAttB * 1/3 subAttC)
Atualmente, isso produz números na vizinhança de 4,0. Os atributos são gerados aleatoriamente entre os intervalos especificados. O teste atual usa um caractere com atributos de 2 a 4 e o oponente entre 3 e 5. Previsivelmente, esse resultado produz médias próximas a 3 e 4, respectivamente.
Com essa vantagem de um ponto, eu gostaria de ver a vitória mais forte das duas na área de 55% a 60% do tempo, com isso aumentando para ganhar cerca de 80% das vezes, com uma vantagem média de atributo de 5 ou 6, 90% com vantagens de 7 ou 8, deixando espaço para uma vitória improvável quando a diferença aumenta. Eu preferiria nunca ter vitórias garantidas, mas talvez as coisas se tornem muito improváveis - com a vitória de 99,5% ou 99,6% do tempo em que a diferença fica muito grande.
A fórmula atual produz um número não aleatório. A aleatoriedade vem da seleção de quais atributos são relevantes. Nem todos os atributos são usados para cada rolo. É possível que aquele com os atributos mais fracos em geral seja mais forte nas áreas relevantes para essa jogada e roube uma vitória. Mas, previsivelmente, isso acontece raramente.
Minha próxima tentativa foi avaliar seus pontos fortes relativos, medindo uma média de todas as estatísticas de cada um, dividindo-os um contra o outro e usando esse valor para dar um pequeno impulso ao personagem menor. Isso suavizou as coisas um pouco, mas ainda tinha uma tendência pronunciada de produzir coisas como 5.000 vitórias para um cara em cada 5.000 tentativas.
fonte
Respostas:
O problema com sua abordagem é que você decide o resultado do combate no momento em que decide o status principal. Quando você tem quatro estatísticas principais, e o lutador é apenas melhor em uma delas, a chance de vitória é sempre 1 em 4, não importa quão grandes sejam as diferenças. Quando você deseja obter resultados mais refinados, precisa de mais aleatoriedade.
Primeiro de tudo, acho que você pode manter sua escolha aleatória para o atributo principal e também pode manter sua fórmula, se quiser. É o número que representa quanto de vantagem esse combatente tem nesse encontro específico. Para o restante deste post, vou me referir a isso como justo
power
.Um método que eu usei em muitos jogos e que me serviu muito bem quando se trata de um duelo entre duas coisas com um certo
power
é rolar um número aleatório de ponto flutuante entre0
epower
para ambos e ver quem rolou mais alto. Aqui está uma lista dos resultados esperados deste método. As porcentagens não são calculadas, mas geradas experimentalmente, executando 100000 lutas por combinação e contagem de iterações e contando quem venceu com que frequência:O bom desse algoritmo é que ele é dimensionado, independentemente do tamanho dos números com os quais você esteja lidando. A chance de 0,3 vs 0,7 é a mesma de 3 vs 7, 300 vs. 700 ou 3.000.000.000 vs. 7.000.000.000.
Quando isso ainda é imprevisível para o seu gosto, você pode tornar o combate mais previsível rolando vários números aleatórios para cada combatente e somando-os. Devido à lei de grandes números , muitos eventos aleatórios se igualam e resultam em resultados mais previsíveis. Aqui está uma tabela com um número diferente de iterações.
Os resultados de 100% e 0% na tabela acima são uma ilusão devido a diferenças de arredondamento. A menos que o
power
de um combatente seja exatamente 0, sempre há a possibilidade de ele vencer. Isso simplesmente não aconteceu no teste acima, então você pode esperar que seja abaixo de 1: 100000.Você também pode observar algumas pequenas irregularidades que podem ser atribuídas às alterações de humor do java.lang.Random e podem não aparecer quando você executa o código novamente com uma semente diferente.
O programa que eu usei para gerar esta tabela (Java).
Se você deseja usar esse código em seu jogo, ele está licenciado sob a WTF Public License Versão 2, publicada por Sam Hocevar .
fonte
1 - powerA / ( 2 * powerB )
.powerA < powerB
. Quando o powerA for maior, você precisará mudar parapowerB / (2 * powerA)
.Seu erro é usar uma abordagem "baseada em dados". Você está em um computador e pode usar qualquer sistema que desejar. Faça uma tabela que transforme a diferença de valores em uma chance de% de idade para vencer e, em seguida, você pode definir os valores para absolutamente o que quiser, por exemplo
(Você só precisa fazer metade da mesa, basta sempre escolher A como aquela com o status mais alto)
Obviamente, esses números são apenas um exemplo, você pode fazer com que ele siga a distribuição que lhe agrada.
fonte
Essa é uma pergunta bastante profunda, honestamente, do ponto de vista da mecânica do jogo. Mas há algumas coisas que podem ajudar.
Primeiro, é por isso que a maioria dos jogos tem um componente separado para acerto e dano, onde há um "teste" para ver se você acerta e, em seguida, um "teste" contra uma tabela ou intervalo de dano para o personagem em questão. Isso também leva a alguns arquétipos padrão entre os gêneros, nos quais você pode ter personagens menores e mais rápidos que têm menos pontos de vida, mas causam mais dano (magos de canhão de vidro, certos tipos de malandros) e personagens maiores e blindados que sofrem menos danos (tanques, guerreiros )
Isso leva a um equilíbrio natural, onde o personagem menor pode ser frágil, mas evita ser atingido com frequência devido a uma habilidade do tipo agilidade, e também equilibra o campo de jogo, causando mais dano (uma mágica ou um efeito venenoso que causa dano ao personagem). Tempo). O tanque pode ser mais lento e ser atingido com mais frequência, mas muitas vezes tem um enorme poço de saúde ou pontos de vida para sustentar, no entanto, tende a causar menos dano por golpe (ou dano por segundo).
O pano de fundo para isso é o motivo pelo qual muitos jogos passam continuamente pelo equilíbrio de armas, classes e estatísticas. World ou Warcraft, Destiny, Diablo, Battlefield: qualquer tipo de jogo em qualquer gênero geralmente passa pelo equilíbrio e ajuste ao longo do tempo.
Isso pode não ser uma resposta direta, mas você pediu idéias gerais. Então, vamos também avaliar o sistema de jogo.
Como esses atributos funcionam? Se todo o resto for igual (sem arquétipo, sem armadura, ou melhores armas ou outros enfeites), é absolutamente provável que qualquer pequeno ganho jogue as coisas fortemente a favor de um lado. A adição de facetas ao combate complica qualquer sistema, mas também permite mais flexibilidade.
fonte
Há duas grandes coisas.
Primeiro, lembre-se de que você está em um computador. Você pode criar qualquer sistema que desejar. Não há necessidade de se limitar a um lançamento de d20, embora isso seja fácil de entender para os jogadores. Coisas como rolar 6 dados d6 são fáceis em um computador e fornecem muito menos resultados aleatórios.
Segundo, olhando para outros sistemas como o D&D, é óbvio que eles simplesmente diminuem bastante o efeito dos atributos. Em vez de fazer com que sua estatística base adicione 80% de seu valor à regra, reduza a escala e torne sua adição mais sutil. Em D&D, por exemplo, se você tem 18 de destreza, recebe apenas 4 como bônus na sua classe de armadura.
Portanto, resumidamente, tudo o que você precisa fazer é diminuir o tamanho do seu domínio para se ajustar melhor ao seu alcance. Mas, qualitativamente, eu pensaria que olhar para outros sistemas e criar coisas que pareçam menos matemáticas tornariam um sistema mais satisfatório para o jogador.
fonte
Que tal isso: adicione uma constante, por exemplo, 1000, a todos os atributos envolvidos. Então a diferença relativa se torna muito pequena.
fonte
Conheça seus números
Acrescentando um pouco à resposta de Philipp , a saber, que rand [x] comparado a rand [y] nem sempre produz o que se espera. Abaixo de uma tabela onde comparamos A e B. Ambos A e B têm os valores 1 ... 10. Comparamos de duas maneiras (nota: rand () neste caso gera números inteiros, isto é, rolos):
Além disso, comparamos
(neste caso, é irrelevante se é> ou ≥ porque estão tão perto). Esses grandes números estão entre parênteses.
As células contêm% 's. Cada resultado contém 1 milhão de iterações (feitas usando o Dyalog APL ).
Se observar A = 2 e B = 3 (e 1 milhão de testes):
Surpresas podem ser as seguintes:
Na verdade, eu poderia resolver esse Q de maneira diferente, simplesmente digitando à mão uma tabela de 10x10 com boas porcentagens desejadas (talvez alguém queira irregularidade também?). Então, se necessário, interpole entre dois valores, para obter uma porcentagem exata, digamos que seja por algum motivo 53. Então é fácil gerar uma ocorrência de 53% de probabilidade, 0 ou 1, simplesmente executando um rand (100) e testando se for menor ou igual a 53 :-).
Isso é ao longo da linha que Jack Aidley menciona.
fonte
0.0
e1.0
. Nesse caso, a diferença entre>
e>=
é insignificante. Você pode apontar isso.A abordagem tradicional que várias respostas referenciaram implicitamente, mas que ninguém definiu de fato, é que a tarefa requer um rolamento de dados fixo e adiciona um modificador de habilidade derivado de suas estatísticas.
Por exemplo, se dois jogadores seguirem o procedimento:
e repita até que um lado supere o outro e obtenha números no seu intervalo: eis as chances de vitória com uma vantagem numérica dada ao seu modificador:
fonte
Os personagens não se desafiam pela supremacia. Eles desafiam um requisito. E se ambos forem aprovados no requisito. Quem ganha? Estou surpreso que você não tenha desafiado a lógica o suficiente para fazer cálculos com ela.
De qualquer maneira, aqui estão duas coisas que podem lhe fazer bem.
Caso de chance de vitória com vantagem:
Se a barra de passe / verificação de habilidade for um lançamento de 10. A Rola 40. B Rola 42. SE apenas um tiver que vencer. Começando com um A 50% Win / B 50% Win. Você pode adicionar% para ganhar chance com base na quantidade de vantagem. O rolo B tem (42-40) / 40 = 5% de vantagem em termos de rolo. Adicionando-o diretamente, a chance de vitória de B é de 55%. Ou você pode determinar uma chance de vitória personalizada por porcentagem de vantagem. Digamos que, para cada vantagem de 100%, você adicione 10% de chance de ganhar. Então, se A rola 10 e B rola 20. Então A vence 40% e B vence 60% dos casos.
Conceito de aleatoriedade justo:
Ao fazer uma chance padrão de 30% de ganhar, você pode acabar vencendo 38 cheques em 100.
Algumas pessoas querem uma etapa extra na justiça e garantem que uma chance de 30% sempre ganhe exatamente 30 dentre 100 encontros e seja suficiente com a aleatoriedade de não saber quais encontros na sequência são uma vitória e quais são uma perda.
Isso é particularmente útil para economias de jogo bem calculadas. Porque uma estatística aleatória de 70% de chance de ganhar. Diga 70% de chance de uma multidão perder 5 de ouro. As multidões podem acabar perdendo o ouro 81 vezes em 100. O que tira os fluxos de receita / despesa do saldo. E, dependendo de quantas entidades / instâncias usam esses rolos, a inflação e / ou a escassez são inevitavelmente criadas. É claro que muitas pessoas nem sequer têm uma estimativa aproximada de todos os detalhes de sua economia. Muitas pessoas são suficientes para fazer "a maioria" dos pontos de economia. E deixe algumas variáveis de geração que não são calculadas e acumule discrepâncias de horas extras, mesmo com boa aleatoriedade.
Inflação e escassez não são um problema por si só. Você pode gerenciar aleatoriedade injusta e até variáveis imprevistas se sua economia estiver configurada para responder adequadamente à inflação e à escassez.
Por que se preocupar com isso, pois a lei dos grandes números equilibra as coisas a longo prazo?
Nem todo ambiente pode manter seu comportamento de design, contando com coisas para equilibrar mais tarde ...
fonte