Proces genereren helpt de herspeelbaarheid te vergroten door interne regels te gebruiken om delen van het spel on the fly te maken: van het ontwerpen van het plan van een kerker tot het bouwen van een zonnestelsel. Deze regels zijn vaak gebaseerd op een reeks getallen die vervolgens door het programma worden geïnterpreteerd om de vereiste inhoud te creëren.
Er zijn veel manieren om deze nummers te genereren; in dit artikel zullen we kijken Sequence Generators en Pseudorandom nummer generatoren, en hun verschillen.
De eerste optie - een sequentiegenerator - is de meest hardcore van de twee genoemde procedures. Maar wat is het?
Een sequentiegenerator is een algoritme dat een wiskundige formule gebruikt om een reeks getallen te produceren. Als voorbeeld gaan we naar een heel eenvoudige volgorde - degene die ik ga uitleggen is een afleiding van de bekende Fibonacci-reeks.
In principe begint de standaard Fibonacci-reeks altijd met 0 en 1. Deze getallen worden dan bij elkaar opgeteld om 1 te geven - dus de tweede en derde getallen in deze reeks zijn 1 en 1. Bij elkaar opgeteld is het resultaat 2 en dit is het vierde getal in de reeks. De reeks gaat zo verder en voegt altijd de twee voorgaande nummers toe om de volgende te genereren.
Het programmeren van een sequentiegenerator lijkt eenvoudig, vooral als men zijn basis baseert op de Fibonacci-reeks, maar de eerste indrukken bedriegen. Laten we ons bijvoorbeeld voorstellen dat we een tweedimensionaal sterrenveld als dit proberen te maken:
Als we naar dit sterrenveld kijken, kunnen we zien dat elke ster kan worden gedefinieerd aan de hand van de coördinaten en de grootte ervan. Als we het bereik van elke waarde tussen 0 en 99 nemen, kunnen we een reeks getallen in groepen van drie verdelen - elk nummer interpreteren als de x-coördinaat, y-coördinaat of grootte van een ster.
Als het stap voor stap wordt gedaan, is het programmeren van een sequentiegenerator op basis van de Fibonacci-reeks om een vergelijkbare reeks te maken, geen moeilijke taak.
We beginnen met een nummer (een zaadje genaamd) bestaande uit vier cijfers - bijvoorbeeld 1234. Het zaadje wordt dan gesplitst in een paar getallen van twee cijfers die de plaats innemen van de 0 en 1 van de Fibonacci-reeks. Deze nummers worden vervolgens verwerkt met een formule om een derde getal in de stream te produceren.
Wanneer u een sequentiegenerator bouwt, wilt u waarschijnlijk dat de gegenereerde getallen binnen een bepaald bereik vallen (bijvoorbeeld 0-99). Het is daarom belangrijk om afknotten dit nummer als het buiten bereik valt. (Voor ons voorbeeld kunnen we gewoon de kolom "honderden" afsnijden.) Hoewel dit misschien onbeduidend lijkt, faciliteert het de workflow bij het later manipuleren van deze reeks.
Terwijl dit proces wordt herhaald, wordt een reeks getallen gemaakt die gereed is om te worden gemanipuleerd en die dus kan worden geïmplementeerd:
Een reeks makenHelaas pas nadat u de reeks als een 2D-tekening hebt geïmplementeerd, merkt u steeds terugkerende patronen op. Meestal zal het oplossen van dit soort problemen resulteren in lange uren testen en fout testen van verschillende algoritmen.
De tweede benadering die hierboven is genoemd, gebruikt een Pseudorandom Number Generator (PRNG). Voordat ik uitleg wat een PRNG is, moet u er rekening mee houden dat de computer een logische machine is - hij moet aan een aantal regels voldoen. Daarom is niets op een computer echt willekeurig.
Een Pseudorandom Number Generator is slechts een algoritme dat een stroom van (schijnbaar) willekeurige getallen produceert. Ik zeg "schijnbaar" omdat een PRNG nog steeds vooraf gedefinieerde formules gebruikt om de getallen te genereren. Dit betekent dat een PRNG nog steeds een sequentiegenerator is.
De sleuteleigenschap van een PRNG in vergelijking met andere reeksgeneratoren is dat het het aantal keren dat verschillende nummers worden weergegeven, in evenwicht brengt. Dit proces wordt gedaan door middel van complexe formules en algoritmen, en betekent dat de getallen die het produceert net zo gevarieerd zullen zijn als de nummers van herhaalde dobbelstenen gooit, of winnende lotnummers.
Hoewel een sequentiegenerator meestal specifiek voor één probleem wordt gemaakt, wordt een PRNG gebruikt wanneer de gegenereerde reeks gewoonlijk wordt weggegooid of niet hoeft te worden behouden.
Een PRNG is gemakkelijker te gebruiken en te implementeren dan een sequentiegenerator en heeft verschillende toepassingen. Desondanks is het soms verstandiger om een stapje extra te doen en een Sequence Generator te gebruiken. Waarom?
In complexe systemen is het belangrijk dat u optimaal gebruikmaakt van de ruimte. Als u een PRNG gebruikt, moet u de hele lange reeks opslaan om de details van een zonnestelsel te bewaren. Als u daarentegen een sequentiegenerator gebruikt, kunt u de beginperiode en de lengte van de reeks eenvoudig opslaan. (In dit geval is het cruciaal dat de sequentiegenerator dezelfde sequentie van een bepaald zaad produceert.) Hetzelfde kan niet worden gezegd over PRNG's: een PRNG stelt zijn zaad doorgaans niet bloot, en accepteert er ook geen. Dit maakt het repliceren van een PRNG-sequentie extreem moeilijk.
Soms, hoewel zelden, kan een PRNG je een schijnbaar vooringenomen reeks opleveren (net zoals een eerlijke munt soms vijf keer achter elkaar hoofden kan landen). Dit is misschien niet zo eenvoudig te detecteren op het eerste gezicht, of wanneer u de reeks als geheel bekijkt. Als u echter naar de geproduceerde afbeelding kijkt, ziet u mogelijk sterrenhopen of planeten. Door een Sequence Generator te gebruiken, kan dit probleem worden geminimaliseerd, omdat een dergelijk algoritme op maat is gemaakt voor het probleem in kwestie.
Een ander voordeel, vergelijkbaar met het vorige, is inhoudscontrole. Wanneer je procedureel een ver buiten het sterrenveld wilt genereren, is het niet meer dan logisch dat je wilt dat kleine sterren vaker verschijnen dan de grotere sterren. Met een ongewijzigde PRNG is dit vooroordeel niet mogelijk. Door een Sequence Generator te gebruiken, kunt u echter zelf de vereiste vertekening opgeven. Nogmaals, het komt allemaal neer op de formule of formules die u besluit te gebruiken, en de manier waarop u de resulterende string interpreteert.
Hoewel een PRNG nuttig zou kunnen zijn, is het waarschijnlijk het beste om een meer specifieke sequentiegenerator te kiezen bij het maken van een procedurele generatiemachine. De voordelen die het met zich meebrengt, zijn gunstig en zorgen ervoor dat de implementatie een grotere mogelijkheid biedt om te onderscheiden van de rest.