diff --git a/src/Main.hs b/src/Main.hs index a69b8a5..ba12a28 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -38,11 +38,11 @@ data Board = Board { -- Aantal kaarten op de x-as. width :: Int -width = 3 +width = 4 -- Aantal kaarten op de y-as. height :: Int -height = 3 +height = 4 -- De grootte van een kaart. scaling :: Int @@ -119,14 +119,12 @@ generateColors n = map (generateColor.fromIntegral.(div 360 n *)) [1..n] -- Genereer een lijst van n kaarten (n/2 kleurenparen). generateShuffledCards :: Int -> [Card] -- TODO Dit moet nog verder uitgeklaard worden !! --- TODO Hoe bepalen we de coördinaten van de kaarten? -generateShuffledCards n = map (\(x,y) -> (x,y,Hidden)) $ zip (zip [1..n] [1..n]) colors - where colors = shuffleList $ colorsOnce ++ colorsOnce - colorsOnce = generateColors (n `div` 2) +generateShuffledCards n = map (\(x,y) -> (x,y,Hidden)) $ zip (genCoords n) colors + where colors = shuffleList $ colorsOnce ++ colorsOnce + colorsOnce = generateColors (n `div` 2) + genCoords n = take n [ (x,y) | x <- [0..(width - 1)], y <- [0..(height - 1)] ] -- Controleer of een positie op het spelbord een kaart bevat. --- Om de kaarten van het huidige speelbord op te vragen, gebruik --- 'cards initBoard' hasCard :: Coordinate -> Bool hasCard c0 = any ((c0 ==).firstOfThree) $ cards initBoard @@ -136,12 +134,11 @@ canMove :: Coordinate -> Direction -> Bool canMove (w, h) (dw, dh) = hasCard $ (w + dw, h + dh) -- Beweeg de selector in een gegeven richting. --- TODO unfinished move :: Board -> Direction -> Board move board (dw, dh) - | canMove (selector board) (dw, dh) = newBoard --- where newBoard = (cards board, turned board, selector board) :: Board - where newBoard = initBoard + | canMove (selector board) (dw, dh) = board { selector = new } + | otherwise = board + where new = (\(w,h) -> (dw + w, dh + h)) $ selector board -- Verander de status van een kaart op een gegeven positie -- wanneer de posities overeenkomen. @@ -176,13 +173,11 @@ flipCard target board -- Reset de laatste omgedraaide kaarten terug naar de `Hidden` status. resetTurned :: Board -> Board -resetTurned board - | turned board == [] = board - | otherwise = resetTurned board { - cards = hideCard target (cards board) - , turned = tail $ turned board +resetTurned board@Board{ turned = [] } = board +resetTurned board@Board{ turned = x:xs } = resetTurned board { + cards = hideCard (firstOfThree x) (cards board) + , turned = xs } - where target = (firstOfThree) $ head $ turned board -- Bereken het volgende bord op basis van de omgedraaide kaarten. -- Hint: We hebben de drie gevallen voor deze functie al voorzien. @@ -190,7 +185,10 @@ resetTurned board nextBoard :: Board -> Board nextBoard b@Board{ turned = [] } = flipCard (selector b) b nextBoard b@Board{ turned = [c1] } = flipCard (selector b) b -nextBoard b@Board{ turned = [c1, c2] } = resetTurned b +nextBoard b@Board{ turned = [c1, c2] } + | secondOfThree c1 == secondOfThree c2 = b { turned = [] } -- Paar gevonden + | otherwise = resetTurned b + where secondOfThree (_,x,_) = x -- Zet een positie op het bord om naar een positie op het scherm. -- Hint: hou zeker rekening met het coordinatensysteem van Gloss. @@ -203,19 +201,22 @@ convert location axis = car + inset inset = fromIntegral ((-(axis `div` 2) + location) * cardInset) -- Render een vierkant met een gegeven kleur en grootte. --- TODO Klopt deze functionaliteit? renderColoredSquare :: Int -> Color -> Picture renderColoredSquare size c = color c $ rectangleSolid x x where x = fromIntegral size -- Render de selector. --- TODO unfinished +-- TODO Fix marges renderSelector :: Coordinate -> Picture -renderSelector coord = blank +renderSelector (x,y) = translate (convert x width + inset) (convert y height + inset) $ renderColoredSquare (scaling + cardInset) black + where inset = fromIntegral cardInset / fromIntegral 2 -- Render een kaart. renderCard :: Card -> Picture -renderCard ((x,y),color,status) = translate (convert x width) (convert y height) $ renderColoredSquare scaling color +renderCard ((x,y),color,status) + | status == Shown = render color + | otherwise = render $ greyN 0.2 -- Niet-omgedraaid + where render = translate (convert x width) (convert y height).renderColoredSquare scaling -- Render alle kaarten. renderCards :: [Card] -> Picture @@ -224,8 +225,8 @@ renderCards = pictures . map renderCard -- Render het speelveld. render :: Board -> Picture render board = pictures [ - renderCards $ cards board - , renderSelector $ selector board + renderSelector $ selector board -- Render de selector eerst zodat het op een kader lijkt. + , renderCards $ cards board ] -- Hulpfunctie die nagaat of een bepaalde toets is ingedrukt. @@ -237,7 +238,13 @@ isKey _ _ = False -- Hint: Je kan gebruikmaken van de isKey hulpfunctie. -- TODO unfinished handleInput :: Event -> Board -> Board -handleInput ev board = board +handleInput ev board + | isKey KeySpace ev || isKey KeyEnter ev = nextBoard board + | isKey KeyUp ev = move board up + | isKey KeyDown ev = move board down + | isKey KeyLeft ev = move board left + | isKey KeyRight ev = move board right + | otherwise = board -- Startpunt main :: IO ()