module Game.Poker.AI ( aiSelectDiscards , nOfKindDiscards ) where import Data.List import Data.Maybe import Control.Applicative import Game.Poker.Cards import Game.Poker.Hands -- | Sutefuda by AI -- -- >>> let Just straightFlush = toHand $ take 5 $ allCards -- >>> aiSelectDiscards straightFlush -- [] -- -- >>> let Just fourCard = toHand $ take 5 $ (filter ((==10) . cardNumber) allCards) ++ allCards -- >>> aiSelectDiscards fourCard -- [H2_] -- -- >>> let Just buta = toHand $ take 5 $ (take 2 allCards) ++ (take 2 $ drop (13+5) allCards) ++ (drop (13*2+9) allCards) -- >>> aiSelectDiscards buta -- [H2_,H3_,D7_,D8_,CJ_] -- aiSelectDiscards :: Hand -> DiscardList aiSelectDiscards hand = fromMaybe (nOfKindDiscards hand) ((straightHint hand <|> flushHint hand) *> Just []) -- | Sutefuda = Hand - allYaku -- -- >>> let Just (x) = toHand $ take 5 $ (filter (\x -> (cardNumber x == 10)) $ allCards) ++ allCards -- >>> fromHand x -- [H2_,H10,D10,C10,S10] -- >>> nOfKindDiscards x -- [H2_] nOfKindDiscards :: Hand -> DiscardList nOfKindDiscards hand = fromHand hand \\ allNOfKinds hand where -- | all Yaku -- -- >>> let Just (x) = toHand $ take 5 $ (filter (\x -> (cardNumber x == 10)) $ allCards) ++ allCards -- >>> allNOfKinds x -- [H10,D10,C10,S10] allNOfKinds :: Hand -> [Card] allNOfKinds h = concat . concat $ catMaybes [nOfKindHint 2 h, nOfKindHint 3 h, nOfKindHint 4 h]