SHARE
TWEET

Untitled

a guest May 19th, 2017 43 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. :- set_prolog_flag(toplevel_print_options, [max_depth(0)]).
  2. :- use_module(library(lists)).
  3.  
  4. % Définition des prédicats de direction :
  5. % direction(n Nord, ne Nord-Est, se Sud-Est, s Sud, so Sud-Ouest, no Nord-Est).
  6. %     _n
  7. % no /  \ ne
  8. % so \__/ se
  9. %     s
  10. direction(n).
  11. direction(ne).
  12. direction(se).
  13. direction(s).
  14. direction(so).
  15. direction(no).
  16.  
  17. % Définition des insectes blancs :
  18. % insecte([abeille,numero,couleur],identifiant).
  19. insecte([abeille,1,blanc],ab1b).
  20. insecte([scarabe,1,blanc],sc1b).
  21. insecte([scarabe,2,blanc],sc2b).
  22. insecte([araignee,1,blanc],ar1b).
  23. insecte([araignee,2,blanc],ar2b).
  24. insecte([fourmis,1,blanc],fo1b).
  25. insecte([fourmis,2,blanc],fo2b).
  26. insecte([fourmis,3,blanc],fo3b).
  27. insecte([sauterelle,1,blanc],sa1b).
  28. insecte([sauterelle,2,blanc],sa2b).
  29. insecte([sauterelle,3,blanc],sa3b).
  30.  
  31. % Définitions des insectes noires :
  32. insecte([abeille,1,noir],ab1n).
  33. insecte([scarabe,1,noir],sc1n).
  34. insecte([scarabe,2,noir],sc2n).
  35. insecte([araignee,1,noir],ar1n).
  36. insecte([araignee,2,noir],ar2n).
  37. insecte([fourmis,1,noir],fo1n).
  38. insecte([fourmis,2,noir],fo2n).
  39. insecte([fourmis,3,noir],fo3n).
  40. insecte([sauterelle,1,noir],sa1n).
  41. insecte([sauterelle,2,noir],sa2n).
  42. insecte([sauterelle,3,noir],sa3n).
  43.  
  44. % Permet de connaitre le type d'un insecte
  45. % à partir d'un identifiant court
  46. type_insecte(Y,X):-
  47.     insecte([Y,_,_],X).
  48.  
  49. % Permet de récupérer le numéro d'identifiant
  50. % d'un insecte
  51. id_insecte(Y,X):-
  52.     insecte([_,Y,_],X).
  53.  
  54. % Permet de connaître la couleur d'un insecte
  55. % à partir d'un identifiant court
  56. couleur_insecte(Y,X):-
  57.     insecte([_,_,Y],X).
  58.  
  59. % Stratégie manuelle pour le placement de la première pièce
  60. % Après de nombreux essais, l'araigné semble le meilleur choix
  61. premier_insecte(blanc,ar1b).
  62. premier_insecte(noir,ar1n).
  63.  
  64. % Permet d'obtenir la couleur opposée
  65. % à celle présente dans le prédicat
  66. couleur_opposee(blanc, noir).
  67. couleur_opposee(noir, blanc).
  68.  
  69. % Permet de jouer une première pièce suivant la couleur donnée
  70. % par l'arbitre. Plateau avec taille 0.
  71. % Question : rechercher_coup(blanc,[],[],[pose, PieceJouee, [sc1n, Direction]]).
  72. rechercher_coup(Couleur,[],[],[pose, PieceJouee, [PieceDeReference, Direction]]):-
  73.     premier_insecte(Couleur,PieceJouee),
  74.     insecte(_,PieceDeReference),
  75.     direction(Direction).
  76.  
  77. % Permet de jouer une première pièce suivant la couleur donnée
  78. % par l'arbitre. Plateau avec taille 1.
  79. rechercher_coup(Couleur, [[PieceDeReference,_]], [], [pose, PieceJouee, [PieceDeReference, Direction]]):-
  80.     % length(Plateau, 1),
  81.     premier_insecte(Couleur, PieceJouee),
  82.     direction(Direction).
  83.  
  84. % exemple de plateau : [[ar1b,[0,0]], [ar1n,[-1,-1]], [sc1b,[1,1]]]
  85. % Donne les pièces qui ne sont pas présentes sur le plateau de jeu
  86. pieceNonJouee(Plateau, Couleur, Piece):-
  87.     couleur_insecte(Couleur, Piece),
  88.     \+ pieceSurPlateau(Piece, Plateau).
  89.    
  90. % Donne les pièces qui sont présentes sur le plateau de jeu
  91. pieceJouee(Plateau, Couleur, Piece):-
  92.     couleur_insecte(Couleur, Piece),
  93.     pieceSurPlateau(Piece,Plateau).
  94.  
  95. % Recherche si une pièce est présente sur le plateau
  96. pieceSurPlateau(Piece,[[Piece,_]|_]).
  97. pieceSurPlateau(Piece,[_|ResteListe]):-pieceSurPlateau(Piece,ResteListe).
  98.  
  99. % Permet pour une coordonnée indiquée de savoir si la case est occupée
  100. caseOccupee(Coordos, [[_,Coordos]|_]).
  101. caseOccupee(Coordos, [_|ResteListe]):-caseOccupee(Coordos,ResteListe).
  102.    
  103. % Permet pour une coordonnée indiquée de savoir si la case est libre
  104. caseLibre(Coordos, Plateau):-
  105.     \+caseOccupee(Coordos, Plateau).
  106.  
  107. % calcule les coordonnées voisines par rapport à un point X Y donné
  108. % en fonction de la direction
  109. coordonneesVoisines([X1,Y1],n,[X2,Y2]) :- X2 is X1,     Y2 is Y1 + 2.
  110. coordonneesVoisines([X1,Y1],ne,[X2,Y2]):- X2 is X1 + 1, Y2 is Y1 + 1.
  111. coordonneesVoisines([X1,Y1],se,[X2,Y2]):- X2 is X1 + 1, Y2 is Y1 - 1.
  112. coordonneesVoisines([X1,Y1],s,[X2,Y2]) :- X2 is X1    , Y2 is Y1 - 2.
  113. coordonneesVoisines([X1,Y1],so,[X2,Y2]):- X2 is X1 - 1, Y2 is Y1 - 1.
  114. coordonneesVoisines([X1,Y1],no,[X2,Y2]):- X2 is X1 - 1, Y2 is Y1 + 1.
  115.  
  116. % Calcul de la valeur absolue d'un nombre
  117. abs(A, B):-
  118.     A < 0,          % Si A est un nombre négatif
  119.     B is -A,!.              % Cut car il ne faut pas passer
  120.                                 % dans le 2eme prédicat abs
  121. abs(A, B):-
  122.     B is A.                 % Si A est un nombre positif
  123.  
  124. % Calcul de la distance entre deux pièces
  125. distance([X1,Y1],[X2,Y2],R):-
  126.     DX is X2 - X1,
  127.     DY is Y2 - Y1,
  128.     abs(DX,DXabs),
  129.     abs(DY,DYabs),
  130.     R is (DXabs + DYabs)//2. % / Division // Division entière
  131.  
  132. % positionPiece permet de connaitre suivant les coordonnées indiquées
  133. % la pièce qui est présente
  134. % Question : positionPiece([-1,-1],[[ar1b,[0,0]], [ar1n,[-1,-1]], [sc1b,[1,1]]],Piece).
  135. positionPiece(Coordos, [[Piece, Coordos]|_], Piece).
  136. positionPiece(Coordos, [_|ResteListe], Piece) :- positionPiece(Coordos, ResteListe, Piece).
  137.  
  138.  
  139. % Permet de connaître la piece voisine d'une pièce par rapport
  140. % à une pièce dont on a indiqué les coordonnées et la direction
  141. % Question : pieceVoisine([0,0],so,[[ar1b,[0,0]], [ar1n,[-1,-1]], [sc1b,[1,1]]],Piece).
  142. pieceVoisine(Coordos1, Direction, Plateau, Piece):-
  143.     coordonneesVoisines(Coordos1,Direction,Coordos2),
  144.     positionPiece(Coordos2, Plateau, Piece).
  145.  
  146.  
  147. % Permet de savoir si la pièce donnée se trouve en dessous d'une autre pièce
  148. % Question : piecePrisonniere(ar1n, [[sc1b, ar1n ],[sc1n, ar1b]]).
  149. piecePrisonniere(Piece, [[_,Piece]|_]).
  150. piecePrisonniere(Piece,[_|ResteListe]):- piecePrisonniere(Piece,ResteListe).
  151.  
  152. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  153. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  154. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  155.  
  156. % Pose d'une pièce
  157. % (Couleur, [[PieceDeReference,_]], [pose, PieceJouee, [PieceDeReference, Direction]])
  158. % posePiece(blanc, [[ar1b,[0,0]], [ar1n,[0,2]], [sc1n,[1,1]]], [ar1n,sc1n], X).
  159. posePiece(Couleur, Plateau, ListeScarabe, [pose, PieceJouee, Coordonnees]):-
  160.     pieceNonJouee(Plateau, Couleur, PieceJouee),
  161.     choixCoordosPose(Couleur, Plateau, ListeScarabe, Coordonnees).
  162.  
  163. % Choix des coordonnées de pose d'une pièce
  164. choixCoordosPose(Couleur, Plateau, ListeScarabe, Coordonnees):-
  165.     pieceJouee(Plateau, Couleur, Piece),        % Coordonnees autour d'une piece amie
  166.     \+piecePrisonniere(Piece, ListeScarabe),
  167.     positionPiece(CoordosPiece, Plateau, Piece),
  168.     direction(D),
  169.     coordonneesVoisines(CoordosPiece, D, Coordonnees),
  170.  
  171.     caseLibre(Coordonnees, Plateau),                % La coordonnees doit être libre
  172.    
  173.     % Vérifier que l'on est pas à côté d'un ennemi
  174.     couleur_opposee(Couleur, CouleurE),
  175.     % ... sur chaque coté
  176.     coordonneesVoisines(Coordonnees, n, Cn),
  177.     \+piecePresente(CouleurE, Plateau, ListeScarabe, Cn),
  178.     coordonneesVoisines(Coordonnees, ne, Cne),
  179.     \+piecePresente(CouleurE, Plateau, ListeScarabe, Cne),
  180.     coordonneesVoisines(Coordonnees, se, Cse),
  181.     \+piecePresente(CouleurE, Plateau, ListeScarabe, Cse),
  182.     coordonneesVoisines(Coordonnees, s, Cs),
  183.     \+piecePresente(CouleurE, Plateau, ListeScarabe, Cs),
  184.     coordonneesVoisines(Coordonnees, so, Cso),
  185.     \+piecePresente(CouleurE, Plateau, ListeScarabe, Cso),
  186.     coordonneesVoisines(Coordonnees, no, Cno),
  187.     \+piecePresente(CouleurE, Plateau, ListeScarabe, Cno).
  188.    
  189. % Permet de connaître pour une coordonnée, si une piece est présente
  190. % avec la couleur désirée
  191. piecePresente(Couleur, Plateau, ListeScarabe, Coordonnees):-
  192.     positionPiece(Coordonnees, Plateau, Piece),
  193.     \+piecePrisonniere(Piece, ListeScarabe),      % On vérifie qu'il n'y a pas de pièce sous une autre   
  194.     couleur_insecte(Couleur, Piece).
  195.  
  196.  
  197.  
  198.  
  199.  
  200. % Deplacer une pièce
  201. deplacePiece(Couleur, Plateau, ListeScarabe, [deplace, PieceJouee, Coordonnees]):-
  202.     pieceSurPlateau(Piece,Plateau),
  203.     \+piecePrisonniere(Piece, ListeScarabe).
  204.  
  205.  
  206.  
  207. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  208. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  209. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  210.  
  211. % verifierIntegriter permet de vérifier qu'une pièce
  212. % n'est pas isolée sur le plateau de jeu
  213. %verifierIntegrite([Piece|ResteListe]):-
  214. %   pieceVoisine.
  215.  
  216.  
  217. % voisin permet de connaitre le voisin d'une pièce s'il existe
  218. % en fonction d'une direction, voisin = [piece,[X,Y]]
  219. voisin([_,Coordos1], Direction, Plateau,[Piece,Coordos2]):-
  220.     coordonneesVoisines(Coordos1,Direction,Coordos2),
  221.     positionPiece(Coordos2, Plateau, Piece).
  222.  
  223. % voisin permet de connaitre le voisin d'une pièce s'il existe
  224. % en fonction d'un choix libre de direction, voisin = [piece,[X,Y]]
  225. voisin(P1, Plateau,P2):-
  226.     direction(D),
  227.     voisin(P1, D, Plateau, P2).
  228.  
  229. % voisins récursif, permet de connaitre les 6 voisins d'une pièce
  230. % le tout stocké dans une Liste
  231. voisins(P1, Plateau, Liste):-
  232.     findall(P2, voisin(P1, Plateau, P2), Liste).
  233.  
  234. %
  235. voisinR(Plateau, Acc, [Piece|ResteListe]):-
  236.     \+member(Acc, Piece),
  237.     append(Acc, [Piece], Acc2),
  238.     voisins(Piece, Plateau, voisins),
  239.     append(ResteListe, voisins, ResteListe2),
  240.     voisinR(ResteListe, Plateau, Acc2).
  241.  
  242. %
  243. voisinR([], Plateau, Acc):-
  244.     length(Plateau, LP
RAW Paste Data
Challenge yourself this year...
Learn something new in 2017
Top