diff --git a/tarotinator/src/Cartes.hs b/tarotinator/src/Cartes.hs index 3e19dc3..6788505 100644 --- a/tarotinator/src/Cartes.hs +++ b/tarotinator/src/Cartes.hs @@ -35,13 +35,3 @@ replaceNth (e:s) i newElement toPentuple :: [a] -> (a,a,a,a,a) toPentuple [j1,j2,j3,j4,j5] = (j1,j2,j3,j4,j5) -fst5 :: (a,b,c,d,e) -> a -fst5 (x,y,z,t,u) = x -snd5 :: (a,b,c,d,e) -> b -snd5 (x,y,z,t,u) = y -thr5 :: (a,b,c,d,e) -> c -thr5 (x,y,z,t,u) = z -frh5 :: (a,b,c,d,e) -> d -frh5 (x,y,z,t,u) = t -fih5 :: (a,b,c,d,e) -> e -fih5 (x,y,z,t,u) = u diff --git a/tarotinator/src/Tarot.hs b/tarotinator/src/Tarot.hs index f70ea19..07b126b 100644 --- a/tarotinator/src/Tarot.hs +++ b/tarotinator/src/Tarot.hs @@ -106,66 +106,40 @@ newtype EtatPartie j1 j2 j3 j4 j5 = EtatPartie (Int,(j1,j2,j3,j4,j5),[[Carte]],[ jouerPliAux :: (JoueurIA j1, JoueurIA j2, JoueurIA j3, JoueurIA j4, JoueurIA j5) => Int -> (j1,j2,j3,j4,j5) -> [[Carte]] -> [Carte] -> [[Carte]] -> (EtatPartie j1 j2 j3 j4 j5, [Carte]) -jouerPliAux main etats jeux pli points = (EtatPartie (vraiIndiceGagnant, etats, [delete c jeu | (c,jeu)<-(zip (rotate (5-main) pli) jeux)], replaceNth points vraiIndiceGagnant (pli ++ (points !! vraiIndiceGagnant))), pli) +jouerPliAux main etats jeux pli points = (EtatPartie (vraiIndiceGagnant, etats, newJeux, calculerPoints pli points jeux vraiIndiceGagnant), pli) where indiceGagnant = 5-(fromJust $ elemIndex (fromJust $ gagnantPli pli) (pli)) vraiIndiceGagnant = (mod (main+indiceGagnant-1) 5) + newJeux = [delete c jeu | (c,jeu)<-(zip (rotate (5-main) pli) jeux)] - --- Le premier élément de la liste de joueur (le plus profond) est le premier joueur --- Renvoie le nouvel état de la partie ainsi qu'une copie du pli joué. -jouerPli :: (JoueurIA j1, JoueurIA j2, JoueurIA j3, JoueurIA j4, JoueurIA j5) => (EtatPartie j1 j2 j3 j4 j5) -> (EtatPartie j1 j2 j3 j4 j5, [Carte]) -jouerPli (EtatPartie (0,joueurs,jeux,points)) = jouerPliAux 0 etats jeux pli points -- TODO l'excuse n'est pas gérée + +calculerPoints :: [Carte] -> [[Carte]] -> [[Carte]] -> Int -> [[Carte]] +calculerPoints pli points jeux vraiIndiceGagnant + | elem Excuse pli = let indiceExcuse = (fromJust $ findIndex (elem Excuse) jeux) in replaceNth (replaceNth points vraiIndiceGagnant (delete Excuse newPoints)) indiceExcuse (Excuse:(points !! indiceExcuse))-- On ne donne pas de demi point de compensation + | otherwise = replaceNth points vraiIndiceGagnant newPoints where - (c1,e1) = jouer (fst5 joueurs) [] - (c2,e2) = jouer (snd5 joueurs) (c1:[]) - (c3,e3) = jouer (thr5 joueurs) (c2:c1:[]) - (c4,e4) = jouer (frh5 joueurs) (c3:c2:c1:[]) - (c5,e5) = jouer (fih5 joueurs) (c4:c3:c2:c1:[]) + newPoints = (pli ++ (points !! vraiIndiceGagnant)) +-- Dans cette fonction, jr1 est le premier joueur à JOUER LE PLI, il s'agit en réalité du ième joueur +jouerPliAAux :: (JoueurIA j1, JoueurIA j2, JoueurIA j3, JoueurIA j4, JoueurIA j5) => int -> (j1,j2,j3,j4,j5) -> ([Carte],(j1,j2,j3,j4,j5)) +jouerPliAAux i (jr1,jr2,jr3,jr4,jr5) = (pli,(e1,e2,e3,e4,e5)) + where + (c1,e1) = jouer jr1 [] + (c2,e2) = jouer jr2 (c1:[]) + (c3,e3) = jouer jr3 (c2:c1:[]) + (c4,e4) = jouer jr4 (c3:c2:c1:[]) + (c5,e5) = jouer jr5 (c4:c3:c2:c1:[]) pli = c5:c4:c3:c2:c1:[] - etats = (finTour e1 pli, finTour e2 pli, finTour e3 pli, finTour e4 pli, finTour e5 pli) - -jouerPli (EtatPartie (1,joueurs,jeux,points)) = jouerPliAux 1 etats jeux pli points -- TODO l'excuse n'est pas gérée - where - (c2,e2) = jouer (snd5 joueurs) [] - (c3,e3) = jouer (thr5 joueurs) (c2:[]) - (c4,e4) = jouer (frh5 joueurs) (c3:c2:[]) - (c5,e5) = jouer (fih5 joueurs) (c4:c3:c2:[]) - (c1,e1) = jouer (fst5 joueurs) (c5:c4:c3:c2:[]) - pli = c1:c5:c4:c3:c2:[] - etats = (finTour e1 pli, finTour e2 pli, finTour e3 pli, finTour e4 pli, finTour e5 pli) - -jouerPli (EtatPartie (2,joueurs,jeux,points)) = jouerPliAux 2 etats jeux pli points -- TODO l'excuse n'est pas gérée - where - (c3,e3) = jouer (thr5 joueurs) [] - (c4,e4) = jouer (frh5 joueurs) (c3:[]) - (c5,e5) = jouer (fih5 joueurs) (c4:c3:[]) - (c1,e1) = jouer (fst5 joueurs) (c5:c4:c3:[]) - (c2,e2) = jouer (snd5 joueurs) (c1:c5:c4:c3:[]) - pli = c2:c1:c5:c4:c3:[] - etats = (finTour e1 pli, finTour e2 pli, finTour e3 pli, finTour e4 pli, finTour e5 pli) - -jouerPli (EtatPartie (3,joueurs,jeux,points)) = jouerPliAux 3 etats jeux pli points -- TODO l'excuse n'est pas gérée - where - (c4,e4) = jouer (frh5 joueurs) [] - (c5,e5) = jouer (fih5 joueurs) (c4:[]) - (c1,e1) = jouer (fst5 joueurs) (c5:c4:[]) - (c2,e2) = jouer (snd5 joueurs) (c1:c5:c4:[]) - (c3,e3) = jouer (thr5 joueurs) (c2:c1:c5:c4:[]) - pli = c3:c2:c1:c5:c4:[] - etats = (finTour e1 pli, finTour e2 pli, finTour e3 pli, finTour e4 pli, finTour e5 pli) - -jouerPli (EtatPartie (4,joueurs,jeux,points)) = jouerPliAux 4 etats jeux pli points -- TODO l'excuse n'est pas gérée - where - (c5,e5) = jouer (fih5 joueurs) [] - (c1,e1) = jouer (fst5 joueurs) (c5:[]) - (c2,e2) = jouer (snd5 joueurs) (c1:c5:[]) - (c3,e3) = jouer (thr5 joueurs) (c2:c1:c5:[]) - (c4,e4) = jouer (frh5 joueurs) (c3:c2:c1:c5:[]) - pli = c4:c3:c2:c1:c5:[] - etats = (finTour e1 pli, finTour e2 pli, finTour e3 pli, finTour e4 pli, finTour e5 pli) - - + + +-- Dans cette fonction, jr1 est le premier joueur de l'index, celui qui commence le pli est le i-ème +-- On est obligé d'écrire les cinq règles différement, parce que +jouerPli :: (JoueurIA j1, JoueurIA j2, JoueurIA j3, JoueurIA j4, JoueurIA j5) => (EtatPartie j1 j2 j3 j4 j5) -> (EtatPartie j1 j2 j3 j4 j5, [Carte]) +jouerPli (EtatPartie (0,(jr1,jr2,jr3,jr4,jr5),jeux,points)) = let (pli,(e1,e2,e3,e4,e5))=jouerPliAAux 0 (jr1,jr2,jr3,jr4,jr5) in jouerPliAux 0 (e1,e2,e3,e4,e5) jeux pli points +jouerPli (EtatPartie (1,(jr1,jr2,jr3,jr4,jr5),jeux,points)) = let (pli,(e2,e3,e4,e5,e1))=jouerPliAAux 1 (jr2,jr3,jr4,jr5,jr1) in jouerPliAux 1 (e1,e2,e3,e4,e5) jeux pli points +jouerPli (EtatPartie (2,(jr1,jr2,jr3,jr4,jr5),jeux,points)) = let (pli,(e3,e4,e5,e1,e2))=jouerPliAAux 2 (jr3,jr4,jr5,jr1,jr2) in jouerPliAux 2 (e1,e2,e3,e4,e5) jeux pli points +jouerPli (EtatPartie (3,(jr1,jr2,jr3,jr4,jr5),jeux,points)) = let (pli,(e4,e5,e1,e2,e3))=jouerPliAAux 3 (jr4,jr5,jr1,jr2,jr3) in jouerPliAux 3 (e1,e2,e3,e4,e5) jeux pli points +jouerPli (EtatPartie (4,(jr1,jr2,jr3,jr4,jr5),jeux,points)) = let (pli,(e5,e1,e2,e3,e4))=jouerPliAAux 4 (jr5,jr1,jr2,jr3,jr4) in jouerPliAux 4 (e1,e2,e3,e4,e5) jeux pli points +