Remove unused and broken modules
This commit is contained in:
parent
6dbd72cf36
commit
c2a324b905
2 changed files with 0 additions and 229 deletions
38
Game.hs
38
Game.hs
|
@ -1,38 +0,0 @@
|
|||
module Game where
|
||||
|
||||
import Card
|
||||
|
||||
data Yaku =
|
||||
Junk Int
|
||||
| Ribbons Int
|
||||
| SpecialRibbons Int
|
||||
| Animals Int
|
||||
| InoShikaCho
|
||||
| Sake Int
|
||||
| Lights Int
|
||||
|
||||
data Taken = Taken {
|
||||
junk :: [ Flower ]
|
||||
, animals :: [ Animal ]
|
||||
, ribbons :: [ Ribbon ]
|
||||
, lights :: [ Light ]
|
||||
}
|
||||
|
||||
data Player = Player {
|
||||
hand :: [ Card ]
|
||||
, taken :: Taken
|
||||
}
|
||||
|
||||
score :: Yaku -> Int
|
||||
score (Junk n) = 1 + n
|
||||
score (Ribbons n) = 1 + n
|
||||
score (SpecialRibbons 0) = 3
|
||||
score (SpecialRibbons _) = 9
|
||||
score (Animals n) = 1 + n
|
||||
score InoShikaCho = 5
|
||||
score (Sake 0) = 5
|
||||
score (Sake _) = 15
|
||||
score (Lights 0) = 5
|
||||
score (Lights 1) = 8
|
||||
score (Lights 2) = 10
|
||||
score (Lights 3) = 15
|
191
KoiKoi.hs
191
KoiKoi.hs
|
@ -1,191 +0,0 @@
|
|||
{-# LANGUAGE NamedFieldPuns #-}
|
||||
module KoiKoi where
|
||||
|
||||
import CCard
|
||||
import Data.Bits (popCount, (.|.), (.&.))
|
||||
import Data.Map (Map, adjust, empty, fromList, insert, unionWith, (!))
|
||||
|
||||
data Yaku =
|
||||
Goko
|
||||
| Shiko
|
||||
| AmeShiko
|
||||
| Sanko
|
||||
| InoShikaCho
|
||||
| Tane
|
||||
| Akatan
|
||||
| Aotan
|
||||
| Tan
|
||||
| Kasu
|
||||
| TsukimiZake
|
||||
| HanamiZake
|
||||
| TsukiFuda
|
||||
deriving (Eq, Ord, Show)
|
||||
type Points = Int
|
||||
type YakuFinder = Pack -> Maybe (Yaku, Points)
|
||||
type Score = Map Yaku Points
|
||||
|
||||
data Player = Player {
|
||||
hand :: Pack
|
||||
, captured :: Pack
|
||||
, scored :: Score
|
||||
} deriving (Show)
|
||||
|
||||
data Turn = Player1 | Player2 deriving (Eq, Ord, Show)
|
||||
|
||||
switch :: Turn -> Turn
|
||||
switch Player1 = Player2
|
||||
switch _ = Player1
|
||||
|
||||
data Step = PlayACard | ChooseWhichCard Card | Scored deriving (Show)
|
||||
|
||||
data Game = Game {
|
||||
players :: Map Turn Player
|
||||
, river :: Pack
|
||||
, deck :: [ Card ]
|
||||
, turn :: Turn
|
||||
, month :: Flower
|
||||
, step :: Step
|
||||
} | Over {
|
||||
winner :: Turn
|
||||
} deriving (Show)
|
||||
|
||||
data Move = Drop Card | Take (Card, Card) | Choose Card | KoiKoi Bool
|
||||
|
||||
fixed :: (Yaku, Points) -> Pack -> YakuFinder
|
||||
fixed points indicatorSet pack = if pack == indicatorSet then Just points else Nothing
|
||||
|
||||
moreThan :: Int -> Yaku -> (Pack -> YakuFinder)
|
||||
moreThan count yaku _ =
|
||||
(\n -> if n > 0 then Just (yaku, n) else Nothing) . ($count) . (-) . popCount
|
||||
|
||||
lights :: [Card]
|
||||
lights = [Crane, CampCurtain, FullMoon, RainMan, Phoenix]
|
||||
|
||||
hikari :: Pack -> YakuFinder
|
||||
hikari _ pack = rate (popCount pack) (pack `contains` RainMan)
|
||||
where
|
||||
rate 5 _ = Just (Goko, 10)
|
||||
rate 4 hasRainMan = if hasRainMan then Just (AmeShiko, 7) else Just (Shiko, 8)
|
||||
rate n hasRainMan = if not hasRainMan && n > 2 then Just (Sanko, 5) else Nothing
|
||||
|
||||
tsukiFuda :: Flower -> ([Card], Pack -> YakuFinder)
|
||||
tsukiFuda flower = (map toEnum $ map (fromEnum flower * 4 +) [0..3], fixed (TsukiFuda, 8))
|
||||
|
||||
index :: ([Card], Pack -> YakuFinder) -> Map Card [YakuFinder]
|
||||
index (cards, scorer) =
|
||||
let pack = packOfCards cards in
|
||||
foldl (\map card -> insert card [scorer pack . (.&.) pack] map) empty cards
|
||||
|
||||
inoshikacho :: [Card]
|
||||
inoshikacho = [Butterflies, Boar, Deer]
|
||||
|
||||
animals :: [Card]
|
||||
animals = [BushWarbler, Cuckoo, EightPlankBridge, Geese, SakeCup, Swallow] ++ inoshikacho
|
||||
|
||||
blue :: [Card]
|
||||
blue = [PeonyBlue, ChrysanthemumBlue, MapleBlue]
|
||||
|
||||
poetry :: [Card]
|
||||
poetry = [PinePoetry, PlumPoetry, CherryPoetry]
|
||||
|
||||
ribbons = [WisteriaRed, IrisRed, BushCloverRed, WillowRed] ++ blue ++ poetry
|
||||
|
||||
plain :: [Card]
|
||||
plain = (foldl (++) [] [map toEnum [4*i, 4*i+1] | i <- [0..10]]) ++ Lightning : [Paulownia0 .. Sand]
|
||||
|
||||
yakus :: Map Card [YakuFinder]
|
||||
yakus = foldl (\map -> unionWith (++) map . index) empty [
|
||||
(lights, hikari)
|
||||
, (inoshikacho, fixed (InoShikaCho, 5))
|
||||
, (animals, moreThan 4 Tane)
|
||||
, (poetry, fixed (Akatan, 5))
|
||||
, (blue, fixed (Aotan, 5))
|
||||
, (ribbons, moreThan 4 Tan)
|
||||
, (plain, moreThan 9 Kasu)
|
||||
, ([SakeCup, FullMoon], fixed (TsukimiZake, 5))
|
||||
, ([SakeCup, CampCurtain], fixed (HanamiZake, 5))
|
||||
]
|
||||
|
||||
capture :: Flower -> Pack -> [Card] -> (Score, Pack)
|
||||
capture month pack cards =
|
||||
let newPack = foldl add pack cards in
|
||||
let monthYakus = (unionWith (++) yakus . index $ tsukiFuda month) in
|
||||
let yakuFinders = foldl (\finders card -> monthYakus ! card ++ finders) [] cards in
|
||||
(foldl (\score -> foldr (uncurry insert) score . ($newPack)) empty yakuFinders, newPack)
|
||||
|
||||
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 Game
|
||||
deal = do
|
||||
shuffled <- shuffle cards
|
||||
let [hand1,hand2,river,deck] = foldApply (take 3 . repeat $ splitAt 8) [shuffled]
|
||||
let players = fromList [
|
||||
(Player1, Player {hand = packOfCards hand1, captured = packOfCards [], scored = empty})
|
||||
, (Player2, Player {hand = packOfCards hand2, captured = packOfCards [], scored = empty})
|
||||
]
|
||||
return $ Game {
|
||||
players
|
||||
, river = packOfCards river
|
||||
, deck
|
||||
, turn = Player1
|
||||
, month = Pine
|
||||
, step = PlayACard
|
||||
}
|
||||
|
||||
makeSure :: Bool -> String -> Either String ()
|
||||
makeSure check message = if check then return () else fail message
|
||||
|
||||
{-
|
||||
playACard :: Game -> Card -> Card -> Either String Game
|
||||
playACard (Game {players, river, month}) c1 c2 = do
|
||||
makeSure (hand `contains` c1) "You don't have that card"
|
||||
capture
|
||||
-}
|
||||
|
||||
turnOver :: Game -> Either String Game
|
||||
turnOver game@(Game { players, river, deck, turn, month, step }) =
|
||||
case deck of
|
||||
[] -> fail "Deck got empty"
|
||||
next : cards ->
|
||||
let game = game { deck = cards } in
|
||||
let canTake = sameMonth next .&. river in
|
||||
Right $ case popCount canTake of
|
||||
0 -> game { river = add river next }
|
||||
1 ->
|
||||
let current@(Player { captured, scored }) = players ! turn in
|
||||
let (score, newPack) = capture month captured (next:cardsOfPack canTake) in
|
||||
let game = game { players = insert turn (current { captured = newPack, scored = unionWith max scored score }) players } in
|
||||
if null score
|
||||
then game { step = PlayACard, turn = switch turn }
|
||||
else game { step = Scored }
|
||||
_ -> game { step = ChooseWhichCard next }
|
||||
|
||||
{-
|
||||
play :: Game -> Move -> Either String Game
|
||||
play game@(Game { players, river, deck, turn, month, step }) = playFrom step
|
||||
where
|
||||
playFrom PlayACard (Drop card) = do
|
||||
makeSure (month card .&. river == 0) "This card takes another one in the river"
|
||||
return $ game {
|
||||
player =
|
||||
river = add card river
|
||||
}
|
||||
playFrom PlayACard (Take (card1, card2)) = do
|
||||
makeSure (card1 `pair` card2) "Cards aren't from the same month"
|
||||
makeSure (river `contains` card2) "That card isn't in the river"
|
||||
let player = case turn of
|
||||
Player1 -> fst players
|
||||
_ -> snd players
|
||||
playACard player c1 c2
|
||||
|
||||
playFrom (ChooseWhichCard card1) (Choose card2) =
|
||||
makeSure (card1 `pair` card2) "Cards aren't from the same month"
|
||||
makeSure (river `contains` card2) "That card isn't in the river"
|
||||
|
||||
playFrom Scored (KoiKoi yes) =
|
||||
|
||||
playFrom _ _ = fail "Invalid move"
|
||||
-}
|
Loading…
Reference in a new issue