commit 9ccd5abe88149fe2d84c7c453596ecad97e48f78 Author: tibvdm Date: Mon Oct 10 21:10:20 2022 +0200 Initial commit diff --git a/memory.cabal b/memory.cabal new file mode 100644 index 0000000..fc40b4f --- /dev/null +++ b/memory.cabal @@ -0,0 +1,11 @@ +name: memory +version: 1.0.0 +author: Author name here +build-type: Simple +cabal-version: >=1.10 + +executable memory + hs-source-dirs: src + main-is: Main.hs + default-language: Haskell2010 + build-depends: base >= 4.7 && < 5, gloss >= 1.11 && < 1.14, random >= 1.1 && < 1.4, random-shuffle >= 0.0.4 diff --git a/src/Main.hs b/src/Main.hs new file mode 100644 index 0000000..87cb405 --- /dev/null +++ b/src/Main.hs @@ -0,0 +1,235 @@ +import Graphics.Gloss +import Graphics.Gloss.Interface.IO.Game + +import System.Random +import System.Random.Shuffle (shuffle') + +import Data.Fixed (mod') + +-- Geeft de richting van een zet aan. +type Direction = (Int, Int) + +-- De status van een kaart. Een kaart kan ofwel zijn kleur +-- tonen, ofwel zijn achterkant tonen. +data CardStatus = Hidden | Shown deriving(Show, Eq) + +-- Een positie op het speelveld. +type Coordinate = (Int, Int) + +-- Representatie van een kaart. Een kaart heeft een status, +-- een kleur en een positie. +type Card = (Coordinate, Color, CardStatus) + +-- Representatie van het speelveld. +data Board = Board { + -- Het speelveld is een lijst van kaarten. + cards :: [Card], + -- Hou de omgedraaide kaarten tijdens een beurt bij (maximaal 2). + turned :: [Card], + -- Hou de huidige geselecteerde kaart bij. + selector :: Coordinate +} + +-- Aantal kaarten op de x-as. +width :: Int +width = 3 + +-- Aantal kaarten op de y-as. +height :: Int +height = 3 + +-- De grootte van een kaart. +scaling :: Int +scaling = 150 + +-- De grootte van de ruimte tussen de kaarten. +cardInset :: Int +cardInset = 10 + +-- Initiele positie van het Gloss venster. +windowPosition :: (Int, Int) +windowPosition = (200, 200) + +-- Seed voor de random generator. +seed :: Int +seed = 45 + +-- Framerate van het spel. +fps :: Int +fps = 60 + +-- Bereken het aantal kaarten op het speelveld. +amountOfCards :: Int +amountOfCards | even n = n + | otherwise = n - 1 + where n = width * height + +-- Het Gloss venster +window :: Display +window = InWindow "Memory" (width * scaling, height * scaling) windowPosition + +-- Het initiele speelveld. +initBoard :: Board +initBoard = Board { + cards = generateShuffledCards amountOfCards, + turned = [], + selector = (0, 0) +} + +---------------------------------------------------------------------- +-- Vanaf hier zal het nodig zijn om de functies aan te vullen. +-- De functies die je moet aanvullen zijn steeds gemarkeerd met +-- undefined. +---------------------------------------------------------------------- + +-- De mogelijke richtingen van de selector. +left, right, up, down :: Direction +left = undefined +right = undefined +up = undefined +down = undefined + +-- Controleer of twee kaarten dezelfde kleur hebben. +match :: Card -> Card -> Bool +match card1 card2 = undefined + +-- Zoek een kaart binnen een lijst van kaarten op basis van een positie. +-- Wanneer een kaart gevonden is, wordt deze teruggegeven. Anders wordt +-- een error teruggegeven. +find :: Coordinate -> [Card] -> Card +find target cards = undefined + +-- Geef een permutatie van een gegeven lijst terug. +-- Hint: Kijk zeker eens naar de System.Random en +-- System.Random.Shuffle bibliotheken. +shuffleList :: [a] -> [a] +shuffleList l = undefined + +-- Genereer een lijst met n verschillende kleuren. +-- Hint: Je kan gebruikmaken van de generateColor-functie. +generateColors :: Int -> [Color] +generateColors n = undefined + +-- Genereer een lijst van n kaarten (n/2 kleurenparen). +generateShuffledCards :: Int -> [Card] +generateShuffledCards n = undefined + +-- Controleer of een positie op het spelbord een kaart bevat. +hasCard :: Coordinate -> Bool +hasCard (x, y) = undefined + +-- Controleer of de selector vanaf een gegeven locatie in een +-- gegeven richting kan bewegen. +canMove :: Coordinate -> Direction -> Bool +canMove coord direction = undefined + +-- Beweeg de selector in een gegeven richting. +move :: Board -> Direction -> Board +move board direction = undefined + +-- Verander de status van een kaart op een gegeven positie +-- wanneer de posities overeenkomen. +changeCard :: Coordinate -> CardStatus -> Card -> Card +changeCard c s card = undefined + +-- Verander de status van een enkele kaart in een reeks van +-- kaarten. Deze functie geeft een lijst terug waar de status +-- van de kaart is aangepast naar `Shown`. +showCard :: Coordinate -> [Card] -> [Card] +showCard target = undefined + +-- Verander de status van een enkele kaart in een reeks van +-- kaarten. Deze functie geeft een lijst terug waar de status +-- van de kaart is aangepast naar `Hidden`. +hideCard :: Coordinate -> [Card] -> [Card] +hideCard target = undefined + +-- Draai de kaart op een gegeven positie op het bord om +-- als deze nog niet eerder werd omgedraaid. +flipCard :: Coordinate -> Board -> Board +flipCard target board = undefined + +-- Reset de laatste omgedraaide kaarten terug naar de `Hidden` status. +resetTurned :: Board -> Board +resetTurned board = undefined + +-- Bereken het volgende bord op basis van de omgedraaide kaarten. +-- Hint: We hebben de drie gevallen voor deze functie al voorzien. +nextBoard :: Board -> Board +nextBoard b@Board{ turned = [] } = undefined +nextBoard b@Board{ turned = [c1] } = undefined +nextBoard b@Board{ turned = [c1, c2] } = undefined + +-- Zet een positie op het bord om naar een positie op het scherm. +-- Hint: hou zeker rekening met het coordinatensysteem van Gloss. +convert :: Int -> Int -> Float +convert location axis = undefined + +-- Render een vierkant met een gegeven kleur en grootte. +renderColoredSquare :: Int -> Color -> Picture +renderColoredSquare size c = undefined + +-- Render de selector. +renderSelector :: Coordinate -> Picture +renderSelector coord = undefined + +-- Render een kaart. +renderCard :: Card -> Picture +renderCard card = undefined + +-- Render alle kaarten. +renderCards :: [Card] -> Picture +renderCards = undefined + +-- Render het speelveld. +render :: Board -> Picture +render board = undefined + +-- Hulpfunctie die nagaat of een bepaalde toets is ingedrukt. +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 = undefined + +-- Startpunt +main :: IO () +main = play window white fps initBoard render handleInput step + +---------------------------------------------------------------------- +-- Hieronder staan een aantal hulpfuncties die je kan gebruiken. +---------------------------------------------------------------------- + +-- Representatie van een HSL-kleur. +type HSL = (Float, Float, Float) + +-- Representatie van een RGB-kleur. +type RGB = (Float, Float, Float) + +-- Omzetting van de HSL-kleurenruimte naar de RGB-kleurenruimte. +hslToRgb :: HSL -> RGB +hslToRgb (h, s, l) = (r + m, g + m, b + m) + where + h' = h / 60 + c = (1 - abs (2 * l - 1)) * s + x = c * (1 - abs (h' `mod'` 2 - 1)) + m = l - c / 2 + getRGB h | h < 1 = (c, x, 0) + | h < 2 = (x, c, 0) + | h < 3 = (0, c, x) + | h < 4 = (0, x, c) + | h < 5 = (x, 0, c) + | otherwise = (c, 0, x) + (r, g, b) = getRGB h' + +-- Genereer een kleur op basis van een hue-waarde [0 - 360]. +generateColor :: Float -> Color +generateColor hue = makeColor r g b 1 + where (r, g, b) = hslToRgb (hue, 0.5, 0.5) + +-- Update het bord in elke stap. +step :: Float -> Board -> Board +step _ b = b diff --git a/stack.yaml b/stack.yaml new file mode 100644 index 0000000..1b79e8e --- /dev/null +++ b/stack.yaml @@ -0,0 +1,67 @@ +# This file was automatically generated by 'stack init' +# +# Some commonly used options have been documented as comments in this file. +# For advanced use and comprehensive documentation of the format, please see: +# https://docs.haskellstack.org/en/stable/yaml_configuration/ + +# Resolver to choose a 'specific' stackage snapshot or a compiler version. +# A snapshot resolver dictates the compiler version and the set of packages +# to be used for project dependencies. For example: +# +# resolver: lts-3.5 +# resolver: nightly-2015-09-21 +# resolver: ghc-7.10.2 +# +# The location of a snapshot can be provided as a file or url. Stack assumes +# a snapshot provided as a file might change, whereas a url resource does not. +# +# resolver: ./custom-snapshot.yaml +# resolver: https://example.com/snapshots/2018-01-01.yaml +resolver: + url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/19/22.yaml + +# User packages to be built. +# Various formats can be used as shown in the example below. +# +# packages: +# - some-directory +# - https://example.com/foo/bar/baz-0.0.2.tar.gz +# subdirs: +# - auto-update +# - wai +packages: +- . +# Dependency packages to be pulled from upstream that are not in the resolver. +# These entries can reference officially published versions as well as +# forks / in-progress versions pinned to a git hash. For example: +# +# extra-deps: +# - acme-missiles-0.3 +# - git: https://github.com/commercialhaskell/stack.git +# commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a +# +# extra-deps: [] + +# Override default flag values for local packages and extra-deps +# flags: {} + +# Extra package databases containing global packages +# extra-package-dbs: [] + +# Control whether we use the GHC we find on the path +# system-ghc: true +# +# Require a specific version of stack, using version ranges +# require-stack-version: -any # Default +# require-stack-version: ">=2.7" +# +# Override the architecture used by stack, especially useful on Windows +# arch: i386 +# arch: x86_64 +# +# Extra directories used by stack for building +# extra-include-dirs: [/path/to/dir] +# extra-lib-dirs: [/path/to/dir] +# +# Allow a newer minor version of GHC than the snapshot specifies +# compiler-check: newer-minor