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.
game-design
architecture
mathematics
Ali Albahrani
fonte
fonte
Respostas:
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ê.
fonte
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:
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)
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:
(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).
fonte
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.
fonte
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:
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.
fonte