From ea965305111a616e98cc3ad6ec111437c0fb5c71 Mon Sep 17 00:00:00 2001 From: Sasha Date: Sun, 4 Feb 2018 22:06:07 +0100 Subject: [PATCH] Initial state generation --- CCard.hs | 12 +++++++++--- KoiKoi.hs | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/CCard.hs b/CCard.hs index 01b369b..4e6cee2 100644 --- a/CCard.hs +++ b/CCard.hs @@ -1,7 +1,7 @@ module CCard where import Data.Word (Word64) -import Data.Bits (setBit, shift, testBit) +import Data.Bits (clearBit, testBit, setBit, Bits) import System.Random (randomRIO) data Flower = @@ -42,11 +42,17 @@ type Pack = Word64 packOfCards :: [Card] -> Pack packOfCards = foldl setBit 0 . map fromEnum +port :: (Bits a, Enum e) => (a -> Int -> b) -> a -> e -> b +port f bits = f bits . fromEnum + contains :: Pack -> Card -> Bool -contains pack = testBit pack . fromEnum +contains = port testBit add :: Pack -> Card -> Pack -add pack = setBit pack . fromEnum +add = port setBit + +remove :: Pack -> Card -> Pack +remove = port clearBit pair :: Card -> Card -> Bool pair card1 card2 = flower card1 == flower card2 diff --git a/KoiKoi.hs b/KoiKoi.hs index 3618ead..9e72ff7 100644 --- a/KoiKoi.hs +++ b/KoiKoi.hs @@ -98,3 +98,22 @@ capture (State {month}) card pack = let newPack = add pack card in let yakuFinders = (unionWith (++) yakus . index $ tsukiFuda month) ! card in (newPack, foldl (\score -> foldr (uncurry insert) score . ($newPack)) empty yakuFinders) + +foldApply :: [[a] -> ([a], [a])] -> [[a]] -> [[a]] +foldApply [] init = init +foldApply (f:fs) [x] = + let (a,b) = f x in a : foldApply fs [b] + +deal :: IO State +deal = do + shuffled <- shuffle cards + let [hand1,hand2,river,deck] = foldApply (take 3 . repeat $ splitAt 8) [shuffled] + let p1 = Player {hand = packOfCards hand1, captured = packOfCards [], scored = empty} + let p2 = Player {hand = packOfCards hand2, captured = packOfCards [], scored = empty} + return $ State { + players = (p1, p2) + , river = packOfCards river + , deck + , month = Pine + , turn = False + }