Uitwerkingen aanvullende toets Gameprogrammeren (INFOB1GP) Vrijdag 4 januari 2013, uur

Vergelijkbare documenten
Aanvullende toets Gameprogrammeren (INFOB1GP) Vrijdag 4 januari 2013, uur

Aanvullende toets Gameprogrammeren (INFOB1GP) Vrijdag 3 januari 2014, uur

Derde deeltentamen Gameprogrammeren Vrijdag 8 november 2013, uur

Derde deeltentamen Gameprogrammeren Vrijdag 7 november 2014, uur

Derde deeltentamen Gameprogrammeren Vrijdag 9 november 2012, uur

Tweede deeltentamen Gameprogrammeren Vrijdag 17 oktober 2014, uur

Veel succes! 1. Deze opgave bestaat uit een aantal vragen. Houd het antwoord kort: één of twee zinnen per onderdeel kan al genoeg zijn.

Veel succes! 1. Gegeven is de volgende klasse:

Aanvullende toets Gameprogrammeren Woensdag 5 januari 2011, uur

Veel succes! 1. Deze opgave bestaat uit een aantal deelvragen. Houd het antwoord kort: één of twee zinnen per onderdeel kan al genoeg zijn.

Veel succes! 1. Deze opgave bestaat uit een aantal vragen. Houd het antwoord kort: één of twee zinnen per onderdeel kan al genoeg zijn.

Uitwerkingen derde deeltentamen Gameprogrammeren Vrijdag 6 november 2015, uur

Eerste deeltentamen Gameprogrammeren Vrijdag 25 september 2015, uur

Veel succes! 1. Deze opgave bestaat uit een aantal deelvragen. Houd het antwoord kort: één of twee zinnen per onderdeel kan al genoeg zijn.

Aanvullende toets Gameprogrammeren (INFOB1GP) Woensdag 24 december 2014, uur

Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, uur

Derde deeltentamen Imperatief programmeren - versie 1 Vrijdag 6 november 2015, uur

Uitwerkingen Tweede deeltentamen Imperatief programmeren Vrijdag 15 oktober 2010, uur

IMP Uitwerking week 13

DIAGNOSTISCHE TOETS Softwaresystemen UITWERKING

Derde deeltentamen Imperatief programmeren - versie 1 Vrijdag 7 november 2014, uur

Versie 2: B C D D A C D A C C. Versie 3: C D A A B D A B D D. Versie 4: A D C C B D C B D D. Versie 5: B A D D C A D C A A

Uitwerking Tentamen Modelleren en Programmeren - versie 1 Woensdag 1 februari 2017, uur

Datatypes Een datatype is de sort van van een waarde van een variabele, veel gebruikte datatypes zijn: String, int, Bool, char en double.

Tentamen Imperatief Programmeren

Uitwerking Derde deeltentamen Imperatief programmeren - versie 1 Vrijdag 6 november 2015, uur

Uitwerking Tentamen Modelleren en Programmeren - versie 1 Woensdag 1 februari 2017, uur

Uitwerking Tweede deeltentamen Imperatief programmeren - versie 1 Vrijdag 21 oktober 2016, uur

NAAM: Programmeren 1 Examen 21/01/2011

Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 2 februari 2018, uur

Derde deeltentamen Imperatief programmeren - versie 1 Vrijdag 9 november 2018, uur

Derde deeltentamen Imperatief programmeren - versie 1 Vrijdag 10 november 2017, uur

NAAM: Programmeren 1 Examen 29/08/2012

NAAM: Programmeren 1 Examen 31/08/2011

APPLICATIEBOUW 3E COLLEGE: OBJECT GEORIËNTEERD PROGRAMMEREN, METHODEN, PARAMETERS, SCOPE VAN VARIABELEN. Onderdeel van SmartProducts

Klassen. Hoofdstuk Klassen

Vakgroep CW KAHO Sint-Lieven

Uitwerking Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 2 februari 2018, uur

Derde deeltentamen Imperatief programmeren - versie 1 Vrijdag 11 november 2016, uur

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren

Beginselen van programmeren Practicum 1 (Doolhof) : Oplossing

Programmeren (1) Examen NAAM:

Tentamen Object Georiënteerd Programmeren TI oktober 2014, Afdeling SCT, Faculteit EWI, TU Delft

Overerving & Polymorfisme

Programmeren 1 20 januari 2012 Prof. T. Schrijvers

Uitwerking Derde deeltentamen Imperatief programmeren - versie 1 Vrijdag 10 november 2017, uur

Uitwerking Eerste deeltentamen Mobiel programmeren - versie 1 Vrijdag 23 december 2016, uur

is eigenlijk overbodig!

Tentamen Imperatief en Object-georiënteerd programmeren in Java voor CKI

Modelleren en Programmeren

Modelleren en Programmeren

Programmeren in C# Interfaces. Hoofdstuk 23

Uitwerking Eerste deeltentamen Mobiel programmeren - versie 1 Vrijdag 21 december 2018, uur

Modelleren en Programmeren

Tentamen Objectgeorienteerd Programmeren IN1205 Voorbeeld

Voorbeeldtentamen Inleiding programmeren (IN1608WI), Oktober 2003, , Technische Universiteit Delft, Faculteit EWI, Afdeling 2.

Uitwerking Tweede deeltentamen Imperatief programmeren Vrijdag 19 oktober 2012, uur

Programmeren 1 23 januari 2013 Prof. T. Schrijvers

Uitwerking Eerste deeltentamen Mobiel programmeren - versie 1 Vrijdag 22 december 2017, uur

Deeltentamen Grammatica s en ontleden 22 december 2005

Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 29 januari 2016, uur

Uitwerking Tweede deeltentamen Imperatief programmeren versie 1 Vrijdag 20 oktober 2017, uur

Kompas. zijn klasse. protected override void OnDraw(Canvas canv) { base.ondraw(canv);

Tweede deeltentamen Imperatief programmeren versie 1 Vrijdag 20 oktober 2017, uur

In de tweede regel plaatsen we in het gereserveerde stukje geheugen een getal.

Tentamen Object Georiënteerd Programmeren TI januari 2013, Afdeling SCT, Faculteit EWI, TU Delft

Kwis (3) class X { public void a() { System.out.println("x"); public static void main(string[] args) { X x = new X();

Modelleren en Programmeren

Abstracte klassen & Interfaces

Zelf een spel maken met GameMaker Les 5: een platformspel

Objective-C Basis. 23 april 2005, Eindhoven Patrick Machielse

Ingebouwde klassen & methodes

vandaag èn vrijdag deadline maandag 12 dec.

Project network. Gebaseerd op paragrafen , uit het boek. We simuleren een sociaal netwerk

b.text = "Rol!"; b.location = new Point(100, 0); b.click += this.rol; this.paint += this.teken;

Uitwerkingen Derde deeltentamen Imperatief programmeren Vrijdag 12 november 2010, uur

Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 3 februari 2017, uur

Uitwerking Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 3 februari 2017, uur

Game of Life in Java

Uitwerking Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 29 januari 2016, uur

Objectgeoriënteerd Programmeren: WPO 4B

Uitwerkingen Derde deeltentamen Imperatief programmeren Vrijdag 12 november 2010, uur

Kleine cursus PHP5. Auteur: Raymond Moesker

Uitwerking Derde deeltentamen Imperatief programmeren Woensdag 2 februari 2011, uur

Java Les 3 Theorie Herhaal structuren

Programmeren in Java 3

Een gelinkte lijst in C#

Uitwerking Tweede deeltentamen Imperatief programmeren Vrijdag 21 oktober 2011, uur

Zelftest Programmeren in Java

Uitwerking Tweede deeltentamen Imperatief programmeren Vrijdag 18 oktober 2013, uur

Modelleren en Programmeren

Tentamen Inleiding Programmeren (IN1608WI), duur van de toets 2 uur Technische Universiteit Delft, Faculteit EWI, Afdeling 2.

TENTAMEN Programmeren 1 VOORBEELDUITWERKING

Uitwerking Derde deeltentamen Imperatief programmeren Vrijdag 8 november 2013, uur

Klonen. Het doel is om de appel op te eten. Iedere keer dat de slang de appel eet, groeit hij één vakje langer.


Objectgeoriënteerd Programmeren: WPO 3

voegtoe: eerst methode bevat gebruiken, alleen toevoegen als bevat() false is

Programmeren in C# Klassen schrijven

Windows-applicatie. using System.Windows.Forms; using System.Drawing; class HalloWin1 { static void Main ( )

Transcriptie:

Uitwerkingen aanvullende toets Gameprogrammeren (INFOB1GP) Vrijdag 4 januari 2013, 11.00-13.00 uur 1. Deze opgave bestaat uit een aantal vragen. Houd het antwoord kort: één of twee zinnen per onderdeel kan al genoeg zijn. (a) (3 punten) De methode int.parse kan een string-waarde uitlezen en omzetten naar een int-waarde. Een voorbeeld: string getal = LeesTekst(); int getalalsint = int.parse(getal); De LeesTekst methode vraagt de gebruiker om tekst in te voeren, en de methode levert deze tekst op als resultaatwaarde. In de tweede regel wordt die waarde omgezet naar een int met behulp van de int.parse methode. Het probleem is dat int.parse excepties kan werpen, zoals onder andere een FormatException (indien de string geen getal bevat) of een OverflowException (als de string een groter getal bevat dan de maximum of minimum int-waarde). Schrijf een methode LeesGetal die een string inleest (gebruik hiervoor de LeesTekst methode), en die een int oplevert als resultaat. Als de ingevoerde string geen int-waarde bevat dan geeft de methode de waarde 0 terug. Als de gelezen string een int-waarde heeft die groter is dan de toegestane maximum- of minimumwaarde, dan moet de methode -1 opleveren. In het geval van een andere exceptie geeft de methode de waarde 99 terug. public int LeesGetal() string getal = LeesTekst(); try return int.parse(getal); catch(formatexception e) return 0; catch (OverflowException e) return 1; catch (Exception e) return 99; (b) (2 punten) Wat is het verschil tussen een expressie en een opdracht/instructie? Is return x; een opdracht/instructie of een expressie? Een instructie is een voordracht om het geheugen te veranderen. Een expressie is een stukje programma met een waarde. return x; is een opdracht/instructie. (c) (4 punten) Kruis aan welke van de volgende stellingen waar zijn: Elke if-opdracht kan worden omgeschreven naar een switch opdracht en vice versa. X Excepties gebruik je vooral om het programma te stoppen in het geval dat er een fout optreedt die niet door de programmeur voorzien had kunnen worden, zoals een missend tekstbestand, of een verstoorde netwerkverbinding. 1

Arrays zijn nuttig want je kunt er tweedimensionale structuren zoals een 2D speelveld mee modelleren. Dit kan niet met een Collection (sub)klasse. Botsingen tussen game objecten worden afgehandeld in de Draw methode, want we weten pas of object botsen nadat ze getekend zijn. (d) (3 punten) Schrijf de volgende if-instructie om naar een switch-instructie. De variabele x is van het type int. if (x == 1) Method1(); else if (x == 2 x == 3) Method2(); Method3(); return; else if (x > 0 && x < 7) Method4(); else Method5(); switch (x) case 1: Method1(); break; case 2: case 3: Method2(); Method3(); return; case 4: case 5: case 6: Method4(); break; default: Method5(); break; (e) (3 punten) Beschouw de volgende twee klassen: class GameObject protected Vector2 position, velocity; protected string id; public GameObject(string id) this.id = id; public virtual void HandleInput(InputHelper inputhelper, GameWorld gameworld) public abstract void Update(GameTime gametime, GameWorld gameworld); public virtual void Draw(GameTime gametime, SpriteBatch spritebatch) 2

class SpriteGameObject : GameObject protected Texture2D sprite; public SpriteGameObject(string id, Texture2D sprite) this.id = id; this.sprite = sprite; public override void Draw(GameTime gametime, SpriteBatch spritebatch) spritebatch.draw(sprite, position, Color.White); Er zitten drie fouten in deze klassendefinities, waardoor een programma dat de klassen wil gebruiken niet compileert. Welke drie fouten zijn dit? GameObject bevat een abstracte methode maar is zelf geen abstracte klasse; de SpriteGameObject klasse implementeert de abstracte Update methode niet; de SpriteGameObject constructormethode roept de constructor van de superklasse niet aan (base(id)). 3

2. In deze opgave gaan we een klassiek spel, Snakes, uitwerken. In het spel Snakes bestuurt de speler een slang met de pijltjestoetsen. In het spel kun je voedsel verzamelen, maar bij iedere consumptie wordt de slang langer. Als de slang in botsing komt met een obstructie in het level, of met de rand van het scherm, of met zichzelf, dan is het spel afgelopen. In deze versie van het spel kunnen we een level laden uit een tekstbestand. Zo n tekstbestand kan er bijvoorbeeld als volgt uitzien:...xxxxxxxxxxxxxxxxxxxxxxxxxx......xxxxxxxxxxx... Een screenshot van het Snakes spel is als volgt gegeven: 4

In deze screenshot is met een paar tekstballonnen aangegeven wat welke elementen zijn (de slang, voedsel en obstructies). Een aantal klassen (SnakeGame, Level en Snake) zijn reeds (deels) uitgewerkt, en ze zijn te vinden in de bijlage van deze toets. In de Level klasse laden we het level uit het tekstbestand. Dit level bestaat uit een aantal tiles. Als basisbouwblok voor elk level gebruiken we de sprite blocksprite. Dit is een sprite van 20 20 pixels. Deze sprite gebruiken we om de obstructies te tekenen (in het wit), het voedsel te tekenen (in het rood), en de slang te tekenen (in het blauw). In het tekstbestand staan alleen de obstructies. We bepalen de positie van het voedsel en de initiële positie en bewegingsrichting van de slang willekeurig. (a) (6 punten) De methode loadlevel is verantwoordelijk voor het laden van een level uit een tekstbestand. Dit level wordt opgeslagen in een 2D array van bool waarden, waarbij de waarde true inhoudt dat de betreffende tile een obstructie is. Normaalgesproken bevat een tekstbestand alleen regels met hetzelfde aantal karakters. Als dat niet het geval is, dan moet de methode loadlevel een exceptie van het type IOException werpen. Schrijf de body van de loadlevel methode uit. List<string> lines = new List<string>(); StreamReader filereader = new StreamReader(path); string line = filereader.readline(); int width = line.length; while (line!= null) lines.add(line); if (line.length!= width) throw new Exception( The length of the lines is different. ); line = filereader.readline(); this.tiles = new bool[width, lines.count]; for (int y = 0; y < lines.count; ++y) for (int x = 0; x < width; ++x) this.tiles[x, y] = lines[y][x] == X ; (b) (4 punten) In de Level klasse willen we ook een property RandomFreePosition toevoegen. Deze property moet een willekeurige positie in het level teruggeven, uitgedrukt in indices van de tile-array, niet in pixelcoördinaten. De conditie is wel dat die positie geldig is, oftewel: de positie valt binnen de schermbreedte en de positie is niet al bezet door een obstructie. Voor het gebruik van deze property, zie bijvoorbeeld de constructormethode van de Level klasse. Werk de property RandomFreePosition uit. public Vector2 RandomFreePosition get Vector2 pos; do pos = new Vector2(random.Next(Width), random.next(height)); while (!isavailable(pos)); return pos; 5

(c) (5 punten) De Snake klasse wordt gebruikt om de slang in het level voor te stellen. De slang wordt voorgesteld door een lijst van posities in de variabele snakepositions. Verder beweegt de slang zich voort in een bepaalde richting die wordt bewaard in de variabele direction. Zoals je kunt zien in de Reset methode kennen we een willekeurige richting toe aan de slang bij het starten van het spel. Er zijn in principe vier verschillende richtingen mogelijk: naar links, naar rechts, naar boven en naar onder. De slang bestaat in het begin uit een enkel element, en de positie van dat element wordt bepaald aan de hand van de RandomFreePosition methode uit de Level klasse, zie ook de Reset methode. In de HandleInput methode kan de speler de slang van richting laten veranderen met behulp van de pijltjestoetsen. Er is één beperking: de slang mag niet in tegengestelde richting gaan bewegen, dus als de slang momenteel naar links beweegt, dan heeft het indrukken van de rechterpijltjestoets geen effect (de richting mag alleen veranderd worden naar boven of naar onderen). Schrijf de body van de HandleInput methode op. Je mag hierbij gebruik maken van de methode bool KeyPressed(Keys k) in de InputHelper klasse. Vector2 newdirection = direction; if (inputhelper.keypressed(keys.left)) newdirection = new Vector2( 1, 0); else if (inputhelper.keypressed(keys.right)) newdirection = new Vector2(1, 0); else if (inputhelper.keypressed(keys.up)) newdirection = new Vector2(0, 1); else if (inputhelper.keypressed(keys.down)) newdirection = new Vector2(0, 1); if (newdirection.x == direction.x newdirection.y == direction.y) return; direction = newdirection; 6

(d) (7 punten) In de Update methode van de Snake klasse moet een aantal dingen gebeuren. Ten eerste moet de slang iedere 0.2 seconden verplaatst worden. Een verplaatsing van de slang kun je opvatten als het toevoegen van een blok aan de kop van de slang in de bewegingsrichting van de slang, en het verwijderen van een blok aan de staart. Hierbij geldt dat de staart van de slang het eerste element is in de lijst, en de kop het laatste element. Ook moet in deze methode gekeken worden of het spel afgelopen is. Dit is het geval als de slang met een obstructie of zichzelf botst, of als de slang buiten het scherm raakt. Indien dat het geval is, moet de GameOver property gedefinieerd in de Level klasse op true gezet worden. Tenslotte moet deze methode het consumeren van een voedseleenheid afhandelen. Als de slang op de positie van een voedselblok komt, dan moet de slang één blok langer worden, en een nieuw voedselblok moet geplaatst worden op een willekeurige (geldige!) positie in het level. Schrijf de body van de Update-methode uit. time += gametime.elapsedgametime.totalseconds; if (time > 0.2) time = 0.2; Vector2 newpos = snakepositions[snakepositions.count 1] + direction; if (!level.isavailable(newpos) snakepositions.contains(newpos)) level.gameover = true; snakepositions.add(newpos); snakepositions.removeat(0); if (level.food == newpos) snakepositions.insert(0,snakepositions[0]); while (snakepositions.contains(level.food)) level.food = level.randomfreeposition; (e) (3 punten) In de Draw methode van de Snake klasse moet de slang op het scherm getekend worden (in het blauw). Schrijf de body van de Draw-methode uit. foreach (Vector2 pos in snakepositions) Vector2 finalpos = pos new Vector2(blockSprite.Width, blocksprite.height); spritebatch.draw(blocksprite, finalpos, Color.Blue); 7