In dit deel van de opgave implementeren we de beweging van ons karakter binnen de wereld van Sokoban. Hiervoor hoeven we niets van de parsing te kennen, behalve ons gedeeld datatype World
. We hoeven hier dus ook geen IO
te gebruiken.
In onderstaande wereld kan ons karakter (@
) enkel naar boven en naar onder bewegen. Bij het naar onder bewegen zal het een doos verduwen. Naar links staat een muur in de weg en rechts bevinden zich twee dozen na elkaar. (De testen zijn exact deze vier bewegingen.)
###
# ####
#@oo #
#o####
#.#
###
Als dit deel en “Sokoban - parsing” af zijn, kan je beide combineren in 1 bestand tesamen met een deel code om de GUI te voorzien. Gebruik hiervoor de play
methode van Gloss:
play :: Display -- Het scherm waarop getekend wordt
-> Color -- De achtergrondkleur
-> Int -- Hoeveel FPS we willen berekenen
-> world -- de initiële wereld
-> (world -> Picture) -- de render functie
-> (Event -> world -> world) -- de event-handle functie
-> (Float -> world -> world) -- de time-handle functie
-> IO ()
Hierbij zijn:
world
, het type dat al onze data zal bevatten. Dit komt niet noodzakelijk overeen met ons eerder gedefiniëerde World
type; tenslotte willen we ook bijhouden wat de volgende levels zullen zijn…Graphics.Gloss.Data.Picture
die mee ingeladen wordt met Graphics.Gloss.Interface.Pure.Game
.EventKey
constructoren van belang, omdat ons spel met het toetsenbord bestuurd wordt:
KeyUp
, KeyDown
, …) om ons karakter te besturen;KeySpace
) om naar het volgende level te gaan (als het level compleet is) of om te herstarten met het huidige level (als het level nog niet opgelost is).Merk tenslotte nog op dat je met ESC gewoon Gloss kan afsluiten, en dat play
en main
hetzelfde returntype hebben.