Question : Le OU exclusif ?

Répondre
Partager Rechercher
J'y réfléchis, mais n'ayant pas le jeu ou l'éditeur sous la main, là de suite...

Est-ce que cette opération est valable dans NWScript ?
Code PHP:

// blabla bla
int bVariable1 GetUnTrucQuiRendTRUEOuFALSE(oTruc1);
int bVariable2 GetUnAutreTrucQuiRendTRUEOuFALSE(oTruc2);

if(
bVariable1 bVariable2 == TRUE)
{
    
// et blabla bla et bla bla
}
else
    
// blabla et bla. 
J'avoue ne jamais y avoir pensé jusqu'à aujourd'hui.

Pour ceux qui connaissent pas (ou bien pour les quiches), le OU exclusif dira... hmm... euh...

Ah voila : "C'est l'un ou l'autre mais pas les deux. Si c'est les deux, alors c'est aucun !"


Edit : bon j'ai aussi la solution suivante :
Code PHP:

if(bVariable1 == !bVariable2)
{
    
// et re-blabla bla 
mais c'est vrai que ça serait bien de savoir si ça marche ou pas.

Ah si jamais ça marche, peut-on aussi réduire à ça ?
Code PHP:

if(bVariable1 bVariable2
Edit edit : Je sais, j'ai aussi ça :
Code PHP:

if(bVariable1 != bVariable2
Edit edit edit : Je sais, le "ou exclusif" est plus compliqué que ce que je l'ai décrit, mais pensez aussi aux quiches qui nous lisent.
if(bVariable1 ^ bVariable2) // correct teste si l'un ou l'autre est vrai mais pas les deux.

Faux ^ Faux -> Faux
Vrai ^ Faux -> Vrai
Faux ^ Vrai -> Vrai
Vrai ^ Vrai -> Faux

C'est très pratique pour passer d'un état à l'autre.

Par exemple SetLocked(oDoor, (1^GetLocked(oDoor))) va verrouiller la porte si elle est déverrouillée et la déverrouiller si elle est verrouillée.
Disons que ça peut servir pour un truc (on va dire truc, hein) qui aurait un fonctionnement différent avec deux leviers différent. Si aucun levier n'est activé, ça ne marcherait pas (normal), et si les deux le sont, ça ne marcherait pas non plus :
Code PHP:

// Deux trucs qui vont rendre TRUE ou FALSE (1 ou 0)
int bLevier1 GetSiLeLevier1EstActivé(...);
int bLevier2 www.GetSiLeLevier2EstActivé.com(...);

if(
bLevier1 bLevier2)
{
    if(
bLevier1)
    {
        
// Il se passe un truc si le levier 1 est activé
    
}
    else
    {
        
// il se passe un autre truc si le levier 2 est activé
    
}

Enfin ça c'est l'utilisation la plus simple.

Après j'ai vu d'autres trucs plus complexes comme un système pour contrôler des quêtes, ou d'autres systèmes encore. De toutes façons, il faut réfléchir en binaire quand on veut utiliser un truc pareil.

Genre comme ça (si ça peut aider les quiches) :
Code:
0100 1101 ^ 1101 1001 = 1001 0100


Soit en vertical :

0 1 0 0   1 1 0 1
^ ^ ^ ^   ^ ^ ^ ^
1 1 0 1   1 0 0 1
= = = =   = = = =
1 0 0 1   0 1 0 0
L'intérêt du XOR c'est que si on l'applique 2 fois on revient à la case départ.

Principe utilisé notamment pour les sprites 2D de façon à restaurer le fond d'écran, ou pour le cryptage.

En effet :

0100 1101 ^ 1101 1001 = 1001 0100

mais

1001 0100 ^ 1101 1001 = 0100 1101 !!

Mais j'avoue ne pas voir une application immédiate utile pour NWN2... peut être deux quêtes exclusives l'une de l'autre ou un casse tête à base de leviers...
Je pense pas que le ou exclusif soit intégré au NWScript, d'ailleurs je l'ai jamais vu utilisé même en C ou C++ ou dans quelque langage que ce soit :P (je parle du ou exclusif global, pas bit à bit).


Citation :
L'intérêt du XOR c'est que si on l'applique 2 fois on revient à la case départ.
!(!a) = a


Le OU exclusif a une raison d'être dans l'algèbre de Boole, mais en programmation c'est un peu différent
Si si, le OU Exclusif (XOR) sert en programmation. Sans lui pas de jeux comme Baldur's Gate qui utilisait les sprites.

Un sprite est une image rectangulaire composé d'une vraie image et d'un masque d'affichage binaire avec 1 bit pour 1 pixel : 0 pas d'affichage (transparent), 1 affichage. En effet on n'affiche qu'une partie du rectangle, un bonhomme n'est pas rectangulaire.

Pour afficher le sprite sur un fond d'écran on fait l'opération binaire :

(Image AND Masque) XOR Fond

Le Sprite s'affiche alors sur le fond.

Pour faire disparaître le sprite et restituer le fond tel qu'il était, ben il suffit de refaire :

(Image AND Masque) XOR Fond

Et ça on ne peut pas le faire avec un simple NOT .

Le cryptage utilise souvent le XOR.

Mais bon au niveau NW Script pas beaucoup d'utilité...
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés