module Operations where import Control.Monad.State import System.Random (newStdGen, randoms) import Data.List import Data.Ord import Card import Skat import Pile import Player import Utils (shuffle) compareRender :: Card -> Card -> Ordering compareRender (Card t1 c1) (Card t2 c2) = case compare c1 c2 of EQ -> compare t1 t2 v -> v sortRender :: [Card] -> [Card] sortRender = sortBy compareRender turn :: Hand -> Skat (Int, Int) turn n = do table <- getp tableCards ps <- gets players let p = player ps n hand <- getp $ handCards n case length table of 0 -> play p >> turn (next n) 1 -> do modify $ setTurnColour (Just $ getColour $ head table) play p turn (next n) 2 -> play p >> turn (next n) 3 -> do w <- evaluateTable if length hand == 0 then countGame else turn w evaluateTable :: Skat Hand evaluateTable = do trumpCol <- gets trumpColour turnCol <- gets turnColour table <- getp tableCards ps <- gets players let winningCard = head $ sortCards trumpCol turnCol table Just winnerHand <- getp $ originOfCard winningCard let winner = player ps winnerHand modifyp $ cleanTable (team winner) modify $ setTurnColour Nothing return $ hand winner countGame :: Skat (Int, Int) countGame = getp count play :: Player p => p -> Skat Card play p = do table <- getp tableCards turnCol <- gets turnColour trump <- gets trumpColour hand <- getp $ handCards (hand p) let card = chooseCard p trump turnCol hand modifyp $ playCard card return card ---- TESTING VARS env :: SkatEnv env = SkatEnv piles Nothing Spades playersExamp where piles = distribute allCards playersExamp :: Players playersExamp = Players (PL $ Stupid Team Hand1) (PL $ Stupid Team Hand2) (PL $ Stupid Single Hand3) shuffledEnv :: IO SkatEnv shuffledEnv = do cards <- shuffleCards return $ SkatEnv (distribute cards) Nothing Spades playersExamp