Menu

Connexion



Retenir ?

Mot de passe oublié ?
Eclipso logo
Merry Christmas !
24/10/2019 07:22:08

2k3 < VX < Ace < XP

[résolu] [script] aide à la compréhension d'une fonction (une ligne)

Arkain

Amateur
Arkain
  • Messages : 69

[résolu] [script] aide à la compréhension d'une fonction (une ligne)


dim. 19 oct. 2014 - 16h02

BONJOUR AUX SCRIPTEURS, les autres, au revoir. (enfin vous pouvez hein rester mais sans réel but je pense)

Voici une fonction :


alors étant donné son nom, je suppose qu'il y a un rapport avec le "milieu" mais afin que ce soit plus clair dans ma tête, je demande :
Que fait-elle ?

et aussi quelle est l'utilité du "?" tout seul comme dans cette fonction


lol

Cantarelle

Adepte
Cantarelle
  • Messages : 298

[résolu] [script] aide à la compréhension d'une fonction (une ligne)


dim. 19 oct. 2014 - 16h49

alors étant donné son nom, je suppose qu'il y a un rapport avec le "milieu" mais afin que ce soit plus clair dans ma tête, je demande :
Que fait-elle ?




Donc, pour plus de compréhension, on va y aller point par point (désolée, je suis en train de faire ça pour mon truc à rendre en caml... Donc, autant continuer)...
Surtout que j'ai l'impression que c'est codé comme du fonctionnel...

Cette fonction middle prend trois paramètres : min_x, x et max_x

x > min_x?

est assez simple à comprendre. Le ? te permet de savoir que min_x? est une fonction qui renvoie un booleen. C'est une convention d'écriture qui te permet, en un seul coup d'oeil, de savoir que c'est une fonction qui renvoie un booleen (attention : ce n'est pas dans tous les langages qui acceptent cette convention. Par exemple, en C, ça ne marchera pas).
Normalement, tu as une fonction qui te fait ça. Ctrl+F pour chercher
Dans ce cas-là, il compare si x est supérieur au min_x...

x < max_x?

Pareil, mais pour max_x?
Dans ce cas-là, il compare si x est inférieur au max_x...


x:man_x:min_x

Je n'ai presque jamais vu cette écriture, vu que ce n'est utilisé qu'en fonctionnel (je débute en fonctionnel. Perso, je préfère l'objet).
Sans compter que c'est une horreur pour y lire et y décoder...
Bref, de ce que je comprends, ainsi que mon ami google, il fait une comparaison booleenne (par contre, laquelle... Je pense que c'est le ET) et il renvera cette comparaison (true ou false).
Après, un tel résultat, il faut apprendre les tables de vérité

Attention, sur la troisième, c'est à prendre avec précaution, vu que ce ne sont que des suppositions.


Mais, en gros, cette fonction détermine si ton x est bien dans un certain intervalle défini entre min_x et max_x.


Pourrais-je savoir où tu as péché un tel code ? Parce que ça me fait penser à EE...

Arkain

Amateur
Arkain
  • Messages : 69

[résolu] [script] aide à la compréhension d'une fonction (une ligne)


dim. 19 oct. 2014 - 18h01

Donc, (parce que je suis pas sûr de comprendre) en gros,

x > min_x ? x < max_x ?


ça équivaut à dire

si x est compris entre min_X et max_x


ou j'ai pas compris ?



ensuite pour le
x : x_max : x_min
si j'ai bien compris ce que tu dis, je t'avoue que je ne suis pas tout à fait convaincu d'une telle utilité.

Je tire ce code du jeu Touhou Wandering Souls de Estheone. Parce que j'ai kiffé son jeu, j'essaie de comprendre son code. Du coup je tombe sur cette partie de code :

(on se trouve dans la classe Game_Weapon, et la fonction créée ici est celle utilisée pour faire gagner de l'expérience à une arme.
@id est l'ID de l'arme
@ap est l'expérience actuelle de l'arme
@ap_list[] est la table d'expérience de l'arme en fonction de son niveau
@level est le niveau de l'arme)

Spoiler


def gain_ap(ap)
return if @id == 0
@ap = Math.middle(0, @ap+ap, 9999999)
while @ap >= @ap_list[@level+1] and @ap_list[@level+1] > 0
level_up
end
end

du coup je trouve assez clair sauf ce truc avec la fonction middle, je comprends pas bien ce qu'elle lui fait au final à ce @ap, et je vois pas trop ce qu'une comparaison booléenne viendrait faire ici


Dans les script du jeu, il y a un module Math ou sont rangées les fonctions que voici (dont celle que j'ai parlé) :

Spoiler


module Math

module_function

def min(x, max_x)
x < max_x ? x : max_x
end

def max(x, min_x)
x > min_x ? x : min_x
end

def middle(min_x, x, max_x)
x > min_x ? x < max_x ? x : max_x : min_x
end

def ang_val(rad_val)
return (rad_val*180/PI)
end

def rad_val(ang_val)
return (ang_val*PI/180)
end
end



EDIT : et euh au fait euh merci de m'avoir répondu si vite !

EDIT2 : Après réflexion, je pense qu'il serait possible que la fonction fasse en sorte que si x < x_min alors x = x_min ou si x > x_max alors x = x_max

mais j'aimerais quand même la confirmation de quelqu'un de plus compétent que moi sur le sujet


lol

Joke

Amateur
Joke
  • Messages : 77

[résolu] [script] aide à la compréhension d'une fonction (une ligne)


dim. 26 oct. 2014 - 22h39

Bonjour

Cantarelle s'est malheureusement faite avoir par le "?" et sa connaissance des autres langages...

En fait c'est tout simple, la ligne en question :

x > min_x ? x < max_x ? x : max_x : min_x


Reprend deux fois la forme d'une condition raccourcie type "Condition ? SiOui : Sinon"

C'est à dire qu'au lieu de la forme qu'on connaît tous :

if Condition
QuelqueChoseSiOui
else
AutreChoseSinon
end


On peut écrire :

Condition ? QuelqueChoseSiOui : AutreChoseSinon


En l’occurrence, on a deux fois ce type de condition, l'une dans l'autre :

Condition1 ? Condition2 ? QuelqueChoseSiOui : AutreChoseSinon : AutreChoseSinon

x > min_x ? x < max_x ? x : max_x : min_x


Donc si on traduit la ligne mystère avec la forme de condition qu'on rencontre plus fréquemment, on a :

if x > min_x
if x < max_x
x
else
max_x
end
else
min_x
end


Ce qui fait que :
- ça renvoi X si X est entre MIN et MAX
- ça renvoi MIN si X est inférieur à MIN
- ça renvoi MAX si X est supérieur à MAX

La fonction s'appelle "middle" car si on prend trois valeurs a, b, c au hasard, et qu'on fait "Math.middle(a, b, c)", c'est supposé renvoyer dans tous les cas la valeur parmi les trois qui se situe entre les deux autres. (LA VALEUR AU MILIEU)

En fait, ce n'est pas la véritable fonction "middle", car ici la fonction impose d'avoir "a < c" (min_x < max_x, c'est logique) pour se comporter comme une fonction "middle". (Par exemple, Math.middle(3,2,1) renverra 3, qui n'est PAS le milieu). MAIS ON S'EN FOUT dès lors qu'on retient que les arguments sont MIN_X, X et MAX_X.

Dans ton script, la fonction est utilisée pour garder le nouvel AP entre 0 et 9999999. ^^ Je suppose que c'est comme ça pour la plupart des stats.

La fonction peut être utile par exemple dans le cas d'un choix, pour que le curseur s'arrête bien en haut de la liste et s'arrête bien en bas de la liste au lieu de continuer de se déplacer vers le haut ou vers le bas.


Pour ma part, au lieu de faire "Math.middle(MIN, X, MAX)", je faisais "[[X, MIN].max, MAX].min" qui revient au même... mais je vais retenir cette fonction, maintenant.


Arkain

Amateur
Arkain
  • Messages : 69

[résolu] [script] aide à la compréhension d'une fonction (une ligne)


lun. 27 oct. 2014 - 15h05

Quel charisme dans cette réponse !!

Merci à toi, BLAGUE !
Tout est dorénavant clair et logique.
(et j'suis content car c'est finalement bien ce que j'avais fini par comprendre tout seul*-*)


lol