Gameprogrammeren: Herhalingen Arjan Egges Paul Bergervoet Wouter van Toll
Herhaling Dezelfde code een aantal keer uitvoeren, met soms kleine verschillen Bijvoorbeeld: Een aantal keer een ‘leven’- of ‘resource’-sprite tekenen Een lijst van game-objecten langslopen en daar iets mee doen Een highscore-lijst afdrukken ...
Opdrachten herhalen: while voer de volgende regel uit zolang deze voorwaarde geldig is public override void Draw(GameTime gameTime) { int x; x = 1; while ( x < 1000 ) x = 2*x; spriteBatch.Draw( sprite, new Vector2(x, 10.0f), Color.White ); } body wordt steeds opnieuw uitgevoerd x > 1000, dus de while-loop stopt X 1024 512 128 256 64 16 32 1 8 2 4
Meerdere opdrachten herhalen private static int TweeLog ( ) { int x, t; x=1; t=0; while ( x < 1000 ) x = 2*x; t = t+1; } return t; (int n) teller telt hoe vaak er wordt verdubbeld n accolades smeden twee opdrachten tot één body
Herhalen met een teller public void tekenLevens () { int t; t=0; while ( t<10 ) Vector2 pos = new Vector2(t*heart.Width, 50.0f); spriteBatch.Draw(heart, pos, Color.White ); t = t+1; } teller bepaalt het aantal herhalingen en komt goed van pas in de body
Publieksvraag Maak een methode ‘macht’ met twee parameters: grondtal (reëel getal) exponent (natuurlijk getal) Uitkomst moet zijn: de waarde van grondtalexponent
Machtsverhef-methode public double macht (double x, int n) { double result; int t; t = 0; result = 1; while ( t<n ) { result = result * x ; t = t+1 ; } return result; }
Syntax van while-opdracht
Gebruik van bool-expressies Als voorwaarde van een while-opdracht Rechts van een toekenningsopdracht Als resultaat van een methode while (x<10) ... bool b; b = x<10 ; return x<10 ;
waarheidswaarde als resultaat Publieksvraag Schrijf een methode ‘deelbaar’, die antwoordt of x deelbaar is door d waarheidswaarde als resultaat private static bool deelbaar (int x, int d) { } return ; x%d == 0
Publieksvraag Schrijf een methode ‘kleinsteDeler’, die antwoordt wat de kleinste deler is van x probeer ze één voor één public int kleinsteDeler (int x) { } int d; d = 2; while ( x%d != 0 ) d = d+1; return d;
wordt vermenigvuldigd met Variabelen aanpassen Afgekorte notaties: x = x * 2 ; nieuwe waarde wordt oude waarde wordt vermenigvuldigd met x = x * 2 ; x *= 2 ; wordt vermeerderd met x = x + 5 ; x += 5 ; wordt opgehoogd x = x + 1 ; x += 1 ; x ++ ;
Herhaling met een teller: while int t = 0; while ( t < x ) { // doe iets nuttigs met t // ... t++; }
Herhaling met een teller: for Kortere versie, omdat tellers zo vaak voorkomen for ( int t = 0; t < x; t++ ) { // doe iets nuttigs met t // ... }
for-opdracht int t ; for ( t=0 ; t<x ; t++ ) eenmalige initialisatie voorwaarde om door te gaan stap naar de volgende int t ; for ( t=0 ; t<x ; t++ ) Console.WriteLine( "Kolom: " + t ); for ( t=1 ; t<=x ; t++ ) for ( t=x ; t>=0 ; t -- ) for ( t=2 ; !deelbaar(x,t) ; t++ )
Syntax van for-opdracht
Herhaalde herhaling Body van een for-opdracht is een opdracht Dat kan zelf ook weer een for-opdracht zijn! int x, y; for (y=0; y<10; y++) for (x=0; x<10; x++) { Vector2 pos = new Vector2( heart.Width*x, heart.Height*y); spriteBatch.Draw(heart, pos, Color.White); } y
Deze opdracht komt nooit aan de beurt! Extreme gevallen Nul keer herhalen Oneindig vaak herhalen for (y=0; y<0; y++) spriteBatch.Draw(…); while (true) audio.Play(); spriteBatch.draw(...); Deze opdracht komt nooit aan de beurt!
Onbedoelde oneindigheid x=1; aantal = 0; while (aantal<10) x = x*2; aantal = aantal+1; accolades vergeten... { }
deze waarschuwing is theoretisch onmogelijk! Compiler-meldingen Foutmeldingen variabele niet gedeclareerd puntkomma vergeten ... Waarschuwingen unreachable code variable is never used while-statement doesn’t terminate deze waarschuwing is theoretisch onmogelijk!
Het Halting-problem is onoplosbaar bool stopt (string filenaam) { // check of de code in // bestand ‘filenaam’ stopt ... } Nietes! Deze methode lost het op: void gemeen (string filenaam) { while ( stopt(filenaam) ) … } Ha! En dit dan? Wat komt er dan uit: ? stopt( "Gemeen.cs" )
Het Halting-problem is onoplosbaar Stel dat “Gemeen” wél stopt ...dus stopt levert true op ...dus gemeen blijft hangen! Stel dat “Gemeen” niet stopt ...dus stopt levert false op ...dus gemeen stopt direct! tegenspraak! dus stopt kan helemaal niet bestaan
Andere Halting-achtige problemen Wordt een opdracht ooit uitgevoerd? Is een programma een virus? …en hoe werkt een virus-checker dan? óf te streng: keurt teveel af óf te coulant: laat sommige door lastig gevaarlijk