Calculando a produção de dois exércitos lutando

20

Estou programando um jogo estratégico usando o Flash. O jogo funciona muito semelhante ao famoso jogo "Travian".

Meu problema é o seguinte: estou tentando fazer o cálculo das tropas perdidas como resultado de uma luta entre dois exércitos. Os dois exércitos têm diferentes tipos de unidades. Alguns deles são mais fortes contra outras unidades e mais fracos contra outros tipos.

Como posso colocar esse efeito dessas diferenças na equação da luta?

Parece ser fácil se eles tiverem apenas pontos att e def, mas quando se trata da dependência do tipo de unidade, estou perdido.

Ali Albahrani
fonte
6
O resultado de suas batalhas deve ser puramente determinístico ou você deseja usar algum tipo de aleatoriedade?
sum1stolemyname
4
Não acho que deva ser rotulado como um jogo multiplayer, pois isso não é dado pelo OP - poderia ser humano vs AI. E por 'dependência de tipo', estamos falando do clássico tipo pedra-> tesoura-> papel-> pedra?
The Duck comunista

Respostas:

10

Além de apoiar a sugestão de Amit de examinar as equações de Lanchester, eu apenas quero acrescentar que essa é uma decisão de design de jogo, não um fato empírico que podemos lhe dar. Se você deseja levar em conta o tipo de unidade, precisa decidir o que isso significa. Isso significa escolher uma equação que inclua todos os fatores que você deseja que sua jogabilidade inclua. Se você quer que a infantaria seja melhor que a cavalaria, você precisa decidir o que isso significa - por exemplo. de quantos cavalaria você precisa para igualar 100 infantaria? E importa quem ataca quem? Você parece estar implicando que simplesmente dar valores diferentes de ataque e defesa à infantaria e cavalaria não é bom o suficiente - por que isso? O que mais você está tentando representar que não pode ser capturado apenas por esses valores?

Você precisa decidir quais fatores deseja modelar no seu jogo, pois eles afetam a maneira como os jogadores o abordam. Isso pode incluir tamanho / quantidade da unidade, tipo de unidade, experiência da unidade (por exemplo, status de veterano), efeitos no terreno e no ambiente, diferenças entre atacar e defender, se houver, modelar danos e atritos ou não, modelar a passagem do tempo durante o combate, a capacidade de se retirar ou fugir (possivelmente incluindo modelagem do moral), quanta aleatoriedade você deseja na equação e assim por diante.

Depois de saber tudo isso, existem várias abordagens matemáticas básicas que você pode adotar. Você poderia fazer um sistema de "chance de acertar" rodada a rodada como muitos RPGs, por exemplo. o sistema de combate d20. Você pode fazer um sistema de arremesso de moeda ponderada de "ataque x defesa", como o jogo original do Civilization. Você pode fazer com que cada lado gere uma pontuação adicionando atributos a um número aleatório e quem ganha o maior valor ganha. E você pode permitir que esses sistemas funcionem round-by-round, ou deduzir pontos de vida ou moral, ou o que for. Qualquer sistema pode funcionar, mas você precisa equilibrá-lo da maneira que deseja. Em última análise, a escolha de como modelar o combate é uma parte essencial do design do jogo, e não é algo que outras pessoas possam dar a você.

Kylotan
fonte
Você está completamente certo, Kylotan. Eu tive algumas idéias sobre a luta antes de iniciar o design do jogo. No entanto, postei essa pergunta perguntando se existe uma maneira melhor de projetá-la e descubra qual é a melhor maneira de implementá-la. Eu venci com os dois propósitos, eu acho :) Meu amigo, você poderia me dizer onde posso encontrar mais informações sobre essas abordagens matemáticas? Além disso, se eu responder a todas as perguntas que você faz sobre a escolha do sistema, pode me aconselhar qual delas funciona melhor para o meu caso? Muito obrigado pelo seu tempo :)
Ali Albahrani
Não sei dizer qual será o melhor, mas você provavelmente deve começar de maneira simples e melhorar se necessário. Travian parece ter um sistema simples de ataque x defesa, com 2 tipos de unidades (infantaria e cavalaria) e 2 pontos de defesa por unidade de acordo. Uma maneira fácil de resolver uma batalha, como usada na Civilização 1, é dividir a pontuação do ataque do atacante pelo total disso mais a pontuação da defesa do defensor. Isso fornece uma porcentagem. Agora escolha um número aleatório entre 0 e 100%. Se for menor que a pontuação de ataque do atacante, os atacantes vencem. Caso contrário, os defensores vencem.
Kylotan
15

Para Solar Realms Elite, fui inspirado pelas Equações de Lanchester para modelar a guerra . Eu tive várias lutas simultâneas em cada rodada da batalha.

Na primeira luta, todos atacaram soldados. No SRE, os soldados são melhores contra soldados (não são tesouras de papel de pedra, mas infantaria, ataque aéreo e espaço profundo). Eu montei um poder de ataque e defesa onde os soldados tiveram o melhor ataque:

attack_strength = 3*soldiers + 1*fighters + 2*cruisers
defense_strength = 10*soldiers

Na segunda luta, todos atacaram as estações de defesa. No SRE, os combatentes (aéreos) são os melhores contra as estações de defesa (por exemplo, antiaéreo)

attack_strength = 1*soldiers + 4*fighters + 2*cruisers
defense_strength = 25*defense_stations

Na terceira luta, todos atacaram os cruzadores pesados. No SRE, os cruzadores pesados ​​estão no espaço e são melhores do que outros cruzadores pesados:

attack_strength = 1*soldiers + 1*fighters + 10*cruisers
defense_strength = 15*cruisers

(Não me lembro de constantes que usei; esses são apenas exemplos.) Em cada rodada da batalha, os atacantes perdiam alguma fração da força de defesa e os defensores perdiam alguma fração da força de ataque. Eu acredito que isso corresponde à Lei da Praça de Lanchester (equações aqui ). Eu adicionei aleatoriedade, mas não me lembro exatamente onde. Após cada rodada de batalha, os exércitos seriam menores. Eu coloquei um limite máximo no número de rodadas; depois disso, o lado perdedor recuaria.

Não era realista ter a infantaria no chão disparando para o espaço profundo, mas funcionou melhor por razões de jogabilidade, para que todas as unidades pudessem lutar contra todas as outras unidades (com eficácia reduzida).

amitp
fonte
12

Costumo dizer 'se você não conseguir encontrar uma solução explícita, procure uma solução implícita'. Você pode simular a batalha internamente até que um exército seja aniquilado ou recue (dependendo dos possíveis resultados do seu jogo).

Eu usaria algo assim:

Para cada iteração da batalha, todas as unidades são oportunistas e, portanto, tentam causar o máximo de dano possível. Cada unidade seleciona uma unidade inimiga que atacará nesta rodada, com base nas vantagens / desvantagens conhecidas.

Então, todas as sub-lutas são realizadas. Um exemplo:

Que os lanceiros sejam eficazes contra cavaleiros, os cavalaray efetivos contra arqueiros e os arqueiros efetivos contra lanceiros.

Em uma luta entre dois exércitos que consistem em todos os tipos dessas unidades básicas, todos os lanceiros atacariam a cavalaria, todas as unidades de cavalaria atacariam arqueiros e todos os arqueiros atacariam lanceiros. Se, por exemplo, um lado não tivesse arqueiros, o outro lado da cavalaria selecionaria o próximo melhor tipo de alvo (sendo as unidades inimigas de cavalaria)

Cada evento unidade-ataque-unidade é resolvido separadamente, com a unidade perdida sendo danificada ou marcada como destruída.

Após todas as lutas individuais terem sido resolvidas, remova todas as unidades que foram criticamente danificadas ou destruídas.

A próxima iteração começa a usar os exércitos agora reduzidos.

sum1stolemyname
fonte
Concordo realmente com este post. É melhor percorrer a batalha em vez de reduzi-la a uma única equação. E eu definitivamente adicionaria um pouco de aleatoriedade a ele. Deveria haver uma chance tão pequena que o defensor fraco rola alto e marca um ponto crítico. Outra vantagem da iterativa é que você pode criar uma narração dos eventos para mostrar ao jogador. "Os espadachins atacaram e logo dizimaram os lacaios, mas então o calvário chegou e ..."
Tim Holt
Eu gosto de sua resposta muito, e eu acho que vai implementá-lo com aleatoriedade :)
Ali Albahrani
3

Estou testando beta um jogo que atualmente é uma versão simples de Solar Realms ( Star Empire Elite ), e comecei usando algo semelhante às equações de Amit (acima). Gostei particularmente da ideia de ter três fases na batalha, onde você teve que vencer duas das três. Mas eu também queria introduzir um elemento aleatório na batalha, e por isso fui influenciado por alguns jogos de mesa.

O processamento é uma preocupação se o jogo é escalável, então eu não queria seguir o método sugerido pelo sum1stolemyname acima, embora se o seu jogo estiver usando o cliente para processar os resultados, em oposição a um servidor, isso parece ser um boa abordagem.

Decidi dividir a batalha em duas fases (análoga às três no modelo de Amit): ar e solo. Eu calculo o ataque e defendo a força, e ajusto a força do ataque em uma fração (para dar vantagem ao defensor). Nesse ponto, se a força de ataque e a força de defesa são iguais, o ataque tem 50% de chance de vitória. A partir daí, ajusto a porcentagem de chances de vitória para cima ou para baixo com base em quanto mais (ou menos) força o atacante comparou ao defensor. Aqui estão algumas equações simplificadas para o ar:

air_attack_strength = 1 * soldiers + 10 * fighters
air_defence_strength = 2 * soldiers + 25 * stations

differential = (air_attack_strength - air_defence_strength) * constant

chance_of_victory = 50 - differential

Especifico que a chance de vitória nunca pode ser maior que 80 ou menor que 5. A partir daí, apenas giro um número aleatório de 100 e depois levo esse resultado para a batalha terrestre.

Uma coisa que não resolvi com satisfação é a taxa de baixas. Mas estou pensando que uma boa maneira de descobrir isso seria comparar a chance de vitória com o número aleatório gerado e usá-la para tomar uma fração das forças de defesa e ataque como baixas.

Robert Yogurt
fonte