Le tarot est maintenant fonctionnel, mais il manque quelque règles...

This commit is contained in:
Mysaa 2022-01-12 00:17:38 +01:00
parent a638dd8c3f
commit cae980e209
Signed by: Mysaa
GPG Key ID: DBA23608F23F5A10
3 changed files with 67 additions and 43 deletions

View File

@ -27,9 +27,10 @@ deck = fromList ([Valeur (n,c) | n<-allValeurs, c<-allCouleurs] ++ [Atout n | n<
------------- List Utils -------------
--------------------------------------
replaceNth :: [a] -> Int -> a -> [a]
replaceNth [] _ _ = error "Impossible d'accéder au i-ème élément de la liste vide :/ "
replaceNth (e:s) i newElement
| i==0 = newElement:s
| otherwise = replaceNth s (i-1) newElement
| otherwise = e:(replaceNth s (i-1) newElement)
toPentuple :: [a] -> (a,a,a,a,a)
toPentuple [j1,j2,j3,j4,j5] = (j1,j2,j3,j4,j5)

View File

@ -4,13 +4,26 @@ import TarotIAs
import System.Random.Shuffle
import Data.Set
import Data.Foldable
import Data.List
printResults :: Int -> [Carte] -> IO ()
printResults i pts = do
putStrLn $ "Joueur " ++ (show i) ++ " : " ++ (show $ valeurTas pts) ++ " point·s."
putStrLn (show pts)
printDecks :: Int -> [Carte] -> IO ()
printDecks i cartes = do
putStrLn $ "Joueur " ++ (show i) ++ " : " ++ (show $ sort $ cartes)
main :: IO ()
main = do
donne <- shuffleM $ Data.Set.toList deck
let
([cartes1,cartes2,cartes3,cartes4,cartes5],chien) = distribuer donne
(cartes,chien) = distribuer donne
[cartes1,cartes2,cartes3,cartes4,cartes5] = cartes
(s0,s1,s2,s3,s4) = (distrib cartes1 0, distrib cartes2 1, distrib cartes3 2, distrib cartes4 3, distrib cartes5 4) :: (RandomIA,RandomIA,RandomIA,RandomIA,RandomIA)
-- C'est le premier qui prends, parce que ..... j'ai décidé.
(s0',s1',s2',s3',s4') = (debutPartie s0 0, debutPartie s1 0, debutPartie s2 0, debutPartie s3 0,debutPartie s4 0)
@ -20,16 +33,13 @@ main = do
cartesJouees = iterate (jouerPli . fst) (etat0,[])
steps = Prelude.take 15 $ Prelude.drop 1 cartesJouees
putStr "Joueur 1 :"
putStrLn (show cartes1)
putStr "Joueur 2 :"
putStrLn (show cartes2)
putStr "Joueur 3 :"
putStrLn (show cartes3)
putStr "Joueur 4 :"
putStrLn (show cartes4)
putStr "Joueur 5 :"
putStrLn (show cartes5)
for_ (zip [1..5] cartes) (uncurry printDecks)
putStrLn ""
for_ steps $ \(state,pli) -> do
putStrLn $ show pli
for_ steps $ \(EtatPartie(i,ias,jeux,points),pli) -> do
putStrLn $ show $ reverse pli
putStrLn $ "-> Gagné par joueur " ++ (show (i+1))
let EtatPartie(_,_,_,points) = fst $ last steps
putStrLn "Résultats"
for_ (zip [1..5] points) (uncurry printResults)

View File

@ -29,16 +29,30 @@ couleurPliFromCarte Excuse = CExcuse
couleurPli :: [Carte] -> CouleurPli
couleurPli [] = CExcuse
couleurPli (e:s)
| z==CExcuse = couleurPliFromCarte e
| (z==CExcuse) = couleurPliFromCarte e
| otherwise = z
where z = couleurPli s
valeurCarte :: Carte -> Int
valeurCarte (Valeur (Roi, _)) = 9
valeurCarte (Valeur (Dame, _)) = 7
valeurCarte (Valeur (Cavalier, _)) = 5
valeurCarte (Valeur (Valet, _)) = 3
valeurCarte (Atout (1)) = 9
valeurCarte (Atout (21)) = 9
valeurCarte Excuse = 9
valeurCarte _ = 1
valeurTas :: [Carte] -> Int
valeurTas l = sum $ map valeurCarte l
-- Renvoie la carte qui a fait le pli
gagnantPli :: [Carte] -> Maybe Carte
gagnantPli [] = Nothing
gagnantPli (e:s) = case (e, w) of {
(_, Nothing) -> Just e; -- La seule carte d'un pli le gagne
(_, Just Excuse) -> Just e; -- Si juste une excuse a été jouée, la nouvelle carte gagne le pli.
(Excuse, _) -> w; -- L'excuse ne peut remporter le pli.
(Atout n, Just (Atout m)) -> Just (Atout (max n m)); -- L'atout le plus haut gagne
(Atout _, _) -> Just e; -- Seul un atout peut batter un atout.
(Valeur (f,c), Just (Atout _)) -> w; -- On s'est pissé dessus, on ne prend pas le pli
@ -94,8 +108,8 @@ 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)
where
vraiIndiceGagnant = (mod (main+indiceGagnant) 5)
indiceGagnant = fromJust $ elemIndex (fromJust $ gagnantPli pli) (pli)
indiceGagnant = 5-(fromJust $ elemIndex (fromJust $ gagnantPli pli) (pli))
vraiIndiceGagnant = (mod (main+indiceGagnant-1) 5)
-- Le premier élément de la liste de joueur (le plus profond) est le premier joueur
@ -104,52 +118,51 @@ jouerPli :: (JoueurIA j1, JoueurIA j2, JoueurIA j3, JoueurIA j4, JoueurIA j5) =>
jouerPli (EtatPartie (0,joueurs,jeux,points)) = jouerPliAux 0 etats jeux pli points -- TODO l'excuse n'est pas gérée
where
(c1,e1) = jouer (fst5 joueurs) []
(c2,e2) = jouer (snd5 joueurs) [c1]
(c3,e3) = jouer (thr5 joueurs) [c1,c2]
(c4,e4) = jouer (frh5 joueurs) [c1,c2,c3]
(c5,e5) = jouer (fih5 joueurs) [c1,c2,c3,c4]
pli = [c1,c2,c3,c4,c5]
(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:[])
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) [c2,c3]
(c5,e5) = jouer (fih5 joueurs) [c2,c3,c4]
(c1,e1) = jouer (fst5 joueurs) [c2,c3,c4,c5]
pli = [c2,c3,c4,c5,c1]
(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) [c3,c4]
(c1,e1) = jouer (fst5 joueurs) [c3,c4,c5]
(c2,e2) = jouer (snd5 joueurs) [c3,c4,c5,c1]
pli = [c3,c4,c5,c1,c2]
(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
-- (pli,etats)=foldr (\joueur -> \(pli,etats) -> let (carte,etat) = jouer joueur pli in (carte:pli,etat:etats)) ([],[]) joueurs
(c4,e4) = jouer (frh5 joueurs) []
(c5,e5) = jouer (fih5 joueurs) [c4]
(c1,e1) = jouer (fst5 joueurs) [c4,c5]
(c2,e2) = jouer (snd5 joueurs) [c4,c5,c1]
(c3,e3) = jouer (thr5 joueurs) [c4,c5,c1,c2]
pli = [c4,c5,c1,c2,c3]
(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) [c5,c1]
(c3,e3) = jouer (thr5 joueurs) [c5,c1,c2]
(c4,e4) = jouer (frh5 joueurs) [c5,c1,c2,c3]
pli = [c5,c1,c2,c3,c4]
(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)