Warning! It seems that you are using Dodona within another webpage, so not everything may work properly. Let your teacher know so that he can solve the problem by adjusting a setting in the learning environment. In the meantime, you can click this link to open Dodona in a new window.
Warning! The page was not fully loaded, probably because of a network issue. It could be that not all functionalities work as expected. Please try reloading the page.
Snake
Sign in to test your solution.
{-
_________ __
/ _____/ ____ _____ | | __ ____
\_____ \ / \\__ \ | |/ // __ \
/ \ | \/ __ \| <\ ___/
/_______ /___| (____ /__|_ \\___ >
\/ \/ \/ \/ \/
--
-- Hint omzetten getallen:
-- https://wiki.haskell.org/Converting_numbers
--
-}
--
-- In deze opdacht maken we gebruik van de grafische
-- bibliotheek gloss. Om deze kunnen te gebruiken
-- moeten we deze eerst importeren (keyword import)
import Graphics.Gloss.Interface.Pure.Game
import Graphics.Gloss.Data.Picture
import Graphics.Gloss.Data.Bitmap
-- Om de appel te kunnen plaatsten moeten
-- we ook gebruik maken van een random nummer
-- generator
import System.Random
-- We beginnen met het definiëren van enkele
-- type synoniemen. Dit wilt zeggen dat we
-- een bepaald type een nieuwe naam geven
-- In dit geval geven we het type (Int,Int)
-- de naam Coordinaat en Richting.
type Coordinaat = (Int,Int)
type Richting = (Int,Int)
-- Daarna definiëren we de data om de slang voor te stellen
-- In deze opdracht moet je zelf nog geen data definities maken
-- maar je moet deze wel reeds kunnen lezen.
--
-- De slang zelf stellen we voor als een lijst van coordinaten
--
type Slang = [Coordinaat]
-- We moeten bijhouden of de slang levend of dood is
-- Hiervoor maken we het Status datatype
data Status = Levend | Dood
deriving (Show)
--
-- Een appel is een coordinaat samen
-- met een random generator om de volgende
-- positie te genereren
--
type Appel = (Coordinaat,StdGen)
-- Tenslotte maken we een datatype Wereld dat
-- alle informatie bevat van het snake spel
-- 1) De slang
-- 2) De richting waarin de slang beweegt
-- 3) De tijd sinds de laatste update
-- 4) Is de slang levend of dood
-- 5) Plaats van de appel
--
-- Merk op dat hier twee definities voor "Wereld" gegeven worden
-- De definitie links geeft aan dat "Wereld" een nieuw type is
-- De definitie rechts geeft aan dat Wereld een constructor is
-- voor het type Wereld.
--
data Wereld = Wereld Slang Richting Float Status Appel
deriving (Show)
{- Hieronder definiëren we een aantal constanten -}
-- We stellen een richting voor door aan te duiden
-- hoeveel vakjes er in de x en y richting moet
-- bewogen worden (dx,dy).
--
-- Hint: het assenstelsel van de gridwereld kan je
-- terugvinden in de opgave.
--
-- (* Moeilijkheid 1 *)
links :: Richting
links = undefined
rechts :: Richting
rechts = undefined
boven :: Richting
boven = undefined
onder :: Richting
onder = undefined
-- Constanten voor de grootte van het bord
breedte :: Int
breedte = 64
hoogte :: Int
hoogte = 64
-- Geeft de schaal aan waarop elk vakje op het
-- scherm getekend zal worden 10x10
schaal :: Int
schaal = 10
-- Achtergrondkleur: R G B A
nokia = makeColor (119/255) (121/255) (100/255) 1
-- Begin positie van de slang
startSlang :: Slang
startSlang = [(breedte `div` 2,hoogte `div` 2)]
seed :: Int
seed = 42
-- Begin wereld
startWereld :: Wereld
startWereld = Wereld startSlang
rechts
0
Levend
((breedte `div` 3,hoogte `div` 3),mkStdGen seed)
--
-- Het gloss venster om het spel te tekenen
--
venster :: Display
venster = InWindow "UGent Functioneel Programmeren Opdracht 1"
(breedte *schaal, schaal * hoogte)
(0,0)
-- inBox is een functie die een coordinaat neemt
-- en een boolean teruggeeft die aangeeft of deze coordinaat
-- binnen het bord valt
-- (* Moeilijkheid 1 *)
inBox :: Coordinaat -> Bool
inBox (x,y) = undefined
-- Verleng een lijst gegeven de
-- richting waarin de slang moet bewegen
-- (* Moeilijkheid 1 *)
verleng :: Slang -> Richting -> Slang
verleng = undefined
-- Beweeg de slang voorgesteld als een lijst van coordinaten
-- in de gegeven richting
-- Maak *geen* gebruik van pattern matching
-- (* Moeilijkheid 2 *)
beweeg :: Slang -> Richting -> Slang
beweeg = undefined
-- Gegeven een lijst van coordinaten die de slang voorstelt
-- en een andere coordinaat geef aan of deze coordinaant "botst"
-- met de slang
-- (* Moeilijkheid 1 *)
botsingP :: [Coordinaat] -> Coordinaat -> Bool
botsingP = undefined
--
-- Een Picture die een enkel vakje op het scherm
-- voorstelt
--
-- Maak gebruik van rectangleSolid om een
-- vierkant van 10x10 te maken.
--
-- Herinnering: Geen hard gecodeerde constanten.
-- (* Moeilijkheid 2*)
vakje :: Picture
vakje = undefined
-- Elk vakje op het bord stellen we voor door een coordinaat
-- Deze functie coordNaarFiguur zet een coordinaat om naar een
-- "Picture". Pictures zijn de datatypes die door de gloss
-- bibliotheek getekend kunnen worden.
--
-- Om deze functie te schrijven moet je eerst de documentatie
-- van gloss lezen. Meer informatie over gloss kan je ook vragen
-- tijdens het werkcollege.
-- http://hackage.haskell.org/package/gloss
--
-- Hint: Maak gebruik van "vakje" en "translate"
-- Zie ook opgave voor uitleg van het assenstelsel
--
-- (* moeilijkheid 3 *)
coordNaarFiguur :: Coordinaat -> Picture
coordNaarFiguur = undefined
-- coordsNaarFiguur zet een lijst van coordinaten om
-- naar een lijst van figuren ("Pictures")
--
-- (* Moeilijkheid 2 *)
-- Hint: dit kan je makkelijk op één lijn
--
coordsNaarFiguur :: [Coordinaat] -> [Picture]
coordsNaarFiguur = undefined
-- Nokia snake achtergrond
box = Color nokia (rectangleSolid schaalb schaalh)
where schaalb = fromIntegral (schaal * breedte)
schaalh = fromIntegral (schaal * hoogte)
-- Zet een wereld om naar een figuur
maakFiguren :: Wereld -> Picture
maakFiguren = undefined
-- Botsing zet een wereld om naar een nieuwe wereld
-- maar kijk na of de slang niet met zichzelf botst
-- en binnen het speelveld blijft.
-- (* Moeilijkhed 2 *)
-- Hint: Maak gebruik van guards
botsing :: Wereld -> Wereld
botsing = undefined
--
-- Genereer de volgende appel
--
-- (* Moeilijkheid 3 *)
volgendeAppel :: Appel -> Appel
volgendeAppel = undefined
--
-- Kijk na of de slang en de appel botsen met elkaar
-- als ze botsen genereer de volgende appel
--
-- (* Moeilijkheid 2 *)
botsAppel :: Slang -> Appel -> Appel
botsAppel = undefined
--
-- Neem 1 stap
-- Beweeg de slang bij elke oproep
-- en verleng de slang na 1 seconde.
-- (* Moeilijkheid 3 *)
stap :: Float -> Wereld -> Wereld
stap = undefined
--
-- Hulpfunctie die nagaat of een Event
-- een bepaalde key down event is
-- Bijvoorbeeld:
-- isKey KeyUP (EventKey (SpecialKey KeyUp) Down _ _ ) = True
--
isKey k1 (EventKey (SpecialKey k2) Down _ _ ) = k1 == k2
isKey _ _ = False
-- Vervolledig verwerk invoer zodat:
-- 1) de slang beweegt door op de pijltjes toetsen in te drukken
-- 2) dat het spel herbegint indien de speler dood is en op enter duwt.
-- Hint: Maak gebruik van guards en isKey
--
-- (* Moeilijkheidsgraad 2 *)
--
verwerkInvoer :: Event -> Wereld -> Wereld
verwerkInvoer = undefined
--
-- Start van het spel
--
main :: IO ()
main = play venster white
60 startWereld
maakFiguren verwerkInvoer
stap