Gameprogrammeren: Willekeurigheid (Randomness) Arjan Egges Paul Bergervoet Wouter van Toll
Willekeurigheid in games Een veelgebruikt concept in spellen Een stapel kaarten in willekeurige volgorde leggen Een bal een willekeurige richting op laten vliegen Een vijand op een willekeurige plek “spawnen” Levels genereren met een willekeurige structuur
Willekeurigheid in games Willekeurigheid vergroot het spelplezier Iedere keer als je speelt, is het weer anders Tot nu toe hadden onze programma’s 100% voorspelbaar gedrag Hoe maken we een programma ‘willekeurig’? Met behulp van een willekeurigegetallengenerator! (Random Number Generator)
Willkeurige getallen trekken Twee soorten random generatoren: Fysiek: Computationeel:
Computationeel Bij computationele willekeurigheid gebruiken we vaak een ‘seed’ Om aan te geven waar we beginnen in de tabel Dezelfde seed hergebruiken geeft dezelfde reeks getallen (kan nuttig zijn) Voorbeelden van seeds die steeds anders zijn: Systeemtijd De ID van het huidige proces in Windows ...
de systeemtijd als seed Random-klasse In MonoGame gebruiken we de Random-klasse: Met een maximumwaarde (resultaat < 100): Een double i.p.v. int (altijd tussen 0.0 en 1.0): Random r = new Random(); Console.WriteLine(r.Next()); Gebruikt standaard de systeemtijd als seed Console.WriteLine(r.Next(100)); Console.WriteLine(r.NextDouble());
Willekeurige voorbeelden ;) Het kiezen van een willekeurige snelheid voor een game-object: Kiezen welke speler begint: Random r = new Random(); Vector2 balSnelheid = new Vector2(r.Next(100), r.Next(100)); if (r.Next(2) == 0) this.beginnendeSpeler = “rood”; else this.beginnendeSpeler = “blauw”;
Random in de Painter-game Static membervariabele van het type Random Met een (static) property om erbij te kunnen: static Random random; public static Random Random { get { return random; } }
Random in de Painter-game Willekeurige snelheid in de PaintCan klasse Willekeurige kleur bepalen: return new Vector2(0.0f, (float)Painter.Random.NextDouble() / 2 + minVelocity); public Color CalculateRandomColor() { int randomval = random.Next(3); if (randomval == 0) return Color.Red; else if (randomval == 1) return Color.Green; else return Color.Blue; }