JeuWeb - Crée ton jeu par navigateur
Calcul de points de degats - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Calcul de points de degats (/showthread.php?tid=226)



Calcul de points de degats - comode - 18-09-2006

Bonjour,

Imaginez un jeu ou un joueur dispose de point d'attaque et de point de défenses. Ces 2 valeurs antagonistes doivent permettre de déterminer le nombre de point de dégats infligés entre joueurs en fonction de vos point d'attaques et en fonction des points de defense de votre victime.

Mon but est de trouvé la fonction qui permettra de déterminer en fonction de ces valeurs les domages les plus justes.

Pour cela, je considère un nombre de points de degats fixes (en réalité, il a une faible composante aléatoire dont on fera abstraction ici) infligé lorsque le nombre de points d'attaque est équivalent au nombre de points de defense. On appel cette valeur C.

Ensuite, on considère des limites inférieurs et supérieurs exprimés en fonction de C qui vont déterminer les valeurs minimum et maximum de points de degats infligés.
Ainsi, lorsque le rapport ATK/DEF tend vers l'infinie, on doit arriver a un nombre de points de degats infligés de l'ordre de 1.9*C.
Inversement, lorsque le raport de DEF/ATK tend vers l'infini, on doit ingliger 0.1*C dégats.

Reste ensuite a être subtil en écriavant la fonction (Ln?) de sorte a ce que la variation des points de degats infligés ne soient pas trop brutales entre des valeurs proches;
ex : STR=20 et DEF=20 ne doit pas faire une différence trop significative avec le couple STR=20 et DEF=21, ce qu'implique pourtant l'utilisation d'un Log n.

J'en arrive donc à ma question, quelqun aurrait-il une fonction géniale qui ferait ça ? J'ai déjà testé un certains nombres de fonctions, mais aucune ne m'a encore donné satisfaction.
J'utilise en attendant (et j'espère provisoirement) une fonction linéaire bornée.

Merci de votre aide !


RE: Calcul de points de degats - naholyr - 18-09-2006

Vite fait comme ça, mais c'est à tester : en posant f(x) = (x+1.8)/(x²+1)
On a f(0) = 1.8, et f(x -> +oo) -> 0.

Donc en posant g(x) = f(x)+0.1
On aurait g(+oo) = 0.1, et g(0) = 1.9

Tu pourrais donc calculer dégats = g(DEF/ATK) * C = ( 0.1 + ( (DEF/ATK+1.8)/(DEF²/ATK²+1) ) ) * C

Par contre autant je pense être OK sur ces limites, autant je n'ai aucune idée de son tracé, donc il faudrait que tu analyses un peu la fonction avant de l'appliquer.

Voici quelques valeurs d'exemple :
Citation :g(0) = 1.9
g(1) = 1.5
g(2) = 0.86
g(3) = 0.58
g(4) = 0.441176470588
g(5) = 0.361538461538
g(6) = 0.310810810811
g(7) = 0.276
g(8) = 0.250769230769
g(9) = 0.231707317073
g(10) = 0.216831683168
g(11) = 0.204918032787
g(12) = 0.195172413793
g(13) = 0.187058823529
g(14) = 0.180203045685
g(15) = 0.174336283186
g(16) = 0.169260700389
g(17) = 0.164827586207
g(18) = 0.160923076923
g(19) = 0.157458563536
g(20) = 0.154364089776

Pour gérer la vitesse d'aplatissement de la fonction tu peux jouer sur la puissance du x en dénominateur.

Code PHP :
<?php

define
('PUISSANCE_DE_X', 2);

function
f($x) { return ($x+1.8)/(pow($x,PUISSANCE_DE_X)+1) + 0.1; }

for (
$i=0; $i<=10; $i++) {
echo
"f($i) = " . f($i) . "\r\n";
}

?>

Voici les 10 premières valeurs pour PUISSANCE_DE_X = 3 :
Citation :g(0) = 1.9
g(1) = 1.5
g(2) = 0.522222222222
g(3) = 0.271428571429
g(4) = 0.189230769231
g(5) = 0.153968253968
g(6) = 0.135944700461
g(7) = 0.125581395349
g(8) = 0.11910331384
g(9) = 0.114794520548
g(10) = 0.111788211788

Et les 10 premières valeurs pour PUISSANCE_DE_X = 1.5 :
Citation :g(0) = 1.9
g(1) = 1.5
g(2) = 1.09257472486
g(3) = 0.874674293423
g(4) = 0.744444444444
g(5) = 0.658276703508
g(6) = 0.596912185871
g(7) = 0.550813686437
g(8) = 0.514772380783
g(9) = 0.485714285714
g(10) = 0.461710474374



RE: Calcul de points de degats - comode - 18-09-2006

Huhuhu, ça c'est de la réponse !
J'ai bien compris le principe que tu proposes et je te remercie de l'avoir ennoncé si clairement. Donc il me reste a trouver le moyen de tracer cette fonction (comme je regrette ma vieille TI92 :p) et voir ce qu'elle donne.
Ensuite, si les variations sont trop brutales, j'imagine que je pourrais toujours arrangé ça en appliquant un même coefs a DEF et ATK.
Oh, et juste pour la forme, si je ne m'abuse, on devrait écrire ta relation finales :
( 0.1 + ( ((DEF/ATK)+1.8)/((DEF²/ATK²)+1) ) ) * C

edit : je pinaille pour rien, j'ai pas fait de math depuis une éternité et j'oublieais que la div était prioritaire sur l'addition Wink


RE: Calcul de points de degats - comode - 18-09-2006

Arf, tu as éditer pendant que je répondais :p
Bon, tu confirmes donc mon inquiétude, la variation est en effet un peu brutale :p
et heu... tiens... d'ailleur... g(1) ne devrait-il pas etre egale à 1 d'après l'ennoncé ??? (et faudras que je teste avec des valeurs entre 0 et 1 aussi)


RE: Calcul de points de degats - naholyr - 18-09-2006

J'ai encore édité pendant ta réponse ^^
Avec PUISSANCE_DE_X = 1.1 tu as une évolution bien plus lente, mais en effet tu as soulevé le problème de la valeur pour x=1, on aura toujours g(x) = 1.5, ça fait donc une chute un peu brusque. À paufiner quoi Wink

Tiens, voici les courbes pour illustrer :
[Image: courbewg9.th.png]
La plus basse (bleu foncé) c'est PUISSANCE_DE_X = 2
Ensuite, dans l'ordre : 1.5, 1.2, 1.1

Mais ce n'est pas satisfaisant. Je pense que l'idéal est de travailler avec plusieurs fonctions, mais encore faut-il trouver lesquelles je te l'accorde ^^ mes compétences mathématiques ne me permettront pas de sortir quelque chose de plus complexe que la fonction à laquelle j'ai pensé de prime abord.


RE: Calcul de points de degats - naholyr - 18-09-2006

Ah ! une piste !
Si on introduit un coeff < 1 devant les deux X, on diminue de fait l'impact des variations de X sur les variations du résultat. En le donnant très petit, la fonction va varier très peu, en augmentant la puissance de X, on augmente la vitesse d'aplatissement. Résultat en jouant sur les deux paramètres on obtient des résultat plus ou moins satisfaisants.

En gros : plus le coefficient est petit, et plus tard la fonction chute, et plus la puissance est grande et plus fort la fonction chute.

Voici un exemple avec puissance = 3, et coeff = 0.001
Code PHP :
<?php

define
('PUISSANCE_DE_X', 3);
define('COEFF_DE_X', 0.001);

function
f($x) { return (COEFF_DE_X*$x+1.8)/(COEFF_DE_X*pow($x,PUISSANCE_DE_X)+1) + 0.1; }

for (
$i=0; $i<=50; $i++) {
echo
"f($i) = " . f($i) . "\r\n";
}

?>
Citation :f(0) = 1.9
f(1) = 1.8992007992
f(2) = 1.8876984127
f(3) = 1.85559883155
f(4) = 1.7954887218
f(5) = 1.70444444444
f(6) = 1.58519736842
f(7) = 1.44549516009
f(8) = 1.29576719577
f(9) = 1.14626951995
f(10) = 1.005
f(11) = 0.87691977692
f(12) = 0.7642228739
f(13) = 0.667094150766
f(14) = 0.584508547009
f(15) = 0.514857142857
f(16) = 0.456357927786
f(17) = 0.407289024184
f(18) = 0.366100702576
f(19) = 0.331454383509
f(20) = 0.302222222222
f(21) = 0.277468083033
f(22) = 0.256421703297
f(23) = 0.238452191084
f(24) = 0.223043712898
f(25) = 0.20977443609
f(26) = 0.198298880276
f(27) = 0.188333413915
f(28) = 0.179644475427
f(29) = 0.172039072039
f(30) = 0.165357142857
f(31) = 0.15946542821
f(32) = 0.15425254679
f(33) = 0.149625037226
f(34) = 0.145504168321
f(35) = 0.141823361823
f(36) = 0.138526103743
f(37) = 0.135564246026
f(38) = 0.132896620848
f(39) = 0.130487905967
f(40) = 0.128307692308
f(41) = 0.126329714964
f(42) = 0.124531216706
f(43) = 0.122892419293
f(44) = 0.1213960828
f(45) = 0.120027137042
f(46) = 0.118772372275
f(47) = 0.117620178778
f(48) = 0.116560326905
f(49) = 0.115583780731
f(50) = 0.114682539683

Pas mal non ?
De toute façon en gardant ce squelette de fonction on chutera toujours plus vite au début qu'à la fin (aplatissement), et bien vérifier la courbe avant d'appliquer des paramètres, il peut y avoir des surprises : exemple avec puissance=10 et coeff=0.0000001
Citation :f(0) = 1.9
f(1) = 1.89999992
f(2) = 1.89981589885
f(3) = 1.88943387193
f(4) = 1.7291695871
f(5) = 1.01067218972 oh la chute
f(6) = 0.355441788128 on ne l'arrête plus
f(7) = 0.161543693224 et entre f(4) et f(7) on est passé du palier haut au palier bas :roll:
f(8) = 0.116609129224
f(9) = 0.105147589023
f(10) = 0.101798202797



RE: Calcul de points de degats - comode - 18-09-2006

En effet... Je regarde pas tout de suite car j'ai une réunion qui m'attend, mais je me jette dessus dès mon retour.
A vu d'oeil, pour corriger le problème du g(1) = 1, il doit suffir d'appliquer la fonction présente pour chacun des cas (atk > def ou def > atk) en modifiant juste les bornes de la fonctions Wink
En tout cas, 1000 mercis pour le coup de main :p


RE: Calcul de points de degats - comode - 18-09-2006

Hi hi,
p'tet que ça serait plus simple en intégrant une fonction qui détermine les variations de degats en fonction du rapport atk/def
Bon, faut vraiment que je file, je me repenche la dessus a mon retour !
encore merci Wink


RE: Calcul de points de degats - comode - 19-09-2006

Code :
<?php
define('PUISSANCE_DE_X', 2);

function f($x)
{
        return ( $x + 1.8 ) / ( pow( $x, PUISSANCE_DE_X ) + 1 ) + 0.1 ;
}

for ($i=0; $i<=3; $i+=0.01) {
    echo 'f('.$i.') = ' . f($i) . '<br>';
}
?>

Apache a écrit :f(0) = 1.9
f(0.01) = 1.9098190180982
f(0.02) = 1.9192722910836
f(0.03) = 1.9283544809671
f(0.04) = 1.9370607028754
f(0.05) = 1.9453865336658
f(0.06) = 1.9533280191311
f(0.07) = 1.9608816797691
f(0.08) = 1.9680445151033
f(0.09) = 1.974814006547
f(0.1) = 1.9811881188119
f(0.11) = 1.9871652998716
f(0.12) = 1.9927444794953
f(0.13) = 1.9979250663782
f(0.14) = 2.0027069438996
f(0.15) = 2.0070904645477
etc...
f(0.96) = 1.536303080766
f(0.97) = 1.5271729609975
f(0.98) = 1.5180779432769
f(0.99) = 1.5090197464775
f(1) = 1.5
f(1.01) = 1.4910202465224
f(1.02) = 1.4820819447167
f(1.03) = 1.4731864719297
f(1.04) = 1.4643351268255

Donc pitit problème quand tu modifie la puissance de X sur l'intervale ]0-1[ ^^ (puissance négative -> diminution de x² et vu qu'il est diviseur et que le x divisé diminue moins vite, augmentation du resultat et franchissement de notre limite)

Mais t'inquiète, tu m'as déjà apporté tous les éléments de réponse nécessaire. Donc encore une fois, merci -> oo


RE: Calcul de points de degats - joshua - 19-09-2006

c'est des malaaaaaaaaaaaaaaaaaaaaaadesssssssssss ^^
Me faites pas ca au petit dej les gars :p
En tout cas chapeau Naholyr...