Nesta parte, resolveremos o problema da colocação ótima de armas no tanque, o arranjo espacial dos teleportadores no MMORPG e equilibraremos as batalhas das quatro classes de personagens de RPG.
Tarefas de colocação de objetos
As planilhas para esta parte podem ser baixadas aqui: ( SuperTank ) ( teleportadores, parte 1 ) ( teleportadores, parte 2 )SuperTank: o problema está resolvido!
No
primeiro artigo da série, falamos sobre um exemplo de tarefa para um jogo chamado SuperTank. Na segunda parte, nos familiarizamos com os conceitos básicos de modelagem de decisão e conversamos sobre como resolver um exemplo simples usando a ferramenta "Search for Solutions" no Excel.
Agora podemos aplicar o conhecimento adquirido na segunda parte ao problema do SuperTank e provar que, com a ajuda deles, esse problema pode ser resolvido com facilidade e rapidez. Atualize sua memória: SuperTank é um jogo no qual você pode lutar em um tanque personalizado.
O super tanque é mais ou menos assim:
Cada supertank pode ter qualquer número de armas de cinco tipos diferentes:
Um super tanque pode acomodar 50 toneladas de armas e um jogador pode gastar 100 créditos. Além disso, o super tanque possui 3 "slots críticos", nos quais são colocadas armas especiais como MegaRocket e UltraLaser.
A planilha para este exemplo pode ser baixada
aqui .
O objetivo é pegar armas que maximizem os danos causados pelo super tanque, sem ultrapassar os limites de 50 toneladas, 100 créditos e 3 slots críticos. Também assumimos que esta tabela contém todas as informações necessárias e que fatores como alcance, frequência e precisão não são relevantes ou já foram levados em consideração no parâmetro Dano da arma correspondente.
Para otimizar esse esquema, primeiro inserimos esses dados na planilha. Logo abaixo, adicionaremos outra tabela, na qual haverá um conjunto de 5 células "quantitativas" para indicar a quantidade de cada um dos 5 tipos de armas.
Até inserirmos o valor 1 nessas células, apenas para testar seu trabalho, mas essas serão nossas células de decisão - solicitaremos à ferramenta Solver que encontre os valores corretos para essas células. É possível entender que essas são células de decisão em amarelo, porque continuamos a seguir as regras de formatação descritas na segunda parte. À direita das células "quantitativas", adicionaremos células de cálculo que multiplicarão os valores de quantidade nas células de decisão pelos valores de Dano, Peso, Custo e Slots Críticos da tabela acima. Assim, cada linha desta tabela exibirá corretamente os danos, peso, preço e slots críticos necessários para todas as armas usadas em todas as categorias de armas.
Também criaremos uma seção abaixo, que resumirá todos os valores de quantidade, peso, custo e slots críticos da tabela acima e comparará com os valores máximos de peso, custo e slots críticos especificados nas condições da tarefa (50, 100 e 3, respectivamente).
De acordo com as regras de formatação da segunda parte do artigo, as células azuis na parte superior são os critérios das condições do problema. As células cinzas são células de cálculo que representam o peso total, o custo e os slots críticos com base na soma da tabela de quantidades (ou seja, os valores totais das colunas Peso x Quantidade, Custo x Quantidade e Slots críticos x Quantidade). Finalmente, a célula laranja representa o dano total do nosso super tanque recebido com base no dano total da coluna Dano x Quantidade da tabela acima.
Antes de começarmos, vamos tornar nossa planilha mais amigável. Aproveitaremos a oportunidade do Excel para atribuir um nome a cada célula e dar nomes claros a sete células na última tabela de cálculo. Isso é opcional, mas a longo prazo, a planilha parecerá muito mais clara (por exemplo, se, em vez de US $ F $ 21, a célula for chamada MaxCriticalSlots). Para fazer isso, basta selecionar uma célula e ir para o campo de entrada de nome à esquerda do campo de fórmula e inserir um novo nome.
Agora, finalmente, vamos ao Excel Solver e localizamos uma solução (vá para o lado direito da guia Dados e selecione Solver. Se você não vê, acesse Opções do Excel , selecione a categoria Suplementos ("Complementos"), verifique se Suplementos do Excel está selecionado na lista suspensa "Gerenciar", clique em Ir ("Ir ...") e verifique se A caixa de seleção Suplemento do Solver está marcada.
No campo Definir objetivo ("Otimizar a função objetivo"), selecionaremos a célula laranja do alvo e, em seguida, clique no botão de opção Máximo ("Máximo"). No campo Ao alterar células variáveis, selecione as células de decisão (células amarelas na coluna Quantidade da segunda tabela). Abaixo, clique no botão Adicionar para adicionar as seguintes restrições:
- Os valores das células de decisão devem estar no intervalo de 0 a um máximo razoável (escolhemos 50, mesmo que esse seja provavelmente um valor limite muito maior que o necessário). Também é necessário definir cada célula da solução com uma restrição "= número inteiro", porque não podemos ter uma parte fracionária do armamento, e o Excel Solver considera cada variável como um número real por padrão, a menos que seja indicado o contrário.
- Também precisamos limitar os valores do custo total, peso total e número total de slots críticos aos valores das condições do problema. A imagem da caixa de diálogo mostra que agora eles têm nomes convenientes que adicionamos à tabela inferior, o que facilita a leitura da caixa de diálogo.
Agora clicamos no botão Resolver ("Encontrar uma solução") e, após uma breve espera, o Solver preencherá os valores de Quantidade, o que nos fornecerá o seguinte:
- 1 Metralhadora
- 3 foguetes
- 2 MegaRockets
- 1 Laser
- 1 UltraLaser
Tudo isso nos dá um dano total de 83 unidades e leva exatamente 50 toneladas, 100 créditos e 3 slots críticos. Você pode ver que a melhor solução não muda com o tempo de execução do Solver. Se você redefinir esses valores e executar uma segunda otimização, ou acessar Opções e alterar a semente, ainda obteremos os mesmos valores. Não podemos ter 100% de certeza de que essa solução é ótima, mas levando em consideração o fato de que o Solver não conseguiu aprimorá-la após várias passagens de otimização, é muito provável que seja uma ótima opção real e não apenas uma máxima local.
O problema está resolvido!
Usos adicionais
O legal é que não apenas resolvemos o problema muito mais rápido do que o poderíamos lidar manualmente, mas também o configuramos de tal forma que nos permite testar quais armas no jogo SuperTank serão mais úteis com parâmetros diferentes (peso, custo, slots críticos). Isso significa que podemos alterar com facilidade o efeito de várias alterações nesses parâmetros no jogo SuperTank, e se queremos adicionar um novo modelo alternativo de super tanque que seja mais leve, mais pesado ou com um número diferente de slots críticos, isso pode ser feito de maneira muito simples.
Ao alterar todos esses parâmetros, também podemos entender a utilidade relativa de cada uma dessas armas e determinar rapidamente qual é muito útil, não é útil o suficiente, tem um preço que não é adequado para seu peso e dano, e assim por diante.
Novamente, o ponto é que essa ferramenta nos permite pesquisar o espaço do design muito mais rápido do que manualmente. Ele nos oferece uma oportunidade conveniente de avaliar o efeito de tais alterações para qualquer solução de design incremental que possamos encontrar, seja alterando os parâmetros da arma ou do super tanque em si, adicionando novas armas ou modelos de super tanques, bem como adicionando novos parâmetros (digamos que o limite de tamanho esteja em metros cúbicos).
Para entender o que quero dizer, vá para a célula azul “Max Cost” e altere seu valor de 100 para 99. Agora execute o Solver novamente e você obterá um layout de arma completamente diferente:
- 0 Metralhadoras
- 2 foguetes
- 3 MegaRockets
- 3 lasers
- 0 UltraLasers
Esse esquema fornece um índice de danos um pouco menor (82 em vez de 83), mas é radicalmente diferente do anterior.
Se você definir o valor de Custo máximo como 101 ou 102 e executar o cálculo novamente, existe a chance de obtermos uma configuração semelhante à primeira ou coincidir com ela; seja como for, o dano permanecerá igual a 83 (os esquemas podem mudar, porque nesses casos existem vários esquemas ótimos). No entanto, se você definir o Custo máximo como 103, deverá obter o seguinte:
- 1 Metralhadora
- 4 foguetes
- 2 MegaRockets
- 0 lasers
- 1 UltraLaser
O que aumenta o dano total para 84.
Isso é interessante: esse arranjo de armas é muito diferente dos dois primeiros.
Como você pode ver, obtemos um resultado inesperado: a escolha ideal de armas em nosso esquema depende fortemente dos parâmetros do super tanque e pode variar significativamente mesmo com pequenas alterações nesses parâmetros. Além disso, ele nos fornece todo tipo de informação útil: todos os cinco tipos de armas são úteis em pelo menos duas das três configurações de super tanques, e Rockets e MegaRockets são obviamente úteis nas três. Parece que isso nos diz que todos os cinco tipos de armas são bem equilibrados, ou seja, úteis entre si e, ao mesmo tempo, permanecem únicos.
E como você também pode notar, essa modelagem e otimização de soluções nos oferece uma excelente oportunidade para executar rapidamente pesquisas em um bairro local e otimizar novamente. Para alguns tipos de tarefas, nos permitirá detectar estratégias e façanhas dominantes de jogadores que são difíceis ou impossíveis de encontrar de qualquer outra maneira.
Teleporte - Buracos de Minhoca
Observando os dois últimos exemplos (o exemplo das taxas de imposto em um jogo estratégico e o SuperTank), você pode pensar que essas técnicas são aplicáveis apenas nos casos em que os usuários estão lidando com números. Mas você estará absolutamente errado! Como veremos, há muitos exemplos de como você pode obter os benefícios de otimizar elementos de design que não apenas não se parecem com números para os usuários, mas nem se parecem com eles!
Você também pode pensar que a modelagem de decisão é aplicável apenas às decisões que os jogadores podem tomar nos jogos. Isso também não é verdade: em alguns casos, eles podem ser usados para modelagem, a fim de otimizar suas próprias soluções como designer.
Suponha que você esteja trabalhando em um MMORPG espacial. Um dia, seu designer principal chega até você com uma ansiedade visível no rosto. "Estamos concluindo uma reformulação do setor Omega", diz ele. “E nós tivemos um problema. Planejamos adicionar alguns teleportadores de buraco de minhoca "neste segmento do mundo, mas não podemos concordar sobre onde colocá-los".
"Quantos teleportadores?" Você pergunta.
Ainda não sabemos. Provavelmente três, mas pode haver de duas a quatro. Ainda não temos certeza. Então ele mostra um mapa que se parece com isso:
"O que é isso?" Você pergunta.
“Este é um mapa do setor Omega. Ou pelo menos os sistemas estelares que um jogador pode visitar neste quadrante. Precisamos determinar em quais células os buracos de minhoca devem estar. ”
“Bem, então, e sob quais regras elas são colocadas? É possível colocar o buraco de minhoca em um quadrante com o sistema estelar? ”
“Queremos que você coloque os buracos de minhoca de forma a minimizar a distância de qualquer sistema estelar ao buraco de minhoca mais próximo. E sim, você pode colocá-los no mesmo quadrante que o sistema estelar; eles são apenas pequenos teleportadores pendurados no espaço, para que possam ser colocados em qualquer lugar. E lembre-se de que ainda não decidimos quantas devem existir, então me dê soluções para 2, 3 e 4 buracos de minhoca. ”
Como formular esse problema e como resolvê-lo?
Otimizando teleportadores!
Vamos começar preparando células de solução. Denotamos os quatro teleporte como A, B, C e D. Sabemos que cada teleporte é essencialmente nada além de coordenadas (x, y) no mapa estelar do setor Omega. Também sabemos que precisaremos de alguma maneira de indicar o número de teleporte ativo; portanto, adicionaremos uma célula que permite definir o número de teleporte. Nós usamos o teletransporte D apenas quando quatro buracos de minhoca são usados e C somente quando temos três ou mais.
Abaixo prepararemos uma tabela para calcular a distância de cada sistema estelar ao teleporte mais próximo. Essa tabela fica assim:
O azul esquerdo mostra as coordenadas de cada sistema estelar no mapa. Cada linha é um sistema estelar. Nós simplesmente os transferimos do mapa do setor Omega, que nos foi dado pelo designer líder.
À direita, calculamos a distância de cada um dos quatro teleportadores. Este é apenas um teorema de Pitágoras. A distância é calculada como a raiz quadrada das distâncias horizontal e vertical entre o sistema estelar e o teletransporte:
= SQRT (($ B14-Ax) ^ 2 + ($ C14-Ay) ^ 2)
(Não se preocupe, prometo que essa é a matemática mais difícil que encontraremos na série!)
Pegamos as coordenadas X e Y de cada sistema estelar das células azuis da tabela acima e as coordenadas X e Y de cada teleporte (células com os nomes Ax e Ay para o teleporte A na função SQRT () mostrada acima) das células amarelas da solução no topo.
Finalmente, pegamos o mínimo desses quatro valores na coluna Dist to Closest, ou seja, simplesmente usamos a função MIN () para determinar o mínimo de quatro valores à esquerda. Em seguida, resumimos a coluna inteira abaixo; a soma é a célula de destino.
Você deve ter notado que, na captura de tela acima, todas as células estão definidas como Dist como D. O motivo é que estamos usando a célula "Número de teleportadores?" na seção superior do modelo de solução, que permite configurar o número de teleportos levados em consideração. Se o número de teleportadores for 2, usaremos o valor 99 em Dist para C e Dist para D, e se for 3, o valor 99 será usado apenas na coluna Dist para D. Portanto, cada sistema em estrela ignorará todos os teleportadores desnecessários. ao calcular a distância até o teleporte mais próximo no caso de 2 ou 3 teleporte.
Agora lançaremos o Solver:
A célula de destino é a soma na parte inferior da coluna Dist para o mais próximo. Observe que, diferentemente de outros exemplos, aqui queremos usar o botão de opção "Para: Min" porque precisamos de uma distância mínima entre todos os sistemas em estrela e teleportadores, e não no máximo.
Abaixo, indicaremos oito células amarelas para resolver as coordenadas X e Y dos buracos de minhoca A, B, C e D como células das soluções (alterando células variáveis) .Na seção restrições, limitaremos cada uma das coordenadas como um valor inteiro no intervalo de 0 a 12. Observe que usamos uma restrição de número inteiro para essas células da solução, porque queremos dizer que o designer principal quer apenas saber em qual célula cada teleporte estará, mas podemos facilmente ignorar essa restrição se o designer precisar de coordenadas de material.
Se pedirmos "Número de teleportadores?" valores 2, 3 e 4 e, em seguida, lançaremos o Solver em cada valor, obteremos as seguintes configurações:
Tendo essas informações, podemos abordar o designer líder e mostrar a ele os locais ideais para a localização de qualquer número de teleportadores no intervalo de 2 a 4. É assim que as localizações ótimas dos "buracos de minhoca" para 2, 3 e 4 teleportadores ficam no mapa (mostrado em verde).
A planilha para este exemplo pode ser baixada
aqui .
Eu falei sobre o ninja?
"Incrível", diz o designer-chefe, mas você vê sofrimento em seu rosto. “Uh, mas eu esqueci de lhe dizer que alguns desses sistemas são habitados por ninjas espaciais. E queremos que os sistemas com o ninja estejam mais distantes dos "buracos de minhoca" para que os jogadores não sintam uma ameaça excessiva ".
“Uau. Isso está mudando completamente o caso. "
“Certo. Além disso, em alguns sistemas estelares não há uma, mas duas colônias, ou seja, elas são duas vezes mais importantes do que estarem próximas dos teleportadores. Ou é duas vezes mais importante para ser mais longe se for um sistema com duas colônias de ninjas espaciais. Aqui está a aparência do mapa agora: "
Ele continua: “Cada número negativo é uma colônia de ninjas do espaço. O sistema com o número 2 contém duas colônias humanas e, com o número -2, contém duas colônias do ninja. Você pode me dizer onde colocar os teletransportadores neste caso?
"Diga-me, pelo menos você já decidiu quantos teleportos haverá: 2, 3 ou 4?", Você pergunta sarcasticamente.
"Ainda não tenho medo."
Nós resolvemos levando em consideração o ninja
Para resolver esse problema, precisamos adicionar uma nova coluna à tabela que indique o peso da tabela. Vamos chamá-lo de "multiplicador". Simplesmente multiplicaremos esse valor pelo valor na coluna Dist para o mais próximo.
Quando fazemos isso, Dist to Closest muda ligeiramente seu significado. Agora, essa não é a distância para o sistema estelar mais próximo, porque para os sistemas estelares ninjas o valor muda em -1 vezes. Assemelha-se a "pontos" (pontuação) mais generalizados, então vamos chamá-los assim.
Assim, os pontos agora indicam o valor acumulado. Ao minimizá-lo, fazemos com que o Solver se esforce para estar o mais próximo possível dos sistemas com colônias humanas e, ao mesmo tempo, o mais distante possível dos sistemas ninjas habitados.
Agora temos os seguintes resultados:
Como você pode ver, isso nos dá a configuração de teleportadores, em cada caso muito diferentes das versões mais simples sem um ninja.
A planilha para esta versão estendida do exemplo de teleporte pode ser baixada
aqui .
Como você pode ver, nosso modelo de solução foi capaz de resolver muito rapidamente essa tarefa não trivial e podemos adaptá-la às mudanças de requisitos.
Essa tarefa pertence à classe de tarefas denominadas "tarefas de alocação de objetos", que são muito bem estudadas no campo do gerenciamento operacional. Mas, como você pode ver, eles podem ser potencialmente usados no design de jogos, bem como no design de níveis, e a solução é simples (se não trivial) no Excel.
Player-vs-Player
: Nas três partes anteriores desta série de artigos, nos apresentamos ao conceito de modelagem e otimização de soluções, bem como à ferramenta Solver do pacote Excel. Mostramos como eles podem ser usados para calcular as taxas de imposto ideais da cidade na estratégia 4X, para determinar o posicionamento ideal dos teleportadores no jogo espacial e para selecionar o layout ideal de armas para a tarefa de super tanque descrita na primeira parte.Uma questão natural surge: que tal equilibrar o jogo? É possível aplicar técnicas semelhantes a todos os tipos de tarefas complexas de balanceamento encontradas em muitos tipos diferentes de jogos, em particular em estratégias, RPG e MMORPG?A resposta a esta pergunta é sim, é claro, mas com muitas reservas. As planilhas, em particular, têm muitas limitações, porque na maioria dos casos não triviais elas não descrevem com precisão o jogo. Portanto, será difícil executar um balanceamento confiável usando técnicas de otimização; as tarefas reais de balanceamento da grande maioria dos jogos estarão muito além do que podemos modelar em uma planilha. A simulação do jogo em si é geralmente muito complicada, tem muitas "partes móveis" e é frequentemente realizada em tempo real. Ao tentar fazer simulações discretas, podemos encontrar todos os tipos de problemas.Portanto, se quisermos usar técnicas semelhantes para equilibrar classes em MMORPGs como o WildStar ou em jogos estratégicos comoAniquilação Planetária , para garantir ao menos alguma precisão e utilidade, teríamos que integrá-las na simulação do próprio jogo.Além disso, a verdade é que alguns aspectos do balanceamento não podem ser automatizados; como explicamos na primeira parte do artigo, é impossível ajustar automaticamente a experiência do jogo.Portanto, o melhor que podemos esperar é uma demonstração de um exemplo simples que ilustra uma abordagem geral para tarefas desse tipo: com um exemplo simples no Excel, aprenderemos como abordar a formulação desse tipo de problemas de balanceamento e otimizá-los. Mostraremos que, pelo menos para um exemplo de uma batalha simples, o Solver pode equilibrar várias classes de RPG entre si. Então você pode usar essa estrutura básica como base para resolver esses problemas de otimização com um esquema mais complexo e mais profundamente integrado à simulação do jogo.Esperamos que você conheça todos os truques e veja o que esse exemplo simples pode nos dar.Desequilibrado
Não existe uma definição única e geralmente aceita da palavra "balanceamento". Tem muitos significados, e verdade geralmente depende do contexto do jogo em questão. Em diferentes condições, o equilíbrio pode estar relacionado à criação de várias classes de personagens, a fim de igualar suas capacidades em um jogo de interpretação de papéis, com o número de forças dos oponentes lutando entre si em um jogo estratégico ou com o ajuste do custo de várias unidades ou recursos, de acordo com sua utilidade.A melhor definição de "balanceamento" geralmente depende dos objetivos de design do jogo em questão, mas como esses objetivos podem ser qualquer um, é impossível determinar a priori o que o equilíbrio realmente significa para os jogos em geral.Alguns jogadores tendem a acreditar que equilibrar na batalha significa dano igual. Isso é especialmente verdadeiro para os MMORPGs, nos quais os jogadores costumam reclamar que o dano por segundo (DPS) de uma classe é muito pequeno ou muito grande em relação aos outros.Obviamente, as classes não podem ser balanceadas apenas pelo DPS; é aceitável que uma classe tenha um DPS maior que outro, mas isso deve ser compensado por outros fatores que limitam a utilidade geral da classe, por exemplo, sobrevivência reduzida ou menos DPS a longo prazo em comparação com o DPS a curto prazo.MMO minúsculo
Imagine que estamos criando um novo projeto, um RPG online simplificado para vários jogadores, chamado "Tiny MMO". Como parte do desenvolvimento do design, nos esforçamos para equilibrar as quatro classes de lutas de jogador para jogador (PVP), para que todas as quatro classes sejam relativamente iguais na batalha umas contra as outras e que não haja uma classe clara "melhor" ou "pior" que Você pode lutar contra outras classes.Embora o Tiny MMO seja um jogo em tempo real, a ação de cada jogador dura exatamente 3 segundos, para que possamos discretizá-lo apresentando-o como um jogo baseado em turnos, no qual cada movimento é uma parte de três segundos da jogabilidade.Os jogadores deste jogo podem escolher uma das quatro classes de personagem:- Guerreiro faz o maior dano.
- Mago lança feitiços à distância e tem o maior alcance de ataque das quatro classes
- Curandeiro (Curandeiro) é tratado automaticamente, restaurando a cada turno uma certa parte de sua saúde
- Bárbaro (Bárbaro) tem mais saúde
Isso é tudo o que sabemos sobre essas quatro classes e precisamos definir os parâmetros iniciais de saúde (HP), dano, cura e alcance dos ataques para todas as quatro classes. Precisamos equilibrá-los de forma que cada classe seja única e suas características diferam significativamente de todas as outras classes, mas, como resultado, cada classe acaba sendo o mais "equilibrada" possível em relação às outras três.Em outras palavras, buscamos otimizar a tabela a seguir:Enquanto usamos valores temporários e assumimos que cada classe começa com 50 PV, causa 10 de dano por turno, cura 0 PV por turno e tem um alcance de ataque de 40 metros. Cada personagem se move a uma velocidade de 10 metros por turno. Como o design indica que todas as quatro classes de caracteres podem se mover na mesma velocidade, consideraremos esse valor constante e não inseriremos a velocidade do movimento na tabela de variáveis de decisão.Obviamente, este é um estudo de caso com um modelo de dano muito simplificado. Esse é um valor médio contínuo de dano por segundo, que ignora a diferença entre dano por impulso e dano a longo prazo, bem como mana e outras mecânicas que modificam as habilidades de ataque das classes. Teremos apenas um tipo de dano, o que é bastante irreal, porque a maioria das classes tem dezenas de tipos de dano, e precisaremos implementar um sistema de IA que selecione o ataque a cada turno. Além disso, na maioria dos jogos, o dano tem um elemento de aleatoriedade, mas por enquanto vamos omitir isso e assumir que a variabilidade do dano não é tão grande que afeta significativamente o resultado da batalha entre as duas classes.Obviamente, é improvável que qualquer equilíbrio realizado no Excel seja ideal ou consistente com o saldo final do jogo; ela terá que passar por muitas iterações de playtesting. Mas se levarmos uma ou duas horas para obter uma boa primeira opção para o nosso jogo no Excel, pelo menos temos muito mais chances de nos aproximarmos dos parâmetros qualitativos do saldo inicial, o que nos aproximará do saldo final que queremos obter.Mesa da vitória
Precisamos equilibrar quatro classes entre si em uma batalha individual. Como temos apenas 4 classes (Guerreiro, Mago, Curandeiro e Bárbaro), existem 6 combinações possíveis de classes diferentes:- Guerreiro - Mago
- Guerreiro - Curandeiro
- Guerreiro - Bárbaro
- Mago - Curandeiro
- Mago - bárbaro
- Curandeiro - bárbaro
Esse equilíbrio pode ser bastante complicado. Mesmo no nosso caso bastante simples, com quatro classes, temos seis relações interclasses, assim como podemos desenhar seis linhas entre quatro pontos de um quadrado.Sempre que queremos fazer uma pequena alteração em um dos parâmetros de qualquer uma das classes, essa alteração também afetará o equilíbrio do PvP entre esse par de classes e as outras duas classes. Essa interconectividade da lei de poder só aumentará com o aumento do número de classes, e as decisões sobre o equilíbrio do PvP entre qualquer par de classes feitas "no vácuo", sem levar em conta todas as outras interações, podem se tornar muito perigosas.Idealmente, gostaríamos de criar algum tipo de mesa de vitóriacomo o mostrado abaixo. Se pudermos simular uma batalha entre cada um desses 6 pares em uma planilha, poderemos gerar uma certa variável de "pontos" para cada um dos 6 pares. Quanto mais pontos, melhor, para que possamos combinar todos esses seis pontos para gerar uma função de objetivo.Observe que na tabela acima, as células ao longo das diagonais são zero, porque denotam pares da mesma classe que serão equilibrados por definição. Além disso, as células no canto superior direito também são zero, porque denotam exatamente os mesmos pares que nas células no canto inferior esquerdo.Agora vamos preparar o modelo para a batalha entre duas classes diferentes."Simulador de batalha"
Organizaremos cada par de aulas a uma distância de 100 metros um do outro. Cada personagem tem 3 segundos para atacar, então podemos imaginar isso como uma simulação baseada em turnos, na qual cada "movimento" significa 3 segundos. Em cada "movimento", cada personagem ataca o outro, se ele estiver dentro do alcance do ataque, ou continua a se mover para reduzir a distância.A simulação é assim:Acima está um par de personagens que entraram na batalha: neste caso, Mage (classe 1) e Healer (classe 2). A coluna da esquerda mostra a distância atual entre os dois caracteres simulados.Para cada caractere, as colunas serão:- Max Range : , . .
- Healing : , .
- HP : . HP , . , .
- Damage : , , . , 0.
- Ataques? : Esta coluna verifica se o personagem está dentro do alcance do ataque. Se sim, isso significa que o personagem está atacando no turno atual; caso contrário, o personagem se aproxima para alcançar outro personagem.
Assim, os dois personagens começam a se mover e depois atacam até que um deles ou ambos morram. Cada personagem se move a cada 3 segundos e 5 metros (5 metros por "turno"). Quando os dois personagens se movem um para o outro, o alcance muda em cada turno em 10 unidades e em 5 unidades se apenas um deles se mover. O jogo em si é estruturado para que os dois personagens possam começar a se mover simultaneamente, após o que o movimento é permitido ao mesmo tempo, para que seja possível que ambos os personagens morram ao mesmo tempo.
Em seguida, precisamos configurar a pontuação para esta tabela e gerar um valor numérico indicando o quão “boa” a batalha foi; em outras palavras, quão próximos estamos de alcançar nossos objetivos de design.
Obviamente, queremos que os dois personagens estejam mortos até o final da batalha, ou pelo menos o mais próximo possível da morte. Se a batalha for equilibrada, as duas classes de luta deverão minimizar a saúde do inimigo no final da batalha.
No entanto, isso por si só não é suficiente. Se organizarmos a pontuação dessa maneira, o otimizador simplesmente maximizará os valores de dano para que os dois personagens se matem instantaneamente! (Se você estiver curioso, tente alterar a planilha anexada ao artigo para ver por si mesmo.) Obviamente, não estamos buscando a morte instantânea: precisamos que ambos os personagens estejam mortos ou quase mortos até o final da batalha, mas
ao mesmo tempo queremos que a luta dure um tempo razoável.
Em outras palavras, não estamos apenas nos esforçando para garantir um equilíbrio relativamente igual de todas as classes entre si; também queremos tornar o equilíbrio
interessante , incluindo os combates que duram uma quantidade de tempo adequada.
Para gerar uma estimativa de saldo, precisamos criar várias células à direita de cada tabela.
Duração indica a duração da batalha; ela conta o número de linhas na tabela em que os
dois personagens ainda estão vivos.
O HP total calcula o total de pontos de vida dos dois personagens sobreviventes. Idealmente, deve ser 0, ou seja, quando a batalha termina, os dois personagens estão morrendo.
E, finalmente, o Score combina a duração e a quantidade total de pontos de vida no formato (Duração / (1 + HP total)). Observe que adicionamos 1 ao divisor, porque o HP total pode ser 0 e, nesse caso, obteríamos uma divisão por erro zero. Dessa forma, podemos garantir que recompensamos o otimizador por encontrar a duração máxima da batalha
e o valor mínimo da soma dos pontos de vida.
(Observe que, como temos 17 linhas em cada “simulação” de combate de classe para classe. Isso significa que basicamente tomamos uma decisão de design de que a luta deve durar cerca de 17 rodadas. Se queremos que a luta seja mais curta ou por mais tempo, você pode alterar o número de linhas, editar a fórmula para calcular a pontuação e executar uma segunda otimização de acordo.)
Finalmente, pegamos esses seis valores de pontuação (um para cada tabela) e os usamos na tabela de vitórias acima para mostrar os resultados da batalha entre cada par de classes.
Você pode simplesmente resumir esses seis valores de pontuação e usar o resultado como o valor final da pontuação. No entanto, se fizermos isso, o Solver provavelmente não conseguirá encontrar um bom equilíbrio entre as classificações mais alta e mais baixa para lutas individuais e também receberá classificações muito altas para alguns pares de classes e classificações baixas para outras. Não é isso que queremos: precisamos que
todas as notas sejam altas e nos esforçamos para elevar todas elas. Para corrigir isso, multiplicamos a soma das notas pela nota
mais baixa do grupo (usando a função Excel MIN ()) para fazer o Solver se concentrar nas notas com o valor mais baixo.
Adicionar restrições
Ainda não terminamos. Se você otimizar um modelo de solução com parâmetros atuais, provavelmente as classes não serão configuradas corretamente - na verdade, é altamente provável que o modelo grave os mesmos valores de HP, Dano, Cura e Faixa na tabela de variáveis de decisão.
E, é claro, queremos que cada classe tenha sua própria personalidade. Precisamos de Warrior para causar o maior dano, Mago tem o maior alcance, Curandeiro tem o valor máximo de Cura e Bárbaro tem o HP mais alto. Também queremos que essas diferenças não sejam muito pequenas - precisamos que essas classes sejam muito diferentes umas das outras.
Para fazer isso, criaremos uma pequena tabela de restrições. Esta tabela garante que cada uma das quatro classes tenha um atributo correspondente e, em seguida, dê uma pontuação de 0 ou 1, dependendo se a condição de restrição for atendida.
A tabela Diferença mínima à direita mostra a diferença mínima de cada atributo da classe em relação a todas as outras classes. Em outras palavras, Warrior deve ter pelo menos 4 HP a mais de dano do que todas as outras classes, Mage deve ter um alcance de ataque de pelo menos 10 mais e assim por diante.
Agora que adicionamos essas restrições especiais, é hora de otimizar!
Procurar soluções
Agora podemos executar a ferramenta Solver (“Finding Solutions”) embutida no Excel para tentar otimizar os parâmetros iniciais. Como célula alvo, selecionaremos a célula Pontuação, que combina os resultados de todos os seis torneios. Definimos as variáveis de decisão para incluir todas as 16 células na tabela amarela de variáveis de decisão que criamos no início.
Também definimos as restrições (no campo Assunto para as restrições) da seguinte maneira:
- Todas as células de decisão devem ser inteiras com um valor mínimo de 0.
- Todas as células na coluna HP devem ter um valor máximo de 200 e um mínimo de 30.
- Todas as células na coluna Dano têm um valor máximo de 20.
- Todas as células na coluna Cura têm um valor máximo de 15.
- Todas as células na coluna Intervalo têm um valor máximo de 100.
- Além disso, todas as quatro células na seção Restrições especiais devem ser definidas como 1 para satisfazer suas condições especiais.
Por fim, defina o Método de resolução como Evolucionário e execute o Solver. Observe que, como se trata de um algoritmo evolutivo, existe a chance de melhorar a solução encontrada durante a segunda ou terceira execução do Solver ou após definir parâmetros (botão Opções) para otimização evolutiva.
Como resultado, devemos obter algo semelhante:
... e, como que por mágica, o Solver nos deu uma boa configuração de saldo inicial.
Como você pode ver, Warrior agora causa mais danos, Mage tem o maior alcance, Healer cura melhor e Barbarian tem mais HP. Além disso, você pode ir até os resultados de torneios individuais “classe contra classe” e ver como as classes se mostraram em batalha entre si; como você pode ver, a maioria deles é equilibrada de maneira muito uniforme - no final da batalha, ambas as classes estão morrendo ou uma delas mal sobrevive. Além disso, todos os torneios duram o suficiente, nenhuma das classes pode "bater" na outra.
Nada mal por algumas horas de trabalho, certo?
Conclusão
Neste exemplo, criamos uma tarefa de balanceamento simples e demonstramos que, de fato, podemos resolvê-la com a ajuda da simulação e otimização. Embora seja óbvio que este é um exemplo simples, ele nos mostra o poder das técnicas de modelagem e da otimização de decisões. Além disso, pode se tornar uma fonte de inspiração que pode ser usada em ferramentas de balanceamento mais complexas, fortemente integradas na simulação do jogo. Esperamos que você possa usar este exemplo como um guia para formular essas tarefas na prática.
Nas próximas duas partes da série, abordaremos a área de tarefas de atribuição, que está associada à seleção de atribuições ideais de dois ou mais conjuntos de entidades. Mostraremos como resolver esses tipos de problemas e demonstraremos como usamos essa abordagem para criar o design da torre em nosso jogo de estratégia para iOS / Android
City Conquest .