module Board where import Debug.Trace import Pieces import Data.Array import Data.Char -- een pos bestaat ut 2 int data Pos = Pos Int Int deriving (Eq,Ord,Ix) -- een bord is een 2 d array van vakjes data Board = Bord (Array Pos Vakje) -- en situatie bevat een bord en een kleur data Situation = Sit Board Color -- maak een leeg bord emptyboard :: Board emptyboard = Bord (array (Pos 1 1 , Pos 8 8)[ (Pos i j, Empty) |i<-[1..8], j <- [1..8] ]) -- maak een lege situatie emptysit :: Situation emptysit = Sit emptyboard White -- laat een regel zien showregel :: Board -> Int ->Int-> String showregel b@(Bord a) regelnr posx= if posx <9 then show (a!(Pos regelnr posx)) ++ " " ++ showregel b regelnr (posx+1) else [] -- laat het bord zien met de buiten kan t en voeg daar he bord in. instance Show Board where show bord = " a b c d e f g h \n" ++ " +-----------------+ \n" ++ "1 | "++ showregel bord 1 1 ++ "| 1 \n" ++ "2 | "++ showregel bord 2 1 ++ "| 2 \n" ++ "3 | "++ showregel bord 3 1 ++ "| 3 \n" ++ "4 | "++ showregel bord 4 1 ++ "| 4 \n" ++ "5 | "++ showregel bord 5 1 ++ "| 5 \n" ++ "6 | "++ showregel bord 6 1 ++ "| 6 \n" ++ "7 | "++ showregel bord 7 1 ++ "| 7 \n" ++ "8 | "++ showregel bord 8 1 ++ "| 8 \n" ++ " +-----------------+ \n"++ " a b c d e f g h \n" -- laat de situatie zien instance Show Situation where show (Sit bord player) = "Next Player: " ++ if player == White then "White \n \n" ++ show bord else "Black \n \n" ++ show bord -- maak regels van een hele lap text linemaker :: String -> [String] linemaker str = lines str -- laat een kleur zien instance Show Color where show White = "White" show Black = "Black" --laat een positie zien instance Show Pos where show (Pos a b) = (chr(b+96) : show a) -- maak een klasse parse aan class Show a => Parse a where parse :: String -> a -- lees van de inputstring de kleur uit instance Parse Color where parse str = if str == "Next player: white\n" then White else Black -- lees van de hele inputstring de heel situatie uit instance Parse Situation where parse str = Sit (parse (reLines(take 8(drop 4 (lines str))))) (parse (reLines(take 1 (lines str)))) -- maakt van losse regels weer een lap text reLines :: [String] -> String reLines (a:b) = a ++ "\n" ++ reLines b reLines [] = [] -- kijk welke kleur en stuk het is van een char instance Parse Vakje where parse (x:_) = case toLower x of 'p' -> Vak color Pawn 'q' -> Vak color Queen 'b' -> Vak color Bishop 'k' -> Vak color King 'r' -> Vak color Rook 'n' -> Vak color Knight ' ' -> Empty where color = if isUpper x then Black else White -- parst een regel regelparser :: String -> [Vakje] regelparser str= map parse (onsfilter(take 15 (drop 4 str))) -- filter aller tussen liggende spaties eruit. onsfilter :: String -> [String] onsfilter (a:b:c) = [a] : onsfilter c onsfilter (c:_) = [[c]] onsfilter [] = [[]] -- vul de board array instance Parse Board where parse str = Bord (array (Pos 1 1 , Pos 8 8) [ (Pos x y, vak) | y <- [1..8], x <- [1..8], let vak = (vakjes !! (x-1)) !! (y-1)]) where vakjes = map regelparser (lines str)