Opgepast! Het lijkt erop dat je Dodona gebruikt binnen een andere webpagina waardoor mogelijk niet alles goed werkt. Laat dit weten aan je lesgever zodat hij het probleem kan oplossen door een instelling in de leeromgeving aan te passen. Ondertussen kan je op deze link klikken om Dodona te openen in een nieuw venster.
Snake
Log in om je oplossingen te testen.
{-
_________ __
/ _____/ ____ _____ | | __ ____
\_____ \ / \\__ \ | |/ // __ \
/ \ | \/ __ \| <\ ___/
/_______ /___| (____ /__|_ \\___ >
\/ \/ \/ \/ \/
--
-- 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
Je kunt zo vaak indienen als je wenst. Er wordt enkel rekening gehouden met je laatst ingediende oplossing.
Log in om je oplossingen te testen.