Répartition des morts après un combat
#1
Bonjour à tous,

Je viens vers vous afin de m'aider à trouver une solution à un problème que je rencontre.

Dans Antsland, les joueurs peuvent s'attaquer avec différentes unités.

Admettons que dans un combat vous avez :

Pour l'attaquant :
Nombre d'unité de type 1 : 20 
Nombre d'unité de type 2 : 50
Nombre d'unité de type 3 : 10

Pour le défenseur :
Nombre d'unité de type 1 : 30
Nombre d'unité de type 3 : 40

Mon système de combat fonctionne comme suit pour simplifier :
On additionne les points d'attaques des différentes unités présentent de l'attaquant.
On additionne les points de défense des différentes unités présentent de l'attaquant.

On additionne les points d'attaques des différentes unités présentent du défenseur.
On additionne les points de défenses des différentes unités présentent du défenseur.

Ensuite on calcul les dégâts subits :
Par l'attaquant : Point de défense de l'attaquant - Point d'attaque du défenseur
Par le défenseur : Point de défense du défenseur - Point d'attaque de l'attaquant

A partir des dégâts subits par chacun, je souhaite connaitre le nombre d'unité 'morte' pour l’attaquant et le défenseur par type d'unité.

Exemple : Si l'attaquant à subit 100 points de dégâts je voudrais savoir combien d'unité de type 1, 2, et 3 je dois lui tuer pour que les 100 points de dégâts soit absorber par les points de vie des unités.

J'espère avoir été à peu près clair 2
Répondre
#2
Hello

il manque quelques éléments pour répondre correctement :

1) est ce que toutes les unités (quelque soit leur type) ont le même nombre de "pv" (ou degat a supporter) ?
2) est ce que tu es prêt ou non à mettre du pseudo aléatoire (aka fonction rand() ) ? (dédicace xenos)
[WIP]projet Rivages
[WIP]projet Arthur (comme si ça suffisait pas d'un...)
Répondre
#3
^^ 
(08-20-2019, 02:17 PM)Ter Rowan a écrit : Hello

il manque quelques éléments pour répondre correctement :

1) est ce que toutes les unités (quelque soit leur type) ont le même nombre de "pv" (ou degat a supporter) ?
2) est ce que tu es prêt ou non à mettre du pseudo aléatoire (aka fonction rand() ) ? (dédicace xenos)

Les différents types d'unités on des statistiques différentes.

Exemple. 
Type 1 :
PV = 2
Attaque = 1
Défense = 1

Type 2 :
PV = 5
Attaque = 3
Défense = 2
Attaque = 3 

Pour l'aléatoire je n'ai rien contre, mais idéalement je voyais plutôt le fait de toucher les différents types d'unités présentent dans le combat de façon le plus 'équitable' possible.
J'entends par la que le type d'unité ultime peut aussi bien mourir que la toute première unité du jeu.

Après tout dans le combat, tout le monde participe il n'y a pas de risque 0 1
Répondre
#4
Logiquement on peut se dire que le nombre de dégâts reçu par un type d'unité est proportionnel au nombre de ce type d'unités.

Dégâts subis par les unités de type i = dégâts subis par l'armée * nombre d'unités i / nombre d'unité total

En reprenant ton exemple de 100 points de dégât subis par ton attaquant.
L'attaquant a un total de 80 unités, dont 20 de type 1.
On a donc :
Dégâts subis par les unités de type 1 = 100 * 20 / 80 = 25
Si l'unité a mettons 5 PV, ça tu en tue 5 (5x5=25).
Répondre
#5
Pour moi, c'est plus une question de savoir quelle répartition de dégâts tu veux, et non "comment" les répartir (au sens implémentation). Je vois deux approches possibles:
- Toutes les unités prennent des dégats, et en gros, si on a D dégats pour P points de vie alors chaque unité perds 100*D/P% de vie
- Certaines unités prennent du dégât (et meurent), pas les autres, auquel cas pour D dégats et N unités de chacune p points de vie, on est plus proche de FLOOR(D/p) unités mortes

En terme de gameplay, les deux peuvent se valoir: le 1er permet de garder toutes les unités, sauf en cas de cuisante défaite (si D > P, aka on a pris plus de dégats qu'on a de PV au total). Ca fait très "tout ou rien/all in", mais cela peut se faire suivant le type de jeu. Le second est plus proche d'un "ogame", puisqu'on perdra des unités à chaque bataille. On ne perdra là encore toutes les unités que si D > P. Pour des unités de type différent, il faudra les "ordonner" pour savoir lesquelles tuer en premier.

Edit (vu qu'on a tous répondus en même temps): Le cas proposé par Theta peut poser des questions: si j'ai 1000 unités de 1PV + 1 unité de 1000PV. Total 2000PV. Je prends 1000 de dégats. Comment souhaites-tu, en terme de gameplay, qu'ils soient répartis? L'unité de 1000PV meure? 1000 unités de 1PV meurent? 500 unités de 1PV meurent et l'unité de 1000 PV prend 500 dégats?
Dans l'exemple de Theta, comme on a 1001 unités, on aura 1000 * 1000 / 1001 = 1000 à peu près, donc toutes les unités de 1PV meurent, et 1000 * 1 / 1001 = 1 donc l'unité de 1000PV n'aura presque pas de dégat

Perso, c'est la raison pour laquelle, dans Variispace, je compte permettre aux joueurs de définir un "plan de bataille", de sorte à n'avoir toujours qu'1 type d'unité (vaisseau) contre 1 autre type. Les dégats seront plus simples à répartir, puisqu'on n'a plus de différence entre les unités (qui seront alors ciblées 1 à 1)
Répondre
#6
Effectivement mon exemple ne fonctionne pas s'il y a une trop grande différence entre les unités. Mais pour des fourmis je pense pas qu'il y ai une différence 1/1000 entre petite et grosses unités.

Et puis c'est facilement adaptable en ajoutant un statistique qui augmente les chances d'être touché (taille), par exemple :
Agro type d'unité i = taille unité i * nombre d'unités i
Dégâts subis par les unités de type i = dégâts subis par l'armée * agro unités i / agro total

Mais après oui, il y a une infinité d'autres façon de faire selon le résultat qu'on veut. Mais d'après le post de Chbig, j'avais l'impression que ce que je proposais collait à peu près à son idée (pas d'aléatoire, pas de jauge de PV par unité)

Dans pas mal de jeux les unités sont simulées individuellement, ont chacune une jauge de point de vie, et attaque chacune une unité adverse au hasard.
Répondre
#7
(08-20-2019, 02:45 PM)Thêta Tau Tau a écrit : Effectivement mon exemple ne fonctionne pas s'il y a une trop grande différence entre les unités. Mais pour des fourmis je pense pas qu'il y ai une différence 1/1000 entre petite et grosses unités.

Et puis c'est facilement adaptable en ajoutant un statistique qui augmente les chances d'être touché (taille), par exemple :
Agro type d'unité i = taille unité i * nombre d'unités i
Dégâts subis par les unités de type i = dégâts subis par l'armée *  agro unités i / agro total

Mais après oui, il y a une infinité d'autres façon de faire selon le résultat qu'on veut. Mais d'après le post de Chbig, j'avais l'impression que ce que je proposais collait à peu près à son idée (pas d'aléatoire, pas de jauge de PV par unité)

Dans pas mal de jeux les unités sont simulées individuellement, ont chacune une jauge de point de vie, et attaque chacune une unité adverse au hasard.

Tout d'abord merci Thête Tau Tau et Xenos pour vos réponses qui sont fort intéressante.

Ma vision des choses se rapproche plus de ce qu'à proposé Thêta Tau Tau.

Mais, il est vrai qu'en implémentant mon système de combat, je m'étais déjà posé la question de point de vie par unité et que chaque unité attaque une unité adverse au hasard.
Mais comme je n'avais aucune idée d'une telle implémentation je suis parti sur le 1er système de combat.

Je serai d’ailleurs très curieux de voir comment est implémenté un système de combat ou chaque unité n'attaque qu'une unité choisi au hasard.

C'est le premier jeu que je développe est j'adore les problématiques qu'on peut rencontrer lorsqu'on creuse l'implémentation de son gameplay 2

Comme vous le disiez si bien, il n'y a pas une solution, mais plusieurs, tout dépend de ce qu'on veut (et de ce qu'on peut 16 )
Répondre
#8
Le problème de simuler chaque unité, c'est la masse que tu peux finir par avoir (10k unités attaquant 10k unités, ça peut vite faire lourd: on parle de 100M de combinaisons là!). Groupées par type, ça sera déjà mieux. Cela s'appelle une modélisation, et c'est ce qui permet d'éviter de simuler une galaxie pour rien : )

En effet, rajouter une statistiques, ça peut être bien. Perso, je ne la lierai pas direct à la taille: je créerai une stat dédiée "attaque_ratio" (le nom est moisi, faut le retravailler) qui sert de "taille" dans l'exemple de Theta, mais qui n'est pas forcément directement la taille "physique" de l'unité. C'est juste une grandeur que je fixerai arbitrairement, et que je pourrai alors ajuster librement par la suite (sinon, l'ajustement sera impossible: la taille physique sera liée à ce paramètre de "taille attaquable", et l'un ne se change pas sans l'autre; pour peu que la taille physique soit liée à autre chose ailleurs, tu arriveras à ECLERD v0: le moindre petit changement de stat quelque part chamboule tout sans contrôle!)

Dans tous les cas, je pense qu'il faut surtout que tu sois capable "d'isoler" ta composante de dégat, de sorte que si tu veux totalement changer la façon dont les fourmis prennent du dégat, alors tu n'auras pas à toucher autre chose que cette section dédiée aux dégats. Ca peut se "tester" (se vérifier) en prenant un modèle bidon et complètement à côté de ce que tu veux (volontairement, par exemple: les dégats détruisent toutes les fourmis s'ils sont pair, aucune s'ils sont impairs); puis tu changes ce modèle pour celui qui t'intéresse. Si tu as dû toucher autre chose que le code de dégat pour faire ce changement, alors tu as un soucis "d'isolation/séggrégation".

(c'est une approche contestable, mais ça peut t'aider à rester modulaire pour éviter de trop galérer quand tu voudras changer ce modèle dont tu n'es pas sûr à 100%)
Répondre
#9
(08-20-2019, 05:12 PM)Xenos a écrit : Le problème de simuler chaque unité, c'est la masse que tu peux finir par avoir (10k unités attaquant 10k unités, ça peut vite faire lourd: on parle de 100M de combinaisons là!). Groupées par type, ça sera déjà mieux. Cela s'appelle une modélisation, et c'est ce qui permet d'éviter de simuler une galaxie pour rien : )

Non, ce genre d'algo a une complexité linéaire. J'avais fait des tests il y a plusieurs années, je me souviens plus des résultats exacts, mais il me semble que même avec des centaines de milliers d'unités ça tournait en quelques dixièmes de secondes.

C'est peu être dans un post du forum d'ailleurs.
Répondre
#10
Oui, c'est vrai que si l'unité s'arrête à la 1ere cible qu'elle trouve au pif, on sera linéaire ou assimilé. J'avais pas pensé à ça, un bon point pour toi ! 2
Répondre


Sujets apparemment similaires...
Sujet Auteur Réponses Affichages Dernier message
  Répartition des joueurs sur une carte mano72 8 3 837 03-08-2012, 11:07 PM
Dernier message: Argorate



Utilisateur(s) parcourant ce sujet : 1 visiteur(s)