Bonjour,
Je suis en train de faire un jeu en prolog (le jeu s'apelle Fanorona) et je veux qu'un prédicat retourne NO quand ses clauses ne se vérifient pas.
Ce qui m'arrive c'est que le programme ne se termine pas.
Quelqu'un peut m'aider?
Merci.
Bonjour,
Je suis en train de faire un jeu en prolog (le jeu s'apelle Fanorona) et je veux qu'un prédicat retourne NO quand ses clauses ne se vérifient pas.
Ce qui m'arrive c'est que le programme ne se termine pas.
Quelqu'un peut m'aider?
Merci.
Il faudrait qu'il retourne 'fail' dans ce cas là, il ne le peut pas ?
Je ne peux pas parce-que 'fail' retournerait toujours 'no'.
Ce qui arrive c'est que mon jeu a plusieurs mouvements possibles (c'est un peu comme aux échecs) et le prédicat mouvement_valide doit retourner 'yes' si les 3 autres retournent 'yes' et 'no' si au moins l'un d'entre eux répond 'no'.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 mouvement_valide(J, (X,Y)-(Xf,Yf), Etat_actuel):- pos_valides(J,Etat_actuel, (X,Y)-(Xf,Yf)), verifie_liaison(J, (X,Y)-(Xf,Yf), Etat_actuel), chemin_libre((X,Y)-(Xf,Yf),Etat_actuel).
Je pense que il devrait le faire avec ce code.
voici la fonction qui apelle cette dernière, peut_être que le problème est lá.
Le prédicat 'demande _jouée' c'est juste pour lire le clavier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Trouve_jouée(J,humain,Mov,Etat_actuel):- write('Écrire une jouée'),nl, repeat, demande_jouée(X,Y), demande_jouée(Xf,Yf), Mov = (X,Y)-(Xf,Yf), mouvement_valide(J, Mov, Etat_actuel).
Salut
je crois que le problème vient du repeat qui boucle toujours.
Il faudrait utiliser autre chose.
Peut-être:
Ne connaissant pas trop le Prolog, je voudrais savoir si ta notation (X,Y)-(Xf,Yf) pourrait être transformée sans problème en [[X,Y], [Xf,Yf]] soit [PosDepart, PosArrivee] pour un pion ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Trouve_jouée(J,humain,Mov,Etat_actuel):- write('Écrire une jouée'),nl, demande_jouée(X,Y), demande_jouée(Xf,Yf), Mov = (X,Y)-(Xf,Yf), % Si le coup est n'est pas valide, on le recommence \+ mouvement_valide(J, Mov, Etat_actuel)->Trouve_jouée(J,humain,Mov,Etat_actuel).
Bonjour,
J'avais pas compris comment fonctionne le 'repeat'. 'repeat' ne termine pas tant que les clauses qui le suivent ne se vérifient pas. Alors, dans mon cas, tant que la jouée n'est pas valable il attend que le joueur mette une jouée valable pour continuer.
Ta solution est valable mais pour cela il faut que je modifie les fonctions qui lisent le clavier. Ce qu'elle a de bien c'est que chaque fois que la jouée n'est pas valable elle écrit "Introduire une jouée" et avec la solution que j'avais il faut que le joueur "devine" qu'il doit introduire une autre jouée.
Merci pour ton aide.
Maintenant ta question. Tu peux facilement faire ce que tu dis. L'avantage de la notation (X,Y)-(Xf,Yf) c'est que tu peut faire réference à la coordonnée que tu veux sans avoir a parcourir une liste.
Pour passer à la notation [[X,Y], [Xf,Yf]] tu peux simplement faire:
Pour finir, je ne comprend pas très bien ce que fait '\+' dans ton code. Je sais que c'est une sorte de négation, mais quel type? Pourquoi tu l'utilises?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 test((X,Y)-(Xf,Yf)):- append([X], [Y], Depart), append([Xf],[Yf], Arrivee), append([Depart], [Arrivee], Jouee).
Et bien si mouvement_valide(J, Mov, Etat_actuel) renvoie no, \+mouvement(..) renvoie yes, donc la clause qui suit le -> est exécutée, celà simule un tant que.
Je te renvoie ici
Si je ne me trompe pas (je n'ai pas Prolog sous la main), on doit pouvoir aussi faire directement.
Ma question était due au fait que j'ai cru un moment que le - était un opérateur que je ne connaissais pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 test((X,Y)-(Xf,Yf)):- append([[X],[Y]], [[Xf],[Yf]], Jouee).
Je vois. Le '\+' fait la même chose que un 'not'.
J'ai essayé ton code et j'ai reçu:
Donc on peut le fair e directement mais pour obtenir ce que tu veux il faut faire:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 test((1,2)-(3,4)). [[1], [2], [3], [4]]
et le résultat:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 test((X,Y)-(Xf,Yf)):- append([[X,Y]], [[Xf,Yf]], Jouee),write(Jouee).
Merci.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 test((1,2)-(3,4)). [[1, 2], [3, 4]]
Et voilá le résultat
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 test((1,2)-(3,4)). [[[1], [2]], [[3], [4]]]
Je me suis un peu embrouillé dans mes posts pour append (je croyais avoir modifié le post)
Le premier était le bon.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager