Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- :- set_prolog_flag(toplevel_print_options, [max_depth(0)]).
- :- use_module(library(lists)).
- % Définition des prédicats de direction :
- % direction(n Nord, ne Nord-Est, se Sud-Est, s Sud, so Sud-Ouest, no Nord-Est).
- % _n
- % no / \ ne
- % so \__/ se
- % s
- direction(n).
- direction(ne).
- direction(se).
- direction(s).
- direction(so).
- direction(no).
- % Définition des insectes blancs :
- % insecte([abeille,numero,couleur],identifiant).
- insecte([abeille,1,blanc],ab1b).
- insecte([scarabe,1,blanc],sc1b).
- insecte([scarabe,2,blanc],sc2b).
- insecte([araignee,1,blanc],ar1b).
- insecte([araignee,2,blanc],ar2b).
- insecte([fourmis,1,blanc],fo1b).
- insecte([fourmis,2,blanc],fo2b).
- insecte([fourmis,3,blanc],fo3b).
- insecte([sauterelle,1,blanc],sa1b).
- insecte([sauterelle,2,blanc],sa2b).
- insecte([sauterelle,3,blanc],sa3b).
- % Définitions des insectes noires :
- insecte([abeille,1,noir],ab1n).
- insecte([scarabe,1,noir],sc1n).
- insecte([scarabe,2,noir],sc2n).
- insecte([araignee,1,noir],ar1n).
- insecte([araignee,2,noir],ar2n).
- insecte([fourmis,1,noir],fo1n).
- insecte([fourmis,2,noir],fo2n).
- insecte([fourmis,3,noir],fo3n).
- insecte([sauterelle,1,noir],sa1n).
- insecte([sauterelle,2,noir],sa2n).
- insecte([sauterelle,3,noir],sa3n).
- % Permet de connaitre le type d'un insecte
- % à partir d'un identifiant court
- type_insecte(Y,X):-
- insecte([Y,_,_],X).
- % Permet de récupérer le numéro d'identifiant
- % d'un insecte
- id_insecte(Y,X):-
- insecte([_,Y,_],X).
- % Permet de connaître la couleur d'un insecte
- % à partir d'un identifiant court
- couleur_insecte(Y,X):-
- insecte([_,_,Y],X).
- % Stratégie manuelle pour le placement de la première pièce
- % Après de nombreux essais, l'araigné semble le meilleur choix
- premier_insecte(blanc,ar1b).
- premier_insecte(noir,ar1n).
- % Permet d'obtenir la couleur opposée
- % à celle présente dans le prédicat
- couleur_opposee(blanc, noir).
- couleur_opposee(noir, blanc).
- % Permet de jouer une première pièce suivant la couleur donnée
- % par l'arbitre. Plateau avec taille 0.
- % Question : rechercher_coup(blanc,[],[],[pose, PieceJouee, [sc1n, Direction]]).
- rechercher_coup(Couleur,[],[],[pose, PieceJouee, [PieceDeReference, Direction]]):-
- premier_insecte(Couleur,PieceJouee),
- insecte(_,PieceDeReference),
- direction(Direction).
- % Permet de jouer une première pièce suivant la couleur donnée
- % par l'arbitre. Plateau avec taille 1.
- rechercher_coup(Couleur, [[PieceDeReference,_]], [], [pose, PieceJouee, [PieceDeReference, Direction]]):-
- % length(Plateau, 1),
- premier_insecte(Couleur, PieceJouee),
- direction(Direction).
- % exemple de plateau : [[ar1b,[0,0]], [ar1n,[-1,-1]], [sc1b,[1,1]]]
- % Donne les pièces qui ne sont pas présentes sur le plateau de jeu
- pieceNonJouee(Plateau, Couleur, Piece):-
- couleur_insecte(Couleur, Piece),
- \+ pieceSurPlateau(Piece, Plateau).
- % Donne les pièces qui sont présentes sur le plateau de jeu
- pieceJouee(Plateau, Couleur, Piece):-
- couleur_insecte(Couleur, Piece),
- pieceSurPlateau(Piece,Plateau).
- % Recherche si une pièce est présente sur le plateau
- pieceSurPlateau(Piece,[[Piece,_]|_]).
- pieceSurPlateau(Piece,[_|ResteListe]):-pieceSurPlateau(Piece,ResteListe).
- % Permet pour une coordonnée indiquée de savoir si la case est occupée
- caseOccupee(Coordos, [[_,Coordos]|_]).
- caseOccupee(Coordos, [_|ResteListe]):-caseOccupee(Coordos,ResteListe).
- % Permet pour une coordonnée indiquée de savoir si la case est libre
- caseLibre(Coordos, Plateau):-
- \+caseOccupee(Coordos, Plateau).
- % calcule les coordonnées voisines par rapport à un point X Y donné
- % en fonction de la direction
- coordonneesVoisines([X1,Y1],n,[X2,Y2]) :- X2 is X1, Y2 is Y1 + 2.
- coordonneesVoisines([X1,Y1],ne,[X2,Y2]):- X2 is X1 + 1, Y2 is Y1 + 1.
- coordonneesVoisines([X1,Y1],se,[X2,Y2]):- X2 is X1 + 1, Y2 is Y1 - 1.
- coordonneesVoisines([X1,Y1],s,[X2,Y2]) :- X2 is X1 , Y2 is Y1 - 2.
- coordonneesVoisines([X1,Y1],so,[X2,Y2]):- X2 is X1 - 1, Y2 is Y1 - 1.
- coordonneesVoisines([X1,Y1],no,[X2,Y2]):- X2 is X1 - 1, Y2 is Y1 + 1.
- % Calcul de la valeur absolue d'un nombre
- abs(A, B):-
- A < 0, % Si A est un nombre négatif
- B is -A,!. % Cut car il ne faut pas passer
- % dans le 2eme prédicat abs
- abs(A, B):-
- B is A. % Si A est un nombre positif
- % Calcul de la distance entre deux pièces
- distance([X1,Y1],[X2,Y2],R):-
- DX is X2 - X1,
- DY is Y2 - Y1,
- abs(DX,DXabs),
- abs(DY,DYabs),
- R is (DXabs + DYabs)//2. % / Division // Division entière
- % positionPiece permet de connaitre suivant les coordonnées indiquées
- % la pièce qui est présente
- % Question : positionPiece([-1,-1],[[ar1b,[0,0]], [ar1n,[-1,-1]], [sc1b,[1,1]]],Piece).
- positionPiece(Coordos, [[Piece, Coordos]|_], Piece).
- positionPiece(Coordos, [_|ResteListe], Piece) :- positionPiece(Coordos, ResteListe, Piece).
- % Permet de connaître la piece voisine d'une pièce par rapport
- % à une pièce dont on a indiqué les coordonnées et la direction
- % Question : pieceVoisine([0,0],so,[[ar1b,[0,0]], [ar1n,[-1,-1]], [sc1b,[1,1]]],Piece).
- pieceVoisine(Coordos1, Direction, Plateau, Piece):-
- coordonneesVoisines(Coordos1,Direction,Coordos2),
- positionPiece(Coordos2, Plateau, Piece).
- % Permet de savoir si la pièce donnée se trouve en dessous d'une autre pièce
- % Question : piecePrisonniere(ar1n, [[sc1b, ar1n ],[sc1n, ar1b]]).
- piecePrisonniere(Piece, [[_,Piece]|_]).
- piecePrisonniere(Piece,[_|ResteListe]):- piecePrisonniere(Piece,ResteListe).
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % Pose d'une pièce
- % (Couleur, [[PieceDeReference,_]], [pose, PieceJouee, [PieceDeReference, Direction]])
- % posePiece(blanc, [[ar1b,[0,0]], [ar1n,[0,2]], [sc1n,[1,1]]], [ar1n,sc1n], X).
- posePiece(Couleur, Plateau, ListeScarabe, [pose, PieceJouee, Coordonnees]):-
- pieceNonJouee(Plateau, Couleur, PieceJouee),
- choixCoordosPose(Couleur, Plateau, ListeScarabe, Coordonnees).
- % Choix des coordonnées de pose d'une pièce
- choixCoordosPose(Couleur, Plateau, ListeScarabe, Coordonnees):-
- pieceJouee(Plateau, Couleur, Piece), % Coordonnees autour d'une piece amie
- \+piecePrisonniere(Piece, ListeScarabe),
- positionPiece(CoordosPiece, Plateau, Piece),
- direction(D),
- coordonneesVoisines(CoordosPiece, D, Coordonnees),
- caseLibre(Coordonnees, Plateau), % La coordonnees doit être libre
- % Vérifier que l'on est pas à côté d'un ennemi
- couleur_opposee(Couleur, CouleurE),
- % ... sur chaque coté
- coordonneesVoisines(Coordonnees, n, Cn),
- \+piecePresente(CouleurE, Plateau, ListeScarabe, Cn),
- coordonneesVoisines(Coordonnees, ne, Cne),
- \+piecePresente(CouleurE, Plateau, ListeScarabe, Cne),
- coordonneesVoisines(Coordonnees, se, Cse),
- \+piecePresente(CouleurE, Plateau, ListeScarabe, Cse),
- coordonneesVoisines(Coordonnees, s, Cs),
- \+piecePresente(CouleurE, Plateau, ListeScarabe, Cs),
- coordonneesVoisines(Coordonnees, so, Cso),
- \+piecePresente(CouleurE, Plateau, ListeScarabe, Cso),
- coordonneesVoisines(Coordonnees, no, Cno),
- \+piecePresente(CouleurE, Plateau, ListeScarabe, Cno).
- % Permet de connaître pour une coordonnée, si une piece est présente
- % avec la couleur désirée
- piecePresente(Couleur, Plateau, ListeScarabe, Coordonnees):-
- positionPiece(Coordonnees, Plateau, Piece),
- \+piecePrisonniere(Piece, ListeScarabe), % On vérifie qu'il n'y a pas de pièce sous une autre
- couleur_insecte(Couleur, Piece).
- % Deplacer une pièce
- deplacePiece(Couleur, Plateau, ListeScarabe, [deplace, PieceJouee, Coordonnees]):-
- pieceSurPlateau(Piece,Plateau),
- \+piecePrisonniere(Piece, ListeScarabe).
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % verifierIntegriter permet de vérifier qu'une pièce
- % n'est pas isolée sur le plateau de jeu
- %verifierIntegrite([Piece|ResteListe]):-
- % pieceVoisine.
- % voisin permet de connaitre le voisin d'une pièce s'il existe
- % en fonction d'une direction, voisin = [piece,[X,Y]]
- voisin([_,Coordos1], Direction, Plateau,[Piece,Coordos2]):-
- coordonneesVoisines(Coordos1,Direction,Coordos2),
- positionPiece(Coordos2, Plateau, Piece).
- % voisin permet de connaitre le voisin d'une pièce s'il existe
- % en fonction d'un choix libre de direction, voisin = [piece,[X,Y]]
- voisin(P1, Plateau,P2):-
- direction(D),
- voisin(P1, D, Plateau, P2).
- % voisins récursif, permet de connaitre les 6 voisins d'une pièce
- % le tout stocké dans une Liste
- voisins(P1, Plateau, Liste):-
- findall(P2, voisin(P1, Plateau, P2), Liste).
- %
- voisinR(Plateau, Acc, [Piece|ResteListe]):-
- \+member(Acc, Piece),
- append(Acc, [Piece], Acc2),
- voisins(Piece, Plateau, voisins),
- append(ResteListe, voisins, ResteListe2),
- voisinR(ResteListe, Plateau, Acc2).
- %
- voisinR([], Plateau, Acc):-
- length(Plateau, LP
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement