Gamedev Ordliste Sekvens og Nummer Generatorer

Prosessegenerering bidrar til å øke replayability ved å bruke interne regler for å skape deler av spillet på fluen: fra å designe en fangehulls plan for å bygge et solsystem. Disse reglene er ofte basert på en rekke tall som deretter tolkes av programmet for å skape det nødvendige innholdet.

Det er mange måter å generere disse tallene på; i denne artikkelen ser vi på Sekvensgeneratorer og Pseudorandom Nummergeneratorer, og deres forskjeller.


Sequence Generator

Det første alternativet - en sekvensgenerator - er den mest hardcore av de to nevnte prosedyrene. Men hva er det?

En sekvensgenerator er en algoritme som bruker en matematisk formel til å produsere en sekvens av tall. Som et eksempel skal vi se på en veldig enkel sekvens - den jeg skal forklare er en avledning av den velkjente Fibonacci Sequence.

I utgangspunktet starter standardfibonacci-sekvensen alltid med 0 og 1. Disse tallene legges deretter sammen for å gi 1 - så det andre og tredje nummeret i denne sekvensen er 1 og 1. Når det legges sammen, er resultatet 2, og dette er det fjerde nummeret i sekvensen. Sekvensen fortsetter slik som dette, og legger alltid de to foregående tallene i sekvensen for å generere det neste.


Standard Fibonacci-sekvensen

Implementere en enkel sekvensgenerator

Programmering av en sekvensgenerator kan virke enkelt, spesielt hvis man baserer sin grunnlag på Fibonacci-sekvensen, men førsteinntrykkene lurer. For eksempel, tenk at vi prøver å skape et todimensjonalt stjernefelt som dette:


En enkel stjernefelt

Ser vi på dette starfieldet kan vi se at hver stjerne kan defineres av koordinatene og størrelsen. Når rekkevidden av hver verdi er mellom 0 og 99, kan vi da dele en sekvens av tall i tre grupper - tolke hvert tall som en stjernes x-koordinat, y-koordinat eller størrelse.


Manipulere en prøvesekvens

Hvis det tas trinn for trinn, er det ikke vanskelig å programmere en sekvensgenerator basert på Fibonacci-sekvensen for å lage en lignende sekvens..

Vi starter med et tall (kalt et frø) som består av fire sifre - for eksempel 1234. Frøet deles deretter inn i et par tosifrede tall som tar stedet for 0 og 1 i Fibonacci-sekvensen. Disse tallene behandles deretter ved hjelp av en formel for å produsere et tredje nummer i strømmen.

Når du bygger en sekvensgenerator, vil du sannsynligvis at de genererte tallene skal falle i et bestemt område (for eksempel 0-99). Det er derfor viktig å avkorte dette nummeret hvis det faller utenfor rekkevidde. (For eksempel kan vi bare kutte av "hundrevis" kolonnen.) Selv om dette kan virke ubetydelig, forenkler det arbeidsflyten når du manipulerer denne sekvensen senere.

Da denne prosessen gjentas, opprettes en streng med tall som er klar til å bli manipulert, og kan således implementeres:

Opprette en sekvens

Dessverre er det først etter at du implementerer sekvensen som en 2D-tegning som du begynner å merke igjen gjentatte mønstre. Mesteparten av tiden, å løse slike problemer vil resultere i å bruke lange timer med prøving og feil testing av forskjellige algoritmer.


Pseudorandom Nummergenerator

Den andre tilnærmingen nevnt ovenfor, benytter en Pseudorandom Number Generator (PRNG). Før jeg forklarer hva en PRNG er, husk at datamaskinen er en logisk maskin - den må adlyde et bestemt sett med regler. Derfor er ingenting i en datamaskin virkelig tilfeldig.

En Pseudorandom Number Generator er bare en algoritme som produserer en strøm av (tilsynelatende) tilfeldige tall. Jeg sier "tilsynelatende" fordi en PRNG fremdeles bruker forhåndsdefinerte formler for å generere tallene. Dette betyr at en PRNG fortsatt er en sekvensgenerator.

Nøkkelegenskapen til en PRNG sammenlignet med andre sekvensgeneratorer er at den balanserer antall ganger forskjellige tall vises. Denne prosessen gjøres gjennom komplekse formler og algoritmer, og betyr at tallene den produserer, vil vises like variert som tallene fra gjentatte terningkast, eller vinnende lotterienumre.


Et eksempel på en PRNG-sekvens

Mens en sekvensgenerator vanligvis er spesifikt laget for ett problem, brukes en PRNG når den genererte sekvensen vanligvis kasseres, eller behøver ikke beholdes.


PRNG vs sekvensgenerator

En PRNG er enklere å bruke og implementere enn en sekvensgenerator og har forskjellige bruksområder. Til tross for dette er det noen ganger mer fornuftig å gå den ekstra mile og bruke en sekvensgenerator. Hvorfor?

I komplekse systemer er det viktig at du får best mulig utnyttelse av plass. Ved å bruke en PRNG betyr det at du må lagre hele langvarig rekkefølge for å lagre detaljene til et solsystem. På den annen side, hvis du bruker en sekvensgenerator, kan du enkelt lagre det opprinnelige frøet og lengden på sekvensen. (I dette tilfellet er det avgjørende at sekvensgeneratoren produserer samme rekkefølge fra et gitt frø.) Det samme kan ikke sies om PRNGs: generelt utelukker et PRNG ikke sitt frø, og det aksepterer heller ikke en. Dette gjør det svært vanskelig å kopiere en PRNG-sekvens.

Noen ganger, men sjelden, kan en PRNG gi deg en tilsynelatende partisk rekkefølge (på samme måte som en rettferdig mynt kan av og til lande hodene fem ganger på rad). Dette kan ikke være lett å oppdage ved første øyekast, eller når du ser på sekvensen som helhet. Men når du ser på det produserte bildet, kan du merke klynger av stjerner eller planeter. Ved å bruke en sekvensgenerator kan dette problemet minimeres siden en slik algoritme er skreddersydd for problemet ved hånden.

En annen fordel, lik den forrige, er innholdskontroll. Når du ønsker å prosessivt generere en avansert stjernefelt, er det bare naturlig at du vil at små stjerner skal vises hyppigere enn de større stjernene. Ved hjelp av en uendret PRNG, er denne forspenningen ikke mulig. Men ved å bruke en sekvensgenerator kan du gi den nødvendige forspenningen selv. Nok en gang koker det hele sammen med formelen eller formler du bestemmer deg for å bruke, og måten du tolker den resulterende strengen på.

Mens en PRNG kan være nyttig, vil det trolig være best å velge en mer spesifikk sekvensgenerator når man lager en prosessorgenerasjonsmotor. Fordelene det medfører, er gunstig og sikrer at implementeringen har en forbedret mulighet til å stå ut fra resten.