From 1e8dc00daef3f77929959a944bb5e4ad4ac4e6b5 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Mon, 17 Oct 2022 22:22:34 +0200 Subject: [PATCH] Refactoring: the sequel --- src/Main.hs | 75 +++++++++++++++++++---------------------------------- 1 file changed, 27 insertions(+), 48 deletions(-) diff --git a/src/Main.hs b/src/Main.hs index 65f33d4..1a322ff 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -8,17 +8,8 @@ import Data.Fixed (mod') -- ****************************************************************** -- * Opmerkingen: * --- * 1. * -- * Ik heb bij sommige functies de argumenten aangepast zodat ik * -- * aan pattern matching zou kunnen doen. * --- * 2. * --- * Ik heb de functie isKey hernoemd naar isSpecialKey en ik heb * --- * een extra functie isKey aangemaakt zodat ik ook andere letters * --- * van het toetsenbord als input kan gebruiken. * --- * 3. * --- * Ik heb een functie cardCoord geschreven om niet steeds een * --- * te moeten gebruiken als ik een coördinaat van een kaart wil * --- * opvragen. -- ****************************************************************** -- Geeft de richting van een zet aan. @@ -112,7 +103,8 @@ match (_, c1, _) (_, c2, _) = c1 == c2 -- Wanneer een kaart gevonden is, wordt deze teruggegeven. Anders wordt -- een error teruggegeven. find :: Coordinate -> [Card] -> Card -find coord = head.filter ((coord ==).cardCoord) +find coord = head . filter eqCoord + where eqCoord (c0, _, _) = c0 == coord -- Geef een permutatie van een gegeven lijst terug. -- Hint: Kijk zeker eens naar de System.Random en @@ -123,18 +115,21 @@ shuffleList l = shuffle' l (length l) (mkStdGen seed) -- Genereer een lijst met n verschillende kleuren. -- Hint: Je kan gebruikmaken van de generateColor-functie. generateColors :: Int -> [Color] -generateColors n = map (generateColor.fromIntegral.(div 360 n *)) [1..n] +generateColors n = map (generateColor . step . fromIntegral) [1..n] + where step x = 360.0 / (fromIntegral n) * x -- Genereer een lijst van n kaarten (n/2 kleurenparen). generateShuffledCards :: Int -> [Card] -generateShuffledCards n = zipWith (\x y -> (x,y,Hidden)) (genCoords n) colors +generateShuffledCards n = zipWith makeHiddenCard (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)]] + makeHiddenCard coord color = (coord, color, Hidden) -- Controleer of een positie op het spelbord een kaart bevat. hasCard :: Coordinate -> Bool -hasCard coord = any ((coord ==).cardCoord) $ cards initBoard +hasCard coord = any eqCoord $ cards initBoard + where eqCoord (c0, _, _) = c0 == coord -- Controleer of de selector vanaf een gegeven locatie in een -- gegeven richting kan bewegen. @@ -144,9 +139,10 @@ canMove (w, h) (wDiff, hDiff) = hasCard (w + wDiff, h + hDiff) -- Beweeg de selector in een gegeven richting. move :: Board -> Direction -> Board move board (wDiff, hDiff) - | canMove (selector board) (wDiff, hDiff) = board {selector = new} + | canMove (selector board) (wDiff, hDiff) = board {selector = newSelector} | otherwise = board - where new = (\(w,h) -> (w + wDiff, h + hDiff)) $ selector board + where newSelector = calcSelector $ selector board + calcSelector (w, h) = (w + wDiff, h + hDiff) -- Verander de status van een kaart op een gegeven positie -- wanneer de posities overeenkomen. @@ -179,7 +175,9 @@ flipCard target board } where targetEq (coord,_,status) = (coord,status) == (target,Shown) newCards = showCard target $ cards board - flipped = filter ((target ==).cardCoord) newCards + flipped = filter eqCoord newCards + eqCoord (coord, _, _) = target == coord + cardCoord (a,_,_) = a -- Reset de laatste omgedraaide kaarten terug naar de `Hidden` status. resetTurned :: Board -> Board @@ -188,6 +186,7 @@ resetTurned board@Board{ turned = x:xs } = resetTurned board { cards = hideCard (cardCoord x) (cards board) , turned = xs } + where cardCoord (a,_,_) = a -- Bereken het volgende bord op basis van de omgedraaide kaarten. -- Hint: We hebben de drie gevallen voor deze functie al voorzien. @@ -217,15 +216,16 @@ renderColoredSquare size c = color c $ rectangleSolid fSize fSize -- Render de selector. renderSelector :: Coordinate -> Picture -renderSelector (x,y) = translate (convert x width) (convert y height) - $ renderColoredSquare (scaling + cardInset) red +renderSelector (x,y) = convTrans $ renderColoredSquare (scaling + cardInset) red + where convTrans = translate (convert x width) (convert y height) -- Render een kaart. renderCard :: Card -> Picture 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 + where render = convTrans . renderColoredSquare scaling + convTrans = translate (convert x width) (convert y height) -- Render alle kaarten. renderCards :: [Card] -> Picture @@ -239,35 +239,19 @@ render board = pictures [ ] -- Hulpfunctie die nagaat of een bepaalde speciale toets is ingedrukt. -isSpecialKey :: SpecialKey -> Event -> Bool -isSpecialKey k1 (EventKey (SpecialKey k2) Down _ _) = k1 == k2 -isSpecialKey _ _ = False - --- Hulpfunctie die nagaat of een bepaalde normale toets is ingedrukt. -isKey :: Char -> Event -> Bool -isKey k1 (EventKey (Char k2) Down _ _) = k1 == k2 -isKey _ _ = False +isKey :: SpecialKey -> Event -> Bool +isKey k1 (EventKey (SpecialKey k2) Down _ _) = k1 == k2 +isKey _ _ = False -- Handel alle toetsaanslagen af. -- Hint: Je kan gebruikmaken van de isKey hulpfunctie. handleInput :: Event -> Board -> Board handleInput ev board - | isSpecialKey KeySpace ev || isSpecialKey KeyEnter ev = nextBoard board - -- Pijltjes voor de doorsnee gebruikers - | isSpecialKey KeyUp ev = move board up - | isSpecialKey KeyDown ev = move board down - | isSpecialKey KeyLeft ev = move board left - | isSpecialKey KeyRight ev = move board right - -- WASD voor de gamers - | isKey 'w' ev = move board up - | isKey 's' ev = move board down - | isKey 'a' ev = move board left - | isKey 'd' ev = move board right - -- Vim keybinds voor de nerds - | isKey 'k' ev = move board up - | isKey 'j' ev = move board down - | isKey 'h' ev = move board left - | isKey 'l' ev = move board right + | 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 @@ -308,8 +292,3 @@ generateColor hue = makeColor r g b 1 -- Update het bord in elke stap. step :: Float -> Board -> Board step _ b = b - --- Haal het eerste element uit een drietupel, bijvoorbeeld om de --- coördinaten uit een kaart-object te halen. -cardCoord :: (a,b,c) -> a -cardCoord (a,_,_) = a