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.
game-design
architecture
mathematics
Ali Albahrani
la source
la source
Réponses:
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.
la source
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:
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):
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:
(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).
la source
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.
la source
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:
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.
la source