O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

Ajustando a Dificuldade com Seleção Natural

Iniciado por Corvo, 29/02/2020 às 18:23

29/02/2020 às 18:23 Última edição: 29/02/2020 às 19:05 por Corvo
Ajustando a Dificuldade com Seleção Natural

Este sistema é um teste e não recomendo seu uso em projetos. Porém, caso queira testar e postar os resultados aqui, será de grande ajuda. Agradecimentos ao Syureri. Criado no RPG Maker VX Ace.


Prós: Dinâmico, ajusta-se automaticamente conforme o estilo do jogador.
Contras: Balanceamento extremamente lento, pode levar horas de combate para ajustar um inimigo. Se o jogador alterar sua estratégia durante o jogo, os monstros passarão um bom tempo apanhando feio até se reajustarem.


Estou estudando alguns métodos de balanceamento para os inimigos do meu projeto. Não quero ter o trabalho de definir os atributos previamente, então pensei em deixá-los se ajustarem sozinhos. Na teoria, funciona, mas para um jogo com um número de combates relativamente pequeno, é impraticável por ter uma evolução muito lenta. De toda forma, vale o teste. Resumindo, para aplicar a seleção natural aos inimigos vamos precisar de três coisas:

  • Um indivíduo.
  • Um Objetivo.
  • Mutações aleatórias.
1) Usaremos um único inimigo para simplificar as coisas. Nosso Slime será a cobaia.
2) O objetivo da seleção natural é sobreviver. Para um jogo, seria mais interessante alcançar uma quantidade de dano causado no jogador, mas tentemos manter o ideal primário. Nosso Slime pretende sobreviver até o terceiro turno da batalha.
3) Por mutações, usaremos alterações aleatórias nos atributos do inimigo. Aumentando e reduzindo os parâmetros, porque só aumentar tiraria a naturalidade da evolução. Para começar, criemos nosso progenitor:


O indivíduo X.

Tendo este inimigo, iniciamos combates normalmente, porém, verificando os resultados um à um. Toda vez que o jogador vencer a batalha, o indivíduo falhou e precisamos realizar uma mutação. Isto é, alterar os atributos do inimigo e testar novamente a batalha:


Monitorando os combates.

Para gerar as mutações, usamos esta série de comandos num Script Call:

$data_enemies[1].params[0] += (Random.rand(6) - Random.rand(6)) * 1
$data_enemies[1].params[1] += (Random.rand(6) - Random.rand(6)) * 1
$data_enemies[1].params[2] += (Random.rand(4) - Random.rand(4)) * 1
$data_enemies[1].params[3] += (Random.rand(4) - Random.rand(4)) * 1
$data_enemies[1].params[4] += (Random.rand(4) - Random.rand(4)) * 1
$data_enemies[1].params[5] += (Random.rand(4) - Random.rand(4)) * 1
$data_enemies[1].params[6] += (Random.rand(4) - Random.rand(4)) * 1
$data_enemies[1].params[7] += (Random.rand(4) - Random.rand(4)) * 1


Lembre-se do objetivo de nosso Slime: chegar ao terceiro turno. Se isto ocorrer, ou como pode ser visto na imagem do evento anterior, se o inimigo vencer o combate, significa que o objetivo foi cumprido e devemos salvar este indivíduo. Ele será o novo padrão e seus decendentes passarão novamente por mutações em busca de aprimoramento. Não se preocupe se um Slime vencer e seus herdeiros perderem, é normal. Por trás do experimento buscamos um inimigos que jamais perderá um combate para o tipo de personagem disponível no momento.


Evento ocorrendo no terceiro turno do combate.

Só precisamos alterar os atributos principais do inimigo. Agora, eles serão usados como se houvessem sido definidos no banco de dados.

# Salvando a geração. Usamos eventos separados caso queiramos fazer ajustes e/ou correções manuais mais tarde.
$game_variables[1] = $data_enemies[1].params[0]
$game_variables[2] = $data_enemies[1].params[1]
$game_variables[3] = $data_enemies[1].params[2]
$game_variables[4] = $data_enemies[1].params[3]
$game_variables[5] = $data_enemies[1].params[4]
$game_variables[6] = $data_enemies[1].params[5]
$game_variables[7] = $data_enemies[1].params[6]
$game_variables[8] = $data_enemies[1].params[7]
# Como não é o caso aqui, podemos "atualizar" o inimigo de uma vez:
$data_enemies[1].params[0] = $game_variables[1]
$data_enemies[1].params[1] = $game_variables[2]
$data_enemies[1].params[2] = $game_variables[3]
$data_enemies[1].params[3] = $game_variables[4]
$data_enemies[1].params[4] = $game_variables[5]
$data_enemies[1].params[5] = $game_variables[6]
$data_enemies[1].params[6] = $game_variables[7]
$data_enemies[1].params[7] = $game_variables[8]




Você pode baixar o projeto com o esquema funcionando no link abaixo. Como disse, é um teste de conceito. Eu levei horas enfrentando o Slime para ter algum resultado.

DOWNLOAD - Requer o RTP*
Esqueci-me de avisar. O evento ao lado do inimigo mostra os atributos atuais na janela do console.