[GLua] "Var" or "var" or "var"

  • Initiateur de la discussion
Feytone

Feytone

Chuck Norris
Messages
4 741
Score réaction
1 301
Points
600
Cucu,

Voilà j'ai un petit script (assez vieux) qui joue sur une sorte de questionnaire :

Si on répond vrai ou faux, et que c'est la bonne réponse, on gagne de l'argent.
J'ai donc créé plusieurs fausses réponses et j'ai marqué en gros :

Code:
if viller != ("dfgljksqhfql" or "26857236" or "Los Angeles") then net.Start("foncsend2") net.WriteEntity(LocalPlayer()) net.SendToServer() else net.Start("foncsend3") net.WriteEntity(LocalPlayer()) net.SendToServer()
Tout fonctionne bien sauf dans la partie envoyé ci-dessus :
j'ai l'impression que le
Code:
"dfgljksqhfql" or "26857236" or "Los Angeles"
n'a pas l'air très apprécié par le lua. Comment donc marquer

ça or ça or ça sans que ça génère un problème (du coup la réponse est forcément invalide si une de ces réponses apparaît, qu'on mette faux ou vrai, c'est pareil).
Bref si vous voyez le problème, vous pouvez m'aider ?

A plouche.
 
While True

While True

Geek suprême
Messages
445
Score réaction
395
Points
190
Ce que tu veux faire c'est une comparaison de viller et chaque valeur dans tes parenthèses.
Soit tu fais ceci :
Code:
if var != "dgkjeb" or var != "12354" or var !="Los Angeles" then -- blabla
end
Il faudrait peut être revoir les principes de logique booléenne, la condition que t'as construite n'est pas très 'logique'/correcte.
En réfléchissant à la logique (voir les lois de De Morgan), tu pourras tomber sur une écriture plus ou moins simple.

Maintenant il y a la solution des tableaux, attention la fonction HasValue, l'équivalent d'une boucle for qui parcourt tout le tableau, n'est pas faite pour travailler avec de grandes tables ou quand la vitesse est un enjeu.
Typiquement, si tu ne vérifie qu'une seule fois de temps en temps, on ne criera pas. Voir https://wiki.garrysmod.com/page/table/HasValue
Code:
local reponses = { "dgked", "12345", "LosAngeles" }
if table.HasValue( reponses, var ) then -- blabla
end
 
  • Initiateur de la discussion
Feytone

Feytone

Chuck Norris
Messages
4 741
Score réaction
1 301
Points
600
Donc il faut que je vérifie séparément à chaque fois viller, car techniquement, est-il faux de marquer cela :

Code:
if viller != (« machin » or « truc ») then
?
Faut-il vérifier séparément ?

Je pense utiliser le tableau, qui sera beaucoup plus simple vu que j’ai plusieurs variables du type viller. Merci !
 
While True

While True

Geek suprême
Messages
445
Score réaction
395
Points
190
Traduis en français ce que tu veux, puis construit un pseudo code si nécessaire, mais partir de viller != ( <machin> ou <truc>) ne veut pas dire grand chose.
Jusqu'ici je ne sais pas vraiment ce que tu veux faire.
 
Taink

Taink

El Magnifico
Messages
5 292
Score réaction
2 720
Points
965
Bah logiquement ce que tu as écris c'est "if var != var1 or var2 or var 3", ce qui n'a pas de sens.
Ce qui va se passer c'est que ta première condition va bien fonctionner comme tu le souhaite mais les deux autres vont simplement respectivement vérifier que var2 est vraie et var3 est vraie (qu'elle sont valides, pas nil ou false dans le cas d'un bool).
Feytone à dit:
Donc il faut que je vérifie séparément à chaque fois viller, car techniquement, est-il faux de marquer cela :

Code:
if viller != (« machin » or « truc ») then
?
Faut-il vérifier séparément ?

Je pense utiliser le tableau, qui sera beaucoup plus simple vu que j’ai plusieurs variables du type viller. Merci !
Ça ne fonctionne pas comme en math, il n'y a pas distributivité des conditions. Le seul moyen de le faire correctement est de le faire séparément.

Les conditions c'est simple : chaque opérateur logique que tu écris (donc les '==', les '!=', les '>' et les '<=', par exemple) va renvoyer une valeur booléenne/binaire/logique (true ou false, 0 ou 1...) en fonction des opérations qu'on lui fait faire (l'égalité ou non de deux variables). 'or' et 'and' sont des portes logiques qui vont renvoyer une valeur similaire aux opérateurs logiques à ça près qu'elles vont vérifier entre chaque opération logique.
Code:
a = 1
b = 2
c = 3
-- 'and' ne renvoie true que si les deux entrées sont true
-- 'or' ne renvoie true que si au moins une seule de ses deux entrées est true
if a == b and c == a+b -- faux car 'a == b' est faux
if a < b or c == b -- vrai car une des valeurs est vraie (ici 'a < b')
-- tu peux donc remplacer les a == b etc par des variables bool dans ta tête, en espérant que ce soit plus clair :s
 
Dernière édition:
  • J'aime
Réactions: While True
While True

While True

Geek suprême
Messages
445
Score réaction
395
Points
190
Taink à dit:
Ça ne fonctionne pas comme en math, il n'y a pas distributivité des conditions. Le seul moyen de le faire correctement est de le faire séparément.
Faux ! :)
En algèbre booléenne, les propriétés de distributivité, d'associativité et de commutativité sont applicables sur tous les opérateurs logiques.
Comme je disais, il est vraiment utile de connaitre les implications du Théorème de De Morgan,
car cela permet de simplifier/transformer des propositions logiques de manière à plus facilement les comprendre et les implémenter.


not ( a or b ) équivaut à dire : not a and not b
not ( a and b) équivaut à dire : not a or not b
 
Taink

Taink

El Magnifico
Messages
5 292
Score réaction
2 720
Points
965
While True à dit:
Faux ! :)
En algèbre booléenne, les propriétés de distributivité, d'associativité et de commutativité sont applicables sur tous les opérateurs logiques.
Comme je disais, il est vraiment utile de connaitre les implications du Théorème de De Morgan, car cela permet de simplifier/transformer des propositions logiques de manière à plus facilement les comprendre et les implémenter.
Pour le coup je savais pas :s
Il me semblait que ça ne fonctionnait pas, mais si c'est le cas tant mieux ^^'
Le fonctionnement me paraît un peu bizarre du coup, mais si ça fonctionne comme ça ce sera l'occasion de le tester autre part p.p
 
  • Initiateur de la discussion
Feytone

Feytone

Chuck Norris
Messages
4 741
Score réaction
1 301
Points
600
While True à dit:
not ( a or b ) équivaut à dire : not a and not b
not ( a and b) équivaut à dire : not a or not b
Donc ta première proposition est celle mathématique et la deuxième serait la "traduction" lua ?
Bref, je vais tester tout ça ! Merci en tout cas.
 
Discord d'entraide
Rejoignz-nous sur Discord