ポーカー遊び完結編

前回のコードに加え、リストをシャッフルする汎用関数(トランプデッキにも適用可能)などを実装しました。デッキを人数分に分けるdistributeも作りました。

randompick [] = return Nothing
randompick xs = do
                x <- randomRIO (0,length xs - 1) :: IO Int
                return (Just (xs !! x))
fromJust (Just a) = a
pickcard deck = do
                x <- randompick deck
                if x /= Nothing then return (x,delete (fromJust x) deck)
                                else return (Nothing,[])
shuffle deck = do
               (card,d) <- pickcard deck
               if card /= Nothing then
                do
                  f <- shuffle d
                  return ((fromJust card):f)
                  else return []
addone [] _ = []
addone [[]] (d:deck) =  [[d]]
addone (x:xs) [] = (x:xs)
addone (x:xs) (d:deck)  = (d:x):(addone xs deck)

distribute n deck = let s = replicate n []
                        distribi l [] = l
                        distribi l deck = let xs = addone l deck
                                          in
                                          distribi xs (drop n deck)
                    in
                    distribi s deck
draw deck 0 = []
draw (x:xs) n = x:(draw xs (n-1))
prepeat p n = do
     x <- shuffle deck
     let d = suitsort (draw x 5)
         (PR s _) = culcPrize d
     if s == p then do print p
                       print d
                       print n
               else prepeat p (n+1)

ポーカーをこれでちょっと遊べて満足したので、ひとまずはこれでおしまいにします。