Fun with methods: een verhaalgenerator
Een verhaalgenerator is een methode die hulp-methoden gebruikt om zo een "automatisch" verhaal te verzinnen. We hanteren een bottom-up approach om dit probleem aan te pakken.
Naamgenerator
We maken een methode die namen kan genereren. Deze naam gebruiken om het hoofdpersonage voor te stellen.
We maken een methode die steeds een naam generereert met een ingegeven lengte. Een naam bestaat in dit geval uit een reekds willekeurige karakters van a tot en met z.
Een eerste versie kan zijn:
De eerste lijn is een klein trukje om ervoor te zorgen dat de variabele r
overal in het programma aangeroepen kan worden en we dus niet in iedere methode deze opnieuw moeten aanmaken.
De bovenstaande methode roepen we aan als volgt:
Naamgenerator versie 2
Een nadeel van deze eerste versie is dat er soms onuitspreekbare namen gemaakt worden. Een betere methode zou zijn dat medeklinker en klinker afwisselend voorkomen (bv "adilo"). Hier gaan we eerst enkele hulpmethoden genereren:
IsKlinker
Een methode om te weten of een meegeven karakter (char
) een klinker (``a,e,u,i en o") is.
Dit doen we snel met een switch
:
GenereerKlinker
We kunnen nu een methode maken die enkel klinkers genereert:
We zouden in
GenerateNameSimple
een if kunnen plaatsen om te controleren of het gegenereerd karakter een klinker is. Dit heeft als nadeel dat we niet kunnen voorspellen hoe snel de methode zal werken: er is zelfs een eindige kans dat de methode nooit kalar zal zijn indien er telkens weer een medeklinker wordt geworpen.
GenereerMedeklinker
Deze methode heeft dezelfde werking als GenereerKlinker
maar zal een switch
hebben met daarin enkel de medeklinkers.
Een minder goede oplossing (die ook oneindig lang kan duren als we echt pech hebben) zou zijn:
Betere Naamgenerator
Onze nieuwe naamgenerator werkt nu als volgt:
Zinnen genereren
Een zin bestaat minstens uit
Een onderwerp
Een werkwoord
Een leiden voorwerp
Bijvoorbeeld: Tim gooit de bal.
We hebben reeds een methode om onderwerpen te genereren, ``GenerateNameBetter.
We hebben nu nog een methode voor werkwoorden en een voor leidende voorwerpen nodig.
Werkwoord genereren
Deze is een methode die als een woordenboek een lijst van bestaande werkwoorden (infinitieven) heeft:
Voorwerp genereren
Dit is een zelfde soort methode als de vorige
Zin generator
We combineren nu deze 3 methoden om tot een zinnen generator te komen:
Verhaal generator
Het hek is nu van de dam. Alle puzzelstukjes liggen klaar.
Complexere zin
Een zin heeft vaak ook een bijzin die met een voegwoord (bv en
) achter de hoofdzin wordt geplakt. Deze methode doet dit en kan even veel bijzinnen achter mekaar plakken als dat er als parameter wordt meegegeven.
Voegwerken genereren
Ook deze methode gebruikt onze gekende methodiek:
Het totaal verhaal maken: dat doe je zelf
Maak nu een methode GenereerVerhaal
die een willekeurig aantal lange zinnen genereert.
Kan je volgende zaken toevoegen?
De
GenereerLangeZin
methode heeft als probleem dat alle bijzinnen steeds met een ander ondwerp werken. Het zou beter zijn als het onderwerp uit de hoofdzin ook in de bijzinnen dezelfde is. Pas daaromGenereerKorteZin
aan zodat deze methode een optionele parameter aanvaardt, namelijk het te gebruiken onderwerp. Indien de method geen parameter meekrijgt (==null
) dan zal de methode een nieuw onderwerp genereren.Het zelfde voor de verhaal generator: zorg ervoor dat ook de
GenereerLangeZin
een onderwerp als parameter aanvaardt.Kan je hier een daar adjectieven toevoegen aan je zin. Een adjactief is een extra 'beschrijving' van het onderwerp of leidende voorwerp. Bijvoorbeeld "groene bal" of "stomme Eric".
Last updated