Navigatie en rendering
Hele boel functies
This commit is contained in:
parent
7efc16fabc
commit
3d0b85b995
1 changed files with 33 additions and 26 deletions
59
src/Main.hs
59
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 ()
|
||||
|
|
Reference in a new issue