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