1
Fork 0

Navigatie en rendering

Hele boel functies
This commit is contained in:
Tibo De Peuter 2022-10-15 23:29:29 +02:00
parent 7efc16fabc
commit 3d0b85b995

View file

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