Calcul de la sortie de deux armées combattant


20

Je programme un jeu stratégique avec Flash. Le jeu fonctionne de manière très similaire au célèbre jeu "Travian".

Mon problème est le suivant: j'essaie de faire le calcul des troupes perdues à la suite d'un combat entre deux armées. Les deux armées ont différents types d'unités. Certains d'entre eux sont plus forts contre certaines autres unités et plus faibles contre d'autres types.

Comment puis-je mettre cet effet de ces différences dans l'équation du combat?

Cela semble être facile s'ils n'ont que des points att et def, mais quand il s'agit de la dépendance de type d'unités, je suis perdu.


6
Le résultat de vos batailles doit-il être purement déterministe ou voulez-vous utiliser une sorte de hasard?
sum1stolemyname

4
Je ne pense pas qu'il devrait être étiqueté comme un jeu multijoueur car cela n'est pas donné par l'OP-il pourrait être humain vs IA. Et par «dépendance de type», parlons-nous du classique rock-> ciseaux-> papier-> chose de type rock?
The Communist Duck

Réponses:


10

En plus d'appuyer la suggestion d'Amit de regarder les équations de Lanchester, je veux juste ajouter que c'est une décision de conception de jeu, pas un fait empirique que nous pouvons vous donner. Si vous souhaitez prendre en compte le type d'unité, vous devez décider ce que cela signifie. Cela signifie choisir une équation qui inclut tous les facteurs que vous souhaitez inclure dans votre gameplay. Si vous voulez que l'infanterie soit meilleure que la cavalerie, alors vous devez décider ce que cela devrait signifier - par exemple. de combien de cavalerie avez-vous besoin pour égaler 100 fantassins? Et est-ce important de savoir qui attaque qui? Vous semblez laisser entendre que le simple fait de donner à l'infanterie et à la cavalerie des valeurs d'attaque et de défense différentes n'est pas suffisant - pourquoi? Qu'essayez-vous d'autre de représenter qui ne peut pas être capturé uniquement par ces valeurs?

Vous devez décider quels facteurs vous souhaitez modéliser dans votre jeu, car ils affectent la façon dont les joueurs l'approcheront. Ceux-ci peuvent inclure la taille / quantité d'unité, le type d'unité, l'expérience de l'unité (par exemple, le statut de vétéran), les effets du terrain et de l'environnement, les différences entre l'attaque et la défense, le cas échéant, pour modéliser les dommages et l'attrition ou non, pour modéliser le passage du temps pendant le combat, la capacité de se retirer ou de fuir (y compris éventuellement la modélisation du moral), le degré de hasard que vous voulez dans l'équation, etc.

Une fois que vous savez tout cela, vous pouvez adopter plusieurs approches mathématiques de base. Vous pouvez faire un tour par tour le système "chance de frapper" comme beaucoup de RPG, par exemple. le système de combat d20. Vous pouvez faire un système de lancer de pièces pondéré "attaque contre défense" en un tour comme le fait le jeu Civilization original. Vous pouvez demander à chaque camp de générer un score en ajoutant des attributs à un nombre aléatoire et celui qui obtient la valeur la plus élevée gagne. Et vous pouvez permuter ces systèmes pour qu'ils fonctionnent tour à tour, ou pour déduire des points de vie ou des points de moral, ou autre chose. N'importe quel système peut fonctionner, mais vous devez l'équilibrer comme vous le souhaitez. En fin de compte, le choix de la façon de modéliser le combat est un élément clé de la conception du jeu, et ce n'est pas quelque chose que les autres peuvent simplement vous donner.


Vous avez tout à fait raison Kylotan. J'ai eu quelques idées sur le combat avant de commencer la conception du jeu. Cependant, j'ai posté cette question en demandant s'il existe une meilleure façon de la concevoir et de savoir quelle est la meilleure façon de la mettre en œuvre. J'ai gagné sur les deux objectifs, je suppose :) Mon ami, pourriez-vous s'il vous plaît me dire où je peux trouver plus d'informations sur ces approches mathématiques? De plus, si je réponds à toutes les questions que vous posez sur le choix du système, pouvez-vous me conseiller lequel convient le mieux à mon cas? Merci beaucoup pour votre temps :)
Ali Albahrani

Je ne peux pas vous dire laquelle sera la meilleure, mais vous devriez probablement commencer simplement et améliorer cela si vous en avez besoin. Travian semble avoir un système d'attaque contre défense simple, avec 2 types d'unités (infanterie et cavalerie) et 2 scores de défense par unité en conséquence. Un moyen facile de résoudre une bataille, comme utilisé dans Civilization 1, est de diviser le score d'attaque des attaquants par le total de celui-ci plus le score de défense du défenseur. Cela vous donne un pourcentage. Choisissez maintenant un nombre aléatoire entre 0 et 100 pour cent. S'il est inférieur au score d'attaque de l'attaquant, les attaquants gagnent. Sinon, les défenseurs gagnent.
Kylotan

15

Pour Solar Realms Elite, je me suis inspiré des équations de Lanchester pour modéliser la guerre . J'ai eu plusieurs combats simultanés à chaque round de bataille.

Lors du premier combat, tout le monde a attaqué des soldats. Dans le SRE, les soldats sont meilleurs contre les soldats (ce ne sont pas des ciseaux de papier de roche, mais l'infanterie, l'attaque aérienne et l'espace lointain). J'ai mis en place une puissance d'attaque et de défense où les soldats ont eu la meilleure attaque:

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

Dans le deuxième combat, tout le monde a attaqué les postes de défense. Dans le SRE, les combattants (aériens) sont les meilleurs contre les stations de défense (par exemple anti-aériennes):

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

Dans le troisième combat, tout le monde a attaqué les croiseurs lourds. Dans SRE, les croiseurs lourds sont dans l'espace et sont meilleurs contre d'autres croiseurs lourds:

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

(Je ne me souviens pas quelles constantes j'ai utilisées; ce ne sont que des exemples.) À chaque round de bataille, les attaquants perdraient une fraction de la force de défense et les défenseurs perdraient une fraction de la force d'attaque. Je crois que cela correspond à la loi carrée de Lanchester (équations ici ). J'avais ajouté du hasard mais je ne me souviens pas exactement où. Après chaque round de bataille, les armées seraient plus petites. J'ai mis une limite maximale sur le nombre de tours; après cela, le côté perdant battrait en retraite.

Il n'était pas réaliste d'avoir l'infanterie au sol tirant dans l'espace lointain, mais cela fonctionnait mieux pour des raisons de jeu pour que toutes les unités puissent combattre toutes les autres unités (avec une efficacité réduite).


12

J'ai tendance à dire «si vous ne trouvez pas de solution explicite, cherchez-en une implicite». Vous pouvez simuler la bataille en interne jusqu'à ce qu'une armée soit anéantie ou bat en retraite (en fonction des résultats possibles de votre jeu).

J'utiliserais quelque chose comme ça:

Pour chaque itération de la bataille, toutes les unités sont opportunistes, elles essaient donc de faire le plus de dégâts possible. Chaque unité sélectionne une unité ennemie qu'elle va attaquer ce tour, en fonction des avantages / inconvénients connus.

Ensuite, tous les sous-combats sont effectués. Un exemple:

Que les lanciers soient efficaces contre le cavalaire, le cavalaray efficace contre les archers et les archers efficaces contre le lancier.

Dans un combat entre deux armées composées des deux types de ces unités de base, tous les lanciers attaqueraient la cavalerie, toutes les unités de cavalerie attaqueraient les archers et tous les archers attaqueraient les lanciers. Si, par exemple, un camp n'avait pas d'archers, les cavaliers des autres camps sélectionneraient le meilleur type de cible (les unités de cavalerie ennemies).

Chaque événement unité-attaque-unité est résolu séparément, l'unité perdante étant endommagée ou marquée comme détruite.

Une fois tous les combats individuels résolus, retirez toutes les unités qui ont été gravement endommagées ou détruites.

La prochaine itération commence à utiliser les armées désormais réduites.


Je suis vraiment d'accord avec ce post. Mieux vaut parcourir la bataille au lieu de la réduire à une seule équation. Et j'y ajouterais certainement un peu de hasard. Il devrait y avoir cette très faible chance que le défenseur faible roule haut et marque un coup critique. Un autre avantage de l'itération est que vous pouvez créer une narration des événements pour montrer au joueur. "Les épéistes ont attaqué et décimé rapidement les valets de pied, mais le calvaire est arrivé et ..."
Tim Holt

J'aime beaucoup votre réponse, et je pense que je vais la mettre en œuvre au hasard :)
Ali Albahrani

3

Je teste actuellement un jeu qui est actuellement une version simple de Solar Realms ( Star Empire Elite ), et j'ai commencé par utiliser quelque chose de similaire aux équations d'Amit (ci-dessus). En particulier, j'ai aimé l'idée d'avoir trois phases de bataille, où il fallait gagner deux des trois. Mais je voulais aussi introduire un élément de hasard dans la bataille, et pour cela j'ai été influencé par certains jeux de table.

Le traitement est une préoccupation si le jeu est à l'échelle, donc je ne voulais pas suivre la méthode suggérée par sum1stolemyname ci-dessus, bien que si votre jeu utilise le client pour traiter les résultats, contrairement à un serveur, cela semble être un bonne approche.

J'ai décidé de diviser la bataille en deux phases (analogues aux trois du modèle d'Amit): l'air et le sol. Je calcule la force d'attaque et de défense, et j'ajuste la force d'attaque d'une fraction (pour donner l'avantage au défenseur). À ce stade, si la force d'attaque et la force de défense sont égales, l'attaque a 50% de chances de victoire. De là, j'ajuste le pourcentage de chances de victoire à la hausse ou à la baisse en fonction de la force (ou moins) de l'attaquant par rapport au défenseur. Voici quelques équations simplifiées pour l'air:

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

Je précise que la chance_de_victoire ne peut jamais être supérieure à 80 ou inférieure à 5. À partir de là, je génère simplement un nombre aléatoire sur 100, puis reporte ce résultat à la bataille terrestre.

Une chose que je n'ai pas résolu à ma satisfaction est le taux de victimes. Mais je pense qu'un bon moyen de comprendre cela serait de comparer la chance_de_victoire au nombre aléatoire généré, et de l'utiliser pour prendre une fraction des forces attaquantes-défendantes comme victimes.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.