/* accesseurs sur ligne et colonne*/ colonne(1,[A,_,_,_],A). colonne(2,[_,A,_,_],A). colonne(3,[_,_,A,_],A). colonne(4,[_,_,_,A],A). ligne(1,[A,_,_,_,_],A). ligne(2,[_,A,_,_,_],A). ligne(3,[_,_,A,_,_],A). ligne(4,[_,_,_,A,_],A). ligne(5,[_,_,_,_,A],A). /* retourne le contenu "Contenu_case" de la case situé à la colonne "Col" et la ligne "Lig" du jeux en cours "Contenu_jeu" */ case(Lig,Col,Conf,Contenu) :- ligne(Lig,Conf,Ligne), colonne(Col,Ligne,Contenu). changeContenuColonne(1,X,[_,B,C,D],[X,B,C,D]). changeContenuColonne(2,X,[A,_,C,D],[A,X,C,D]). changeContenuColonne(3,X,[A,B,_,D],[A,B,X,D]). changeContenuColonne(4,X,[A,B,C,_],[A,B,C,X]). changeContenuLigne(1,X,[_,B,C,D,E],[X,B,C,D,E]). changeContenuLigne(2,X,[A,_,C,D,E],[A,X,C,D,E]). changeContenuLigne(3,X,[A,B,_,D,E],[A,B,X,D,E]). changeContenuLigne(4,X,[A,B,C,_,E],[A,B,C,X,E]). changeContenuLigne(5,X,[A,B,C,D,_],[A,B,C,D,X]). changeContenu(Conf1,Piece,Y,X,Conf2):- ligne(Y,Conf1,Ligne), changeContenuColonne(X,Piece,Ligne,Lignep), changeContenuLigne(Y,Lignep,Conf1,Conf2). init([ [jaune1,rouge1,rouge2,jaune1], [jaune2,rouge3,rouge4,jaune2], [noir1,blanc1,blanc2,noir1], [noir2,bois,bois,noir2], [marron,vide,vide,marron]]). final([ [jaune1,rouge1,rouge2,jaune1], [jaune2,rouge3,rouge4,jaune2], [noir1,blanc1,blanc2,noir1], [_,vide,vide,_], [_,_,_,_]]). /* final([ [_,_,_,_], [_,_,_,_], [_,_,_,_], [_,rouge1,rouge2,_], [_,rouge3,rouge4,_]]). final([ [jaune1,rouge1,rouge2,jaune1], [jaune2,rouge3,rouge4,jaune2], [_,_,_,_], [_,noir1,noir1,_], [_,noir2,noir2,_]]). */ /* deplacement horizontal */ glissementHOK(rouge1,Conf1,Conf2):- case(Lig,Col,Conf1,rouge1), case(Lig,Colpp,Conf1,vide), case(Ligp,Colpp,Conf1,vide), Ligp is Lig+1, Colp is Col+1, Colpp is Col+2, changeContenu(Conf1,rouge1,Lig,Colp,Conf1a), changeContenu(Conf1a,rouge2,Lig,Colpp,Conf1b), changeContenu(Conf1b,vide,Lig,Col,Conf1c), changeContenu(Conf1c,rouge3,Ligp,Colp,Conf1d), changeContenu(Conf1d,rouge4,Ligp,Colpp,Conf1e), changeContenu(Conf1e,vide,Ligp,Col,Conf2). glissementHOK(noir1,Conf1,Conf2):- case(Lig,Col,Conf1,noir1), case(Lig,Colp,Conf1,vide), case(Ligp,Colp,Conf1,vide), Ligp is Lig+1, Colp is Col+1, changeContenu(Conf1,noir1,Lig,Colp,Conf1a), changeContenu(Conf1a,noir2,Ligp,Colp,Conf1b), changeContenu(Conf1b,vide,Lig,Col,Conf1c), changeContenu(Conf1c,vide,Ligp,Col,Conf2). glissementHOK(jaune1,Conf1,Conf2):- case(Lig,Col,Conf1,jaune1), case(Lig,Colp,Conf1,vide), case(Ligp,Colp,Conf1,vide), Ligp is Lig+1, Colp is Col+1, changeContenu(Conf1,jaune1,Lig,Colp,Conf1a), changeContenu(Conf1a,jaune2,Ligp,Colp,Conf1b), changeContenu(Conf1b,vide,Lig,Col,Conf1c), changeContenu(Conf1c,vide,Ligp,Col,Conf2). glissementHOK(blanc1,Conf1,Conf2):- case(Lig,Col,Conf1,blanc1), case(Lig,Colpp,Conf1,vide), Colpp is Col+2, Colp is Col+1, changeContenu(Conf1,blanc1,Lig,Colp,Conf1a), changeContenu(Conf1a,blanc2,Lig,Colpp,Conf1b), changeContenu(Conf1b,vide,Lig,Col,Conf2). glissementHOK(bois,Conf1,Conf2):- case(Lig,Col,Conf1,bois), case(Lig,Colp,Conf1,vide), Colp is Col+1, changeContenu(Conf1,bois,Lig,Colp,Conf1a), changeContenu(Conf1a,vide,Lig,Col,Conf2). glissementHOK(marron,Conf1,Conf2):- case(Lig,Col,Conf1,marron), case(Lig,Colp,Conf1,vide), Colp is Col+1, changeContenu(Conf1,marron,Lig,Colp,Conf1a), changeContenu(Conf1a,vide,Lig,Col,Conf2). /***** Copier-coller a simplifier ***/ glissementHOK(rouge1,Conf1,Conf2):- case(Lig,Col,Conf1,rouge1), case(Lig,Colm,Conf1,vide), case(Ligp,Colm,Conf1,vide), Ligp is Lig+1, Colm is Col-1, Colp is Col+1, changeContenu(Conf1,rouge1,Lig,Colm,Conf1a), changeContenu(Conf1a,rouge2,Lig,Col,Conf1b), changeContenu(Conf1b,vide,Lig,Colp,Conf1c), changeContenu(Conf1c,rouge3,Ligp,Colm,Conf1d), changeContenu(Conf1d,rouge4,Ligp,Col,Conf1e), changeContenu(Conf1e,vide,Ligp,Colp,Conf2). glissementHOK(noir1,Conf1,Conf2):- case(Lig,Col,Conf1,noir1), case(Lig,Colp,Conf1,vide), case(Ligp,Colp,Conf1,vide), Ligp is Lig+1, Colp is Col-1, changeContenu(Conf1,noir1,Lig,Colp,Conf1a), changeContenu(Conf1a,noir2,Ligp,Colp,Conf1b), changeContenu(Conf1b,vide,Lig,Col,Conf1c), changeContenu(Conf1c,vide,Ligp,Col,Conf2). glissementHOK(jaune1,Conf1,Conf2):- case(Lig,Col,Conf1,jaune1), case(Lig,Colp,Conf1,vide), case(Ligp,Colp,Conf1,vide), Ligp is Lig+1, Colp is Col-1, changeContenu(Conf1,jaune1,Lig,Colp,Conf1a), changeContenu(Conf1a,jaune2,Ligp,Colp,Conf1b), changeContenu(Conf1b,vide,Lig,Col,Conf1c), changeContenu(Conf1c,vide,Ligp,Col,Conf2). glissementHOK(blanc1,Conf1,Conf2):- case(Lig,Col,Conf1,blanc1), case(Lig,Colm,Conf1,vide), Colp is Col+1, Colm is Col-1, changeContenu(Conf1,blanc1,Lig,Colm,Conf1a), changeContenu(Conf1a,blanc2,Lig,Col,Conf1b), changeContenu(Conf1b,vide,Lig,Colp,Conf2). glissementHOK(bois,Conf1,Conf2):- case(Lig,Col,Conf1,bois), case(Lig,Colm,Conf1,vide), Colm is Col-1, changeContenu(Conf1,bois,Lig,Colm,Conf1a), changeContenu(Conf1a,vide,Lig,Col,Conf2). glissementHOK(marron,Conf1,Conf2):- case(Lig,Col,Conf1,marron), case(Lig,Colm,Conf1,vide), Colm is Col-1, changeContenu(Conf1,marron,Lig,Colm,Conf1a), changeContenu(Conf1a,vide,Lig,Col,Conf2). /** fin du copier-coller **/ /** déplacement vertical **/ glissementVOK(rouge1,Conf1,Conf2):- case(Lig,Col,Conf1,rouge1), case(Ligpp,Col,Conf1,vide), case(Ligpp,Colp,Conf1,vide), Ligp is Lig+1, Ligpp is Lig+2, Colp is Col+1, changeContenu(Conf1,rouge1,Ligp,Col,Conf1a), changeContenu(Conf1a,rouge2,Ligp,Colp,Conf1b), changeContenu(Conf1b,vide,Lig,Col,Conf1c), changeContenu(Conf1c,rouge3,Ligpp,Col,Conf1d), changeContenu(Conf1d,rouge4,Ligpp,Colp,Conf1e), changeContenu(Conf1e,vide,Lig,Colp,Conf2). glissementVOK(noir1,Conf1,Conf2):- case(Lig,Col,Conf1,noir1), case(Ligpp,Col,Conf1,vide), Ligp is Lig+1, Ligpp is Lig+2, changeContenu(Conf1,noir1,Ligp,Col,Conf1a), changeContenu(Conf1a,noir2,Ligpp,Col,Conf1b), changeContenu(Conf1b,vide,Lig,Col,Conf2). glissementVOK(jaune1,Conf1,Conf2):- case(Lig,Col,Conf1,jaune1), case(Ligpp,Col,Conf1,vide), Ligp is Lig+1, Ligpp is Lig+2, changeContenu(Conf1,jaune1,Ligp,Col,Conf1a), changeContenu(Conf1a,jaune2,Ligpp,Col,Conf1b), changeContenu(Conf1b,vide,Lig,Col,Conf2). glissementVOK(blanc1,Conf1,Conf2):- case(Lig,Col,Conf1,blanc1), case(Ligp,Col,Conf1,vide), case(Ligp,Colp,Conf1,vide), Ligp is Lig+1, Colp is Col+1, changeContenu(Conf1,blanc1,Ligp,Col,Conf1a), changeContenu(Conf1a,blanc2,Ligp,Colp,Conf1b), changeContenu(Conf1b,vide,Lig,Col,Conf1c), changeContenu(Conf1c,vide,Lig,Colp,Conf2). glissementVOK(bois,Conf1,Conf2):- case(Lig,Col,Conf1,bois), case(Ligp,Col,Conf1,vide), Ligp is Lig+1, changeContenu(Conf1,bois,Ligp,Col,Conf1a), changeContenu(Conf1a,vide,Lig,Col,Conf2). glissementVOK(marron,Conf1,Conf2):- case(Lig,Col,Conf1,marron), case(Ligp,Col,Conf1,vide), Ligp is Lig+1, changeContenu(Conf1,marron,Ligp,Col,Conf1a), changeContenu(Conf1a,vide,Lig,Col,Conf2). /***** copier coller de deplacement vertical **/ glissementVOK(rouge1,Conf1,Conf2):- case(Lig,Col,Conf1,rouge1), case(Ligm,Col,Conf1,vide), case(Ligm,Colp,Conf1,vide), Ligp is Lig+1, Ligm is Lig-1, Colp is Col+1, changeContenu(Conf1,rouge1,Ligm,Col,Conf1a), changeContenu(Conf1a,rouge2,Ligm,Colp,Conf1b), changeContenu(Conf1b,vide,Ligp,Col,Conf1c), changeContenu(Conf1c,rouge3,Lig,Col,Conf1d), changeContenu(Conf1d,rouge4,Lig,Colp,Conf1e), changeContenu(Conf1e,vide,Ligp,Colp,Conf2). glissementVOK(noir1,Conf1,Conf2):- case(Lig,Col,Conf1,noir1), case(Ligm,Col,Conf1,vide), Ligp is Lig+1, Ligm is Lig-1, changeContenu(Conf1,noir1,Ligm,Col,Conf1a), changeContenu(Conf1a,noir2,Lig,Col,Conf1b), changeContenu(Conf1b,vide,Ligp,Col,Conf2). glissementVOK(jaune1,Conf1,Conf2):- case(Lig,Col,Conf1,jaune1), case(Ligm,Col,Conf1,vide), Ligp is Lig+1, Ligm is Lig-1, changeContenu(Conf1,jaune1,Ligm,Col,Conf1a), changeContenu(Conf1a,jaune2,Lig,Col,Conf1b), changeContenu(Conf1b,vide,Ligp,Col,Conf2). glissementVOK(blanc1,Conf1,Conf2):- case(Lig,Col,Conf1,blanc1), case(Ligm,Col,Conf1,vide), case(Ligm,Colp,Conf1,vide), Ligm is Lig-1, Colp is Col+1, changeContenu(Conf1,blanc1,Ligm,Col,Conf1a), changeContenu(Conf1a,blanc2,Ligm,Colp,Conf1b), changeContenu(Conf1b,vide,Lig,Col,Conf1c), changeContenu(Conf1c,vide,Lig,Colp,Conf2). glissementVOK(bois,Conf1,Conf2):- case(Lig,Col,Conf1,bois), case(Ligm,Col,Conf1,vide), Ligm is Lig-1, changeContenu(Conf1,bois,Ligm,Col,Conf1a), changeContenu(Conf1a,vide,Lig,Col,Conf2). glissementVOK(marron,Conf1,Conf2):- case(Lig,Col,Conf1,marron), case(Ligm,Col,Conf1,vide), Ligm is Lig-1, changeContenu(Conf1,marron,Ligm,Col,Conf1a), changeContenu(Conf1a,vide,Lig,Col,Conf2). /*** fin du copier coller **/ glissement(Piece,C1,C2):- glissementHOK(Piece,C1,C2). glissement(Piece,C1,C2):- glissementVOK(Piece,C1,C2). /* parcours */ resoud(Conf,[Conf]) :- final(Conf). resoud(Conf,[Conf|Historique]) :- glissement(_,Conf,Confp), resoud(Confp,Historique), not(member(Conf,Historique)). test(Depl):- init(X), resoud(X,Depl). /*test(Moves) :-etat_initial(Conf), resoud(Conf,[Conf],Moves).*/