Refactoring: the sequel
This commit is contained in:
parent
f679c69395
commit
1e8dc00dae
1 changed files with 27 additions and 48 deletions
75
src/Main.hs
75
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
|
||||
|
|
Reference in a new issue