1
Fork 0

Refactoring: the sequel

This commit is contained in:
Tibo De Peuter 2022-10-17 22:22:34 +02:00
parent f679c69395
commit 1e8dc00dae

View file

@ -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