La bataille sur ce sujet du forum est plus violente que les combats dont il est question...!
Habituellement, on n'envoie pas promener ceux qui prennent le temps de réponse à la question...
Bonne piste que d'étudier l'existant dans les autres jeux, y compris les jeux de plateau: suis la piste que Ter Rowan t'as montrée.
Sinon, fais progressif: part d'une base simple, par exemple la différence de niveau (ou le quotient), et complexifie la formule avec les autres paramètres. Utilise les différentes fonctions mathématiques "classiques" (différence, quotient, inverse, exponentielle, logarithme,...) et insère, par exemple, une multiplication par la force, ou l'écart relatif des habiletés.
Un exemple (en considérant, comme dit justement Ter Rowan, que l'attaque et la riposte sont en fait deux assauts fonctionnant sur le même principe):
L'avant-dernière formule venant de la constatation graphique:
C'est là où on ne regrette pas d'avoir suivit les cours de maths (bien que l'on puisse trouver des fonctions classiques sur le net et s'en resservir) !
Cette approche progressive, en imbriquant les fonctions (à l'implémentation, cela revient à les chaîner) permettra d'adapter chaque composante, d'en rajouter, d'en retirer etc...
On peut, avant la chaine, tester l'écart d'esquive entre les deux joueurs par exemple, et ne lancer l'attaque que si le défenseur n'a pas esquivé (c'est là où on s'inspire de ce qui existe déjà).
Au bout du compte, on arrive à quelque chose comme
On peut même ajuster chacune des sous-fonctions (Force(x), Esquiver(x)...) pour jouer sur l'influence de chacun des paramètres (rien n'oblige à débuter chaque fonction par "x*", on peut préférer un "x+" par exemple, ou des combinaisons "x*(...+x)")...
Habituellement, on n'envoie pas promener ceux qui prennent le temps de réponse à la question...
Bonne piste que d'étudier l'existant dans les autres jeux, y compris les jeux de plateau: suis la piste que Ter Rowan t'as montrée.
Sinon, fais progressif: part d'une base simple, par exemple la différence de niveau (ou le quotient), et complexifie la formule avec les autres paramètres. Utilise les différentes fonctions mathématiques "classiques" (différence, quotient, inverse, exponentielle, logarithme,...) et insère, par exemple, une multiplication par la force, ou l'écart relatif des habiletés.
Un exemple (en considérant, comme dit justement Ter Rowan, que l'attaque et la riposte sont en fait deux assauts fonctionnant sur le même principe):
Code :
#Dégats de base
Degats = 5
#On complexifie avec le niveau
Degats() = Frapper(5)
Frapper(x) = x*(1+NiveauAttaquant)/(1+NiveauDefenseur)
# La force fait frapper plus fort: on l'insère
Degats() = Force( Frapper(5) )
Force(x) = x*(1+ForceAttaquant)
# Ah ouais, mais là, ça "monte" trop vite, la force a trop d'impact: on réduit
Force(x) = x*log10(1+ForceAttaquant)
# Mais la résistance de l'autre compte... Logiquement, elle doit marcher un peu comme la force:
Force(x) = x*( log10((1+ForceAttaquant)/(1+ResistanceDefenseur)) )
# Ajoutons l'esquive et l'habileté
Degats() = Esquiver( Force( Frapper(5) ) )
DiffEsquive() = (HabileteAttaquant-EsquiveDefenseur)
Esquiver(x) = x*DiffEsquive
# Mouais... "Tassons" un peu: quand l'habileté et l'esquive sont "proches", faudrait que ca ne change rien
Esquiver(x) = x*( DiffEsquive*(1-exp(-DiffEsquive²/20)) )
# Ah oui, mais si l'esquive du défenseur dépasse l'habileté de l'attaquant? Il faut limiter les
Degats() = Limiter(0, Esquiver( Force( Frapper(5) ) ), 10)
# etc
L'avant-dernière formule venant de la constatation graphique:
C'est là où on ne regrette pas d'avoir suivit les cours de maths (bien que l'on puisse trouver des fonctions classiques sur le net et s'en resservir) !
Cette approche progressive, en imbriquant les fonctions (à l'implémentation, cela revient à les chaîner) permettra d'adapter chaque composante, d'en rajouter, d'en retirer etc...
On peut, avant la chaine, tester l'écart d'esquive entre les deux joueurs par exemple, et ne lancer l'attaque que si le défenseur n'a pas esquivé (c'est là où on s'inspire de ce qui existe déjà).
Au bout du compte, on arrive à quelque chose comme
Code :
Degats() = Limiter(0, Esquiver( Force( Frapper(5) ) ), 10)
DiffEsquive() = (HabileteAttaquant-EsquiveDefenseur)
Esquiver(x) = x*( DiffEsquive*(1-exp(-DiffEsquive²/20)) )
Force(x) = x*( log10((1+ForceAttaquant)/(1+ResistanceDefenseur)) )
Frapper(x) = x*(1+NiveauAttaquant)/(1+NiveauDefenseur)
On peut même ajuster chacune des sous-fonctions (Force(x), Esquiver(x)...) pour jouer sur l'influence de chacun des paramètres (rien n'oblige à débuter chaque fonction par "x*", on peut préférer un "x+" par exemple, ou des combinaisons "x*(...+x)")...