Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.50 KB | None | 0 0
  1. :- consult('grille.pl').
  2.  
  3. /* Spécifications de notre jeu
  4. - : case vide
  5. x : coup joué par l'utilisateur
  6. o : coup joué par l'IA
  7. */
  8.  
  9. /*********************************************************
  10. Fonctions aidant à la logique applicative
  11. *********************************************************/
  12. /*vérifie si un nombre est entre 0 et une borne supérieure N*/
  13. range(X,X).
  14. range(X,N) :- X > 0, X < N.
  15.  
  16. /* Incrémente un nombre X */
  17. incremente_nombre(X, X1) :- X1 is X + 1.
  18.  
  19. /*retourne une copie/abstraction de la variable*/
  20. abstraire(A, A).
  21.  
  22. /*Associe un numéro de colonne à une liste */
  23. associer_liste_colonne([], _, 8, _).
  24. associer_liste_colonne([H|_], C, N, M):- H = C, M is N.
  25. associer_liste_colonne([_|T], C, N, M):- N1 is N+1, associer_liste_colonne(T, C, N1, M).
  26.  
  27. /* Trouvre la première colonne qui est libre */
  28. trouve_colonne_vide([], 8, _).
  29. trouve_colonne_vide([H|T], N, M):- not(member('-', H)), N1 is N+1, trouve_colonne_vide(T, N1, M).
  30. trouve_colonne_vide([H|_], N, M):-M is N, member('-', H).
  31.  
  32. /* find 3 characters in 3 lists are at the same indices, or increasing decreasing order */
  33. row3(X,Y,Z):- length(X,N),length(Y,N),length(Z,N).
  34. rightD3(X,Y,Z):- length(X,N1),length(Y,N2),length(Z,N3), N2 is N1+1, N3 is N2+1.
  35. leftD3(X,Y,Z):- length(X,N1),length(Y,N2),length(Z,N3), N2 is N1-1, N3 is N2-1.
  36.  
  37.  
  38.  
  39. /*********************************************************
  40. Fin de la section sur les fonctions aidant à la logique applicative
  41. *********************************************************/
  42.  
  43. /*Point d'entrée du programme*/
  44. commencer :- write('Bonjour, veuillez chosir votre prochain coup par le biais du clavier (touches 1 a 7) \n\r'), nl,
  45. get_grille(X),
  46. afficher_grille(X), nl, nl,
  47. mouvement_joueur(X, _).
  48.  
  49.  
  50.  
  51.  
  52. /*Vérifie si l'utilisateur entre un numéro de colonne cohérent*/
  53. lecture_no_colonne(X) :- nl,
  54. write("*---------------------------*"), nl,
  55. write("| |"), nl,
  56. write("|Entrer le numero de colonne|"), nl,
  57. read(NoColonne),
  58. write("| |"), nl,
  59. write("*---------------------------*"), nl,nl,
  60. integer(NoColonne),range(NoColonne,7) -> X is NoColonne;
  61. write('Le numero de colonne est invalide').
  62.  
  63.  
  64. /*Trouve une colonne libre pour le jeton*/
  65. trouver_colonne(Jeton, [A|B], [A|B2], N, M) :- N \== M,incremente_nombre(M, M2),abstraire(A, A),trouver_colonne(Jeton, B, B2, N, M2).
  66.  
  67. /*Ajoute un jeton à une colonne*/
  68. trouver_colonne(Jeton, [A|B], [A1|B], N, M) :- N == M,abstraire(B, B),insere_jeton_colonne(Jeton, A, A1).
  69.  
  70. /*Deplace un jeton dans une colonne spécifique */
  71. deplacer_jeton(Jeton, grille(Y), grille(Y2), N) :- trouver_colonne(Jeton, Y, Y2, N, 1).
  72.  
  73. /* Mouvement de base de l'utilisateur */
  74. mouvement_joueur(X, X2) :- lecture_no_colonne(N),
  75. deplacer_jeton('x', X, X2, N),
  76. afficher_grille(X2), nl, nl,
  77. changer_tour('o', X2, _).
  78.  
  79. /* vérifications concernant les déplacements de jeton et déplacement d'un jeton */
  80. insere_jeton_colonne(X, ['-'], [X]).
  81. insere_jeton_colonne(X, ['-', A|B], [X, A|B]) :- A \== '-'.
  82. insere_jeton_colonne(X, ['-', A|B], ['-', A1|B1]) :- (A == '-'),
  83. insere_jeton_colonne(X, [A|B], [A1|B1]).
  84. insere_jeton_colonne(_, [A|_], _) :- A \== '-',write('Votre coup etait hors des limites de la grille, vous avez ete redirige vers une nouvelle partie.'), nl, commencer.
  85.  
  86. /* Logique concernant le changement de tour et la victoire d'une partie */
  87. changer_tour('o', X, _) :- etat_final_humain(X, 'x').
  88. changer_tour('x', X, _) :- etat_final_ordi(X, 'o').
  89. changer_tour(_, X, _):- etat_final_egal(X).
  90. changer_tour('o', X, X2) :- analyseIA(X, X2).
  91. changer_tour('x', X, X2) :- mouvement_joueur(X, X2).
  92.  
  93.  
  94. /*********************************************************
  95. Logique concernant la gestion d'une victoire ou partie nulle
  96. *********************************************************/
  97. /* colonne de quatre */
  98. etat_final(grille(X), R):- append(_,[C|_], X) ,
  99. append(_,[R,R,R,R|_],C).
  100.  
  101.  
  102. /* rangee de quatre, ou diagonale de chaque direction */
  103. etat_final(grille(X), R):-
  104. append(_,[Col1, Col2, Col3, Col4|_], X),
  105. append(P1, [R|_], Col1),
  106. append(P2, [R|_], Col2),
  107. append(P3, [R|_], Col3),
  108. append(P4, [R|_], Col4),
  109. (row(P1,P2,P3,P4) ; rightD(P1,P2,P3,P4) ; leftD(P1,P2,P3,P4)).
  110.  
  111.  
  112. /* partie nulle*/
  113. etat_final(grille([])).
  114. etat_final(grille([H|T])):- not(member('-', H)), etat_final(grille(T)).
  115.  
  116.  
  117. /* fonctions pour determiner si c'est une rang�e, ou diagonale. */
  118. row(W,X,Y,Z):- length(W,N),length(X,N),length(Y,N),length(Z,N).
  119. rightD(W,X,Y,Z):- length(W,N1),length(X,N2),length(Y,N3),length(Z,N4), N2 is N1+1, N3 is N2+1, N4 is N3+1.
  120. leftD(W,X,Y,Z):- length(W,N1),length(X,N2),length(Y,N3),length(Z,N4), N2 is N1-1, N3 is N2-1, N4 is N3-1.
  121.  
  122.  
  123. /*Les états conclusifs. Dependant du gagnant, un message different s'affiche. */
  124. etat_final_humain(X, R):- etat_final(X, R), R = 'x', write_gagnant(), nl, nl.
  125. etat_final_ordi(X, R):- etat_final(X, R), R = 'o', write_perdant(), nl, nl.
  126. etat_final_egal(X):- etat_final(X), write('Partie Nul!').
  127.  
  128. write_gagnant() :- write_haut(),
  129. write("|--+ Vous avez gagne ! +--|"), nl,
  130. write_bas().
  131.  
  132. write_perdant() :- write_haut(),
  133. write("|--+ Vous avez perdu ! +--|"), nl,
  134. write_bas().
  135.  
  136. write_haut() :- write("+--------+----*----+--------+"), nl,
  137. write("|------+ +------|"), nl,
  138. write("|----+ +----|"), nl.
  139.  
  140. write_bas() :- write("|----+ +----|"), nl,
  141. write("|------+ +------|"), nl,
  142. write("+--------+----*----+--------+").
  143.  
  144.  
  145. /*********************************************************
  146. Fin de la section sur la logique concernant la gestion d'une victoire ou partie nulle
  147. *********************************************************/
  148.  
  149.  
  150.  
  151.  
  152.  
  153.  
  154. /* JOUEUR IA */
  155. /* Ici, l'ordi a plusieurs actions qu'il peut completer. En ordre de priorite:
  156. * 1. Bloque une colonne, rangee, ou diagonale gagnante du joueur
  157. * humain.
  158. * 2. Jouer un jeton gagnant.
  159. * 3. Bloque l'avance d'un joueur qui pourrait l'amener a gagner.
  160. * 4. Joueur un jeton adjacent a ses autres, pour s'avancer vers une
  161. * victoire.
  162. * 5. Dans le cas ou aucune de ses actions demeurent possible,
  163. * l'ordinateur joue dans une colonne vide. */
  164. /* L'ordinateur cherche une colonne ou les conditions s'appliquent, et il joue dans la colonne. */
  165.  
  166. /* colonne de 3 */
  167. analyseIA(grille(X), X2):- (append(,[C|_], X), append(,['-','x','x','x'|_],C)) ->
  168. (associer_liste_colonne(X, C, 1, M), member('-', C), coup_IA(X, X2, M)).
  169.  
  170. analyseIA(grille(X), X2):- (append(,[C|_], X), append(,['-','o','o','o'|_],C)) ->
  171. (associer_liste_colonne(X, C, 1, M), member('-', C), coup_IA(X, X2, M)).
  172.  
  173. /* rangee, ou diagonale de deux ou plus */
  174. analyseIA(grille(X), X2):-
  175. (append(_,[Col1, Col2, Col3|_], X)
  176. append(P1, ['-'|_], Col1),
  177. append(P2, ['o'|_], Col2),
  178. append(P3, ['o'|_], Col3), (row3(P1,P2,P3); rightD3(P1,P2,P3); leftD3(P1,P2,P3)))
  179. -> (associer_liste_colonne(X, Col3, 1, M),
  180. member('-', Col3),
  181. coup_IA(X, X2, M)).
  182.  
  183. analyseIA(grille(X), X2):-
  184. ( append(_,[Col1, Col2, Col3|_], X),
  185. append(P1, ['o'|_], Col1),
  186. append(P2, ['o'|_], Col2),
  187. append(P3, ['-'|_], Col3), (row3(P1,P2,P3); rightD3(P1,P2,P3); leftD3(P1,P2,P3)))
  188. -> (associer_liste_colonne(X, Col1, 1, M),
  189. member('-', Col1),
  190. coup_IA(X, X2, M)).
  191.  
  192. analyseIA(grille(X), X2):-
  193. ( append(_,[Col1, Col2, Col3|_], X),
  194. append(P1, ['x'|_], Col1),
  195. append(P2, ['x'|_], Col2),
  196. append(P3, ['-'|_], Col3), (row3(P1,P2,P3); rightD3(P1,P2,P3); leftD3(P1,P2,P3)))
  197. -> (associer_liste_colonne(X, Col3, 1, M),
  198. member('-', Col3),
  199. coup_IA(X, X2, M)).
  200.  
  201. analyseIA(grille(X), X2):-
  202. ( append(_,[Col1, Col2, Col3|_], X),
  203. append(P1, ['-'|_], Col1),
  204. append(P2, ['x'|_], Col2),
  205. append(P3, ['x'|_], Col3), (row3(P1,P2,P3); rightD3(P1,P2,P3); leftD3(P1,P2,P3)))
  206. -> (associer_liste_colonne(X, Col1, 1, M),
  207. member('-', Col1),
  208. coup_IA(X, X2, M)).
  209.  
  210. /* colonne de deux */
  211. analyseIA(grille(X), X2):- (append(_,[C|_], X),
  212. append(_,['-','-','x','x'|_],C))
  213. ->(associer_liste_colonne(X, C, 1, M),
  214. member('-', C),
  215. coup_IA(X, X2, M)).
  216. analyseIA(grille(X), X2):- (append(_,[C|_], X),
  217. append(_,['-','-','o','o'|_],C))
  218. ->(associer_liste_colonne(X, C, 1, M),
  219. member('-', C),
  220. coup_IA(X, X2, M)).
  221. /* colonne de un 'o' */
  222. analyseIA(grille(X), X2):- (append(_,[C|_], X),
  223. append(_,['-','-','-','o'|_],C))
  224. ->(associer_liste_colonne(X, C, 1, M),
  225. member('-', C),
  226. coup_IA(X, X2, M)).
  227.  
  228.  
  229.  
  230. /* dans le cas exception ou aucune des conditions s'appliquent */
  231. analyseIA(grille(X), X2):- trouve_colonne_vide(X, 1, M),coup_IA(X, X2, M).
  232.  
  233. /* l'action de jouer un jeton */
  234. coup_IA(X, X2, C):- deplacer_jeton('o', grille(X), X2, C),
  235. afficher_grille(X2), nl, nl,
  236. changer_tour('x', X2, _).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement