Initial commit
This commit is contained in:
commit
9ccd5abe88
3 changed files with 313 additions and 0 deletions
11
memory.cabal
Normal file
11
memory.cabal
Normal file
|
@ -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
|
235
src/Main.hs
Normal file
235
src/Main.hs
Normal file
|
@ -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
|
67
stack.yaml
Normal file
67
stack.yaml
Normal file
|
@ -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
|
Reference in a new issue