Atributos para calcular um acerto em um jogo baseado em turnos ou Roguelikes
22
Estou tentando descobrir uma boa fórmula para determinar um acerto quando o jogador ataca um inimigo em um Roguelike. Gostaria de apresentar algo simplista, mas ainda fiel à maneira como é feito em D&D ou Roguelikes populares como AngBand ou NetHack.
O que tenho até agora é adicionar as diferenças entre os atributos de jogador e inimigo, juntamente com um número inteiro aleatório:
Isso cria uma jogabilidade não natural: o jogador nunca perde inimigos fracos e vice-versa para os fortes. Alguém sabe de um guia para combate baseado em atributos usado em jogos baseados em turnos etc? Devo (e posso) copiar as regras de D&D literalmente?
Eu descobriria o que você quer que as chances de "acerto garantido" e "falta garantida" sejam (ou seja, as chances de um gatinho acertar um dragão e um dragão perder um gatinho). Armazene seu resultado aleatório e, antes de aplicar diferenças de potência, marque um acerto se estiver dentro desses limites. Isso evitará o problema de 100% de chance de acerto / acerto ... embora haja outra opção para sempre fornecer a chance de acerto, detalhado abaixo.
D&D é um sistema "plano", onde a probabilidade é distribuída igualmente entre os possíveis resultados do rolo. Outros sistemas usam uma distribuição mais curva, geralmente obtida rolando vários dados e adicionando-os. É fácil criar uma curva como esta (rand () + rand ()) / 2 vem à mente).
Outra possibilidade é "explodir dados". Em sistemas como Shadowrun e Savage Worlds, rolar o máximo resultado possível da matriz permite rolar novamente a matriz e adicionar o novo resultado. No seu jogo, você testaria para ver se o resultado aleatório estava acima de um determinado limite e, se sim, rolaria novamente. Se você deixar os dados explodirem indefinidamente, mesmo o goblin mais humilde tem a chance de atingir um deus, e você não precisa de um mecânico explícito de "acerto garantido".
Portanto, uma abordagem possível com um rolo curvo, chance garantida de errar e dados em explosão seria algo como:
function getRoll():Number{var result:Number=(rand()+ rand())*3;//Curved result from 0 to 6if(result >5.75) result += getRoll();//Explode over a certain threshold, recursivelyreturn result;}function attackHits():Boolean{var roll:Number= getRoll();if(roll <0.25)returnfalse;//Guaranteed chance of misselsereturn((player.dex - enemy.dex)+(player.speed - enemy.speed)+(player.luck - enemy.luck)+ roll)>=10;//Your original test.}
Claro, isso não foi testado e desequilibrado; você desejaria ajustar todos esses números mágicos até que parecessem certos.
Quanto à cópia literal das regras, há questões legais e éticas com isso. Você pode se inspirar em D&D e outros jogos de mesa; é assim que todos eles foram projetados em primeiro lugar. Você também não precisa mostrar exatamente como as regras funcionam, e pode achar que usar uma curva suave de dados de ponto flutuante leva a uma sensação melhor do que restringir-se às restrições inteiras dos dados físicos.
que linguagem é essa, com o tipo engraçado decls? Ou é apenas pseudocódigo?
tenpn
2
Eu acho que pode ser Actionscript ou Javascript, mas não me apegue a isso.
The Duck Comunista
É o Actionscript 3. Sou desenvolvedor de Flash.
Gregory Avery-Weir
6
Estou assumindo que esta é uma questão de equilíbrio do jogo e não uma questão de codificação, e há muitas maneiras de lidar com isso. Pelo seu algoritmo existente, suspeito que você o esteja tornando mais complicado do que deveria ser (três atributos E um número aleatório contribuem para um sistema extremamente confuso da perspectiva do jogador). Meu primeiro instinto é simplificar!
Favorecer atributos que fazem várias coisas, em vez de resultados determinados por vários atributos. DEX funciona muito bem como o principal determinante da chance de acertar; a adição de tudo o mais serve apenas para dificultar o equilíbrio. Pense da seguinte maneira: o dano esperado de um jogador em cada acerto é o% de acerto multiplicado pelo seu dano médio quando acerta. Como você planeja calcular um% esperado "típico" ou "típico" com tantas variáveis?
Vejo outro problema: sua fórmula não é escalável e é provavelmente isso que você está enfrentando. Supondo que DEX, LUCK e SPEED tendem a aumentar ao longo do jogo, as diferenças entre jogador e monstro nessas estatísticas também tendem a aumentar. Apenas como exemplo, se o DEX de um jogador no início do jogo estiver na faixa de 4 a 6 e os monstros também, esse é um modificador de 10 a 20% para acertar. Se o intervalo for de 10 a 20 nas fases posteriores do jogo, isso significa um modificador de 100%.
Uma maneira de corrigir isso é manter as estatísticas corrigidas. Os intervalos de jogadores e monstros são os mesmos ao longo do jogo, e obter algo como +1 DEX é muito importante, extremamente raro e tratado como tal (se existir). Então sua fórmula funcionará bem durante todo o jogo, e você verá um jogador com a mesma chance de acertar o tempo todo.
Outra maneira é mudar o "10" codificado para escalar com o nível, então talvez seja "10 + nível de monstro" ou "10 + nível de masmorra" ou algo assim, o que causa um leve aumento de dificuldade à medida que o jogo avança, a menos que o jogador suba de nível suas estatísticas de acordo.
Uma terceira maneira, como já foi dito, é definir limites máximos para os% mais alto e mais baixo aceitável aceitável, e simplesmente dizer "se o valor calculado for menor que X, use X".
Por uma questão de completude, vou apontar que não existe uma lei absoluta que você DEVE incluir em primeiro lugar. Tomar uma ação em um jogo que é ineficaz não é particularmente divertido e não contribui realmente para a experiência, exceto em casos raros. Uma alternativa é deixar os jogadores SEMPRE baterem e mexerem com o alcance dos danos, para que às vezes causem muito menos danos que outros. Lembre-se de que sistemas complexos são mais divertidos para o designer do que para o jogador.
Você pode querer adicionar acertos críticos (geralmente não pode faltar, dano adicional) e acertos críticos (chance de faltar, não importa o que aconteça, possivelmente atordoa o jogador).
Estou assumindo que esta é uma questão de equilíbrio do jogo e não uma questão de codificação, e há muitas maneiras de lidar com isso. Pelo seu algoritmo existente, suspeito que você o esteja tornando mais complicado do que deveria ser (três atributos E um número aleatório contribuem para um sistema extremamente confuso da perspectiva do jogador). Meu primeiro instinto é simplificar!
Favorecer atributos que fazem várias coisas, em vez de resultados determinados por vários atributos. DEX funciona muito bem como o principal determinante da chance de acertar; a adição de tudo o mais serve apenas para dificultar o equilíbrio. Pense da seguinte maneira: o dano esperado de um jogador em cada acerto é o% de acerto multiplicado pelo seu dano médio quando acerta. Como você planeja calcular um% esperado "típico" ou "típico" com tantas variáveis?
Vejo outro problema: sua fórmula não é escalável e é provavelmente isso que você está enfrentando. Supondo que DEX, LUCK e SPEED tendem a aumentar ao longo do jogo, as diferenças entre jogador e monstro nessas estatísticas também tendem a aumentar. Apenas como exemplo, se o DEX de um jogador no início do jogo estiver na faixa de 4 a 6 e os monstros também, esse é um modificador de 10 a 20% para acertar. Se o intervalo for de 10 a 20 nas fases posteriores do jogo, isso significa um modificador de 100%.
Uma maneira de corrigir isso é manter as estatísticas corrigidas. Os intervalos de jogadores e monstros são os mesmos ao longo do jogo, e obter algo como +1 DEX é muito importante, extremamente raro e tratado como tal (se existir). Então sua fórmula funcionará bem durante todo o jogo, e você verá um jogador com a mesma chance de acertar o tempo todo.
Outra maneira é mudar o "10" codificado para escalar com o nível, então talvez seja "10 + nível de monstro" ou "10 + nível de masmorra" ou algo assim, o que causa um leve aumento de dificuldade à medida que o jogo avança, a menos que o jogador suba de nível suas estatísticas de acordo.
Uma terceira maneira, como já foi dito, é definir limites máximos para os% mais alto e mais baixo aceitável aceitável, e simplesmente dizer "se o valor calculado for menor que X, use X".
Por uma questão de completude, vou apontar que não existe uma lei absoluta que você DEVE incluir em primeiro lugar. Tomar uma ação em um jogo que é ineficaz não é particularmente divertido e não contribui realmente para a experiência, exceto em casos raros. Uma alternativa é deixar os jogadores SEMPRE baterem e mexerem com o alcance dos danos, para que às vezes causem muito menos danos que outros. Lembre-se de que sistemas complexos são mais divertidos para o designer do que para o jogador.
fonte
Você pode querer adicionar acertos críticos (geralmente não pode faltar, dano adicional) e acertos críticos (chance de faltar, não importa o que aconteça, possivelmente atordoa o jogador).
fonte
Muitos jogos usam uma alteração de cinco por cento de um acerto, independentemente de todos os fatores, além da fórmula normal de acerto.
fonte