Een AI-botspel ontwerpen met duidelijke regels, geheugen en keuzevrijheid voor spelers
Om een speelbaar AI-botspel te ontwerpen, definieer je een kleine, herhaalbare spelcyclus, sla je de spelstatus buiten het gesprek op en geef je elke actie van de speler een duidelijk gevolg. Laat de bot verzoeken interpreteren en gebeurtenissen beschrijven; laat expliciete regels de kosten, voortgang en afloop bepalen. Deze gids is bedoeld voor gamemakers die een tekstgame bouwen met een AI-personage of verteller. Het doel is één korte, testbare sessie te maken waarin spelers hun opties begrijpen, merken dat hun beslissingen ertoe doen en een geldige afloop bereiken. De bezorggame hieronder is een illustratief ontwerp, geen getest product of gerapporteerde casestudy.
Begin met een kerncyclus die je zonder AI kunt spelen
Beschrijf de cyclus in één zin: Toon de situatie → accepteer een actie → controleer de regels → werk de status bij → toon het gevolg en de volgende opties. Elke beurt moet die cyclus voltooien of uitleggen waarom dat niet kan.
Bepaal voordat je een persoonlijkheidsprompt schrijft het doel, de beschikbare acties, de actiekosten en de voorwaarden voor het einde. Je moet het spel met indexkaarten of een spreadsheet kunnen spelen. Zo kun je de spelmechanieken bekijken voordat gegenereerde dialogen variatie toevoegen.
Denk aan een klein spel met de naam Festivalpakket. De speler heeft vijf tijdseenheden om een pakket te bezorgen. Die kan kiezen voor een directe route of een tuinroute en eventueel een decoratief lint meenemen voordat die vertrekt. Een bot speelt de festivalkoerier, die routes toelicht en commentaar geeft op de bezorging.
De voorgestelde regels zijn bewust beknopt:
Toon deze regels voordat de speler de eerste keuze maakt. Leg uit dat bezorgacties de sessie beëindigen, dus dat spelers het lint vooraf moeten meenemen. Een bezorging waarbij de laatste tijdseenheid wordt verbruikt, slaagt nog steeds, omdat eerst wordt gecontroleerd of de bezorging is gelukt.
Dit prototype heeft een compleet begin, een reeks keuzes en een einde. Extra personages of locaties moeten hun plek verdienen door nuttige beslissingen aan die cyclus toe te voegen.
Begin bij het depot met het pakket, vijf tijdseenheden en zonder lint.
Het lint meenemen kost één tijdseenheid en kan maar één keer.
Direct bezorgen kost drie tijdseenheden en beëindigt de sessie met succes.
Via de tuin bezorgen kost vier tijdseenheden en beëindigt de sessie met succes; aan het einde wordt een tuinansichtkaart toegevoegd.
Wachten kost één tijdseenheid.
De status opvragen, vragen stellen over de regels en om verduidelijking vragen kosten niets.
Een actie is alleen toegestaan als er genoeg tijd over is om de volledige kosten te betalen.
Controleer na een geldige actie eerst of de bezorging is gelukt. Als het pakket nog niet is bezorgd en geen enkele route betaalbaar is, eindigt het spel met een gemiste bezorging.
Laat de expliciete spelstatus bepalend zijn voor de uitkomsten
Beschouw de status als het spelregister van wat waar is. Gesprekstekst mag dat register toelichten, maar mag het niet ongemerkt veranderen.
Het hoofdstuk over status in Game Programming Patterns van Robert Nystrom (https://gameprogrammingpatterns.com/state.html) beschrijft eindige-toestandsmachines aan de hand van toestanden, invoer en toegestane overgangen. Het laat ook zien hoe losjes gecombineerde booleaanse vlaggen ongeldige combinaties kunnen opleveren. Pas dat principe toe op de levenscyclus van je spel: gebruik één sessiestatus, zoals actief, bezorgd of gemist, met vastgelegde overgangen.
Voor het bezorgprototype volstaat een kleine statusspecificatie:
Leid de tuinansichtkaart af van de gekozen route in plaats van een tweede waarde op te slaan die daarmee in tegenspraak kan zijn. Bereken op dezelfde manier de op dat moment beschikbare acties op basis van de status en de regels.
Hanteer een vaste verwerkingsvolgorde: interpreteer het verzoek, valideer de actie en parameters, bereken het resultaat, leg de statuswijziging vast en vertel daarna wat er is gebeurd. Geef de verteller de vastgelegde uitkomst en de toegestane volgende acties. Die hoort geen tweede berekening te verzinnen.
Na het meenemen van het lint is het gezaghebbende resultaat bijvoorbeeld: er zijn nog vier tijdseenheden, het lint is meegenomen en beide routes zijn betaalbaar. De bot mag de kleur van het lint beschrijven, zolang die kleur geen speltechnisch effect heeft. De bot mag geen onaangekondigde tijdskosten toevoegen of een tweede lint geven.
Je kunt deze voorwaarden uitproberen met een bestaande tool voor interactieve verhalen. De officiële tutorial van Inkle over interactieve fictie (https://www.inklestudios.com/ink/web-tutorial/) legt voorwaardelijke keuzes, het bijhouden van eerder bezochte inhoud, variabelen en expliciete eindes uit. Deze functies vormen een nuttige basis om het geschreven spel te testen voordat je AI-vertelling toevoegt.
Veld — Beginwaarde — Regel
Sessiestatus — actief — Alleen actieve sessies accepteren spelacties
Resterende tijd — 5 — Kan niet onder nul komen
Lint meegenomen — onwaar — Kan één keer op waar worden gezet
Gevolgde route — geen — Wordt bij bezorging direct of tuin
Aantal vastgelegde acties — 0 — Wordt met één verhoogd voor elke geaccepteerde spelactie
Geef spelers keuzes die ze begrijpen en kunnen beïnvloeden
Beoordeel in dit ontwerp de keuzevrijheid aan de hand van de vraag of de speler een betekenisvol verschil kan voorzien en dat vervolgens in het resultaat kan zien. Meerdere knoppen met een andere formulering die tot dezelfde uitkomst leiden, toetsen dat nauwelijks.
In Festivalpakket sluit de routekeuze aan op verschillende voorkeuren van spelers:
Dit zijn illustratieve berekeningen op basis van de genoemde regels. Ze bieden een eenvoudige leidraad voor de keuze: kies voor directe bezorging om eerder klaar te zijn, neem het lint mee als versiering of kies de tuinroute voor de ansichtkaart. De resterende tijd is hier een detail van het einde; die levert niet stiekem punten op.
Als het spel later een bepaalde uitkomst beloont, maak die puntentelling dan vóór de keuze bekend. Anders kunnen spelers de afweging die je voor ogen had niet beoordelen.
Ondersteun vrije tekst naast zichtbare acties. ‘Laten we de mooie route nemen’ kan worden vertaald naar bezorging via de tuin. ‘Maak het speciaal’ is dubbelzinnig: dat kan betekenen dat de speler het lint meeneemt, de tuinroute kiest of allebei. Vraag kort om verduidelijking zonder tijd te verbruiken.
Accepteer voor het eerste prototype één spelactie per bericht. Als de speler een reeks acties vraagt, toon dan de stappen en vraag welke actie als eerste moet worden uitgevoerd. Zo voorkom je dat je een plan deels uitvoert terwijl later blijkt dat de volgende stappen niet beschikbaar zijn.
Geef bij niet-ondersteunde verzoeken informatieve antwoorden. Vraagt de speler om te vliegen, leg dan uit dat de beschikbare routes direct en via de tuin lopen, met de bijbehorende kosten. Vrije tekst kan meer ruimte geven aan de formulering, terwijl het actiesysteem een voorspelbare reeks mogelijkheden biedt.
Plan — Totale tijdskosten — Zichtbaar resultaat
Direct bezorgen — 3 — Pakket zonder versiering bezorgd met 2 tijdseenheden over
Lint meenemen en daarna direct bezorgen — 4 — Versierd pakket bezorgd met 1 tijdseenheid over
Via de tuin bezorgen — 4 — Pakket zonder versiering bezorgd met een tuinansichtkaart
Lint meenemen en daarna via de tuin bezorgen — 5 — Versierd pakket bezorgd met een tuinansichtkaart
Bepaal wat de bot onthoudt en wat die mag weten
Verdeel het geheugen in drie lagen, elk met een eigen doel.
De gezaghebbende sessiestatus bevat grondstoffen, voortgang, gekozen routes en eindes. Die blijft bewaard bij opslaan en opnieuw laden en verandert alleen via gevalideerde acties.
Een gebeurtenissenlog voor de sessie registreert vastgelegde acties en hun gevolgen. Een regel kan bijvoorbeeld aangeven dat actie 2 het lint meenam en de resterende tijd van vijf naar vier terugbracht. Dit helpt bij het opsporen van fouten en het maken van nauwkeurige samenvattingen. Behoud actie-ID's zodat een herhaald verzoek dezelfde gebeurtenis niet twee keer kan toepassen.
De narratieve context bevat recente dialogen en een beknopte samenvatting die helpt de toon en continuïteit te bewaren. Die kan worden ingekort zonder de daadwerkelijke spelstatus te verwijderen.
De gids van Anthropic voor effectief contextbeheer (https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents) bespreekt zowel het samenvatten van de gespreksgeschiedenis als het bewaren van notities buiten het contextvenster. De gids waarschuwt ook dat agressief samenvatten belangrijke details kan laten verdwijnen. De ontwerpimplicatie is hier dat exacte speltechnische feiten in gestructureerde opslag blijven en samenvattingen worden gebruikt voor de gesprekscontinuïteit.
Leg naast opslaggrenzen ook kennisgrenzen vast. Een personage mag alleen de feiten te zien krijgen die het mag weten. Als een latere versie een verborgen route bevat, houd die dan buiten de context van het personage totdat aan de ontdekkingsvoorwaarde is voldaan. Niet alle status die beschikbaar is voor de spelengine hoeft ook beschikbaar te zijn voor de verteller.
Bewaar voor dit kleine spel de voortgang binnen de opgeslagen sessie en wis die wanneer een nieuwe speelsessie begint. Leid geen blijvende voorkeuren van spelers af uit één routekeuze. Als je een opgeslagen voorkeur toevoegt, zoals kortere beschrijvingen, maak die dan expliciet en aanpasbaar.
Test het geheugen met een concrete reeks: neem het lint mee, sla het spel op, laad het opnieuw, vraag de status op en kies voor bezorging via de tuin. Het lint moet meegenomen blijven, vóór de bezorging moeten er nog vier tijdseenheden zijn en de resterende tijd moet aan het einde nul zijn.
Ontwerp aparte reacties voor mislukking in het spel en in het systeem
Een gemist doel hoort bij het spel. Een mislukte generatieaanvraag is een implementatieprobleem. Verbind daar verschillende gevolgen aan.
Noem bij een mislukking in het spel de regel waardoor de sessie eindigde. Na drie keer wachten zijn er nog maar twee tijdseenheden over, dus is geen van beide bezorgroutes betaalbaar. Beëindig het spel meteen met een duidelijke uitleg en een optie om opnieuw te beginnen, in plaats van de speler in een actieve sessie te laten die niet meer te winnen is.
Bepaal het herstelgedrag voor implementatiefouten voordat je uitgebreide vertellingen toevoegt:
Vervang een onleesbare opslag niet stilzwijgend door een nieuw spel. Zo wordt verloren voortgang verborgen en wordt het volgende antwoord misleidend.
Maak voor elke actie een eenvoudig resultaatbericht: wat er is gebeurd, wat er is veranderd en wat er hierna beschikbaar is. De beeldende vertelling van de bot kan dit resultaat aanvullen. Bij een time-out of tegenstrijdig antwoord kan de speler met het eenvoudige bericht toch verder.
Sluit elk einde af met een nauwkeurige samenvatting. Noem het lint alleen als het is meegenomen en de ansichtkaart alleen bij de tuinroute. Gegenereerde tekst moet de verschillen behouden waarvoor de speler tijdens de sessie heeft gekozen.
Situatie — Vereist gedrag
Dubbelzinnig verzoek van de speler — Vraag om verduidelijking; behoud de status
Niet-beschikbare actie — Leg uit aan welke voorwaarde niet is voldaan; behoud de status
Ongeldig AI-actievoorstel — Wijs het af en bied geldige acties aan
Vertelling mislukt nadat een actie is vastgelegd — Toon een geschreven resultaat op basis van de vastgelegde status
Dubbele inzending — Geef het bestaande resultaat terug zonder opnieuw kosten in rekening te brengen
Opgeslagen status kan niet worden geladen — Meld het probleem en bied herstel of een expliciete herstart aan
Test eerst de regels en daarna de interpretatie van de bot
Test het spel eerst met vaste tekst. Test elke actie, elk einde en elke randvoorwaarde. Voeg daarna de bot toe en herhaal die tests met verschillende formuleringen. Zo kun je onderscheid maken tussen een gebroken regel en een verkeerd begrepen verzoek.
Nodig representatieve spelers uit om een bezorging te voltooien zonder coaching. Vraag hun vóór hun keuze uit te leggen wat ze verwachten en daarna wat volgens hen is veranderd. De gids van Nielsen Norman Group over usabilitytests waarbij deelnemers hardop denken (https://www.nngroup.com/articles/thinking-aloud-the-1-usability-tool/) raadt representatieve deelnemers en taken aan, waarbij de deelnemers zelf aan het woord blijven; de gids waarschuwt ook dat vragen van de begeleider het gedrag kunnen beïnvloeden.
Combineer observatie met het actielogboek. Noteer pogingen tot acties, verzoeken om verduidelijking, onverwachte uitkomsten en eventuele verschillen tussen de vertelling en de vastgelegde status. Vraag of spelers de opties begrepen, los van de vraag of ze het leuk vonden om ertussen te kiezen.
Beknopte checklist voor speeltests. Herstel fouten in de regels en de statusverwerking voordat je de spelwereld uitbreidt. Begrijpen spelers de keuzes maar vinden ze die oninteressant, verander dan de afwegingen. Vinden ze de beslissingen leuk maar kunnen ze de kosten niet voorzien, verbeter dan de uitleg. Breid het prototype uit wanneer de bestaande keuzes begrijpelijk blijven bij verschillende formuleringen, opgeslagen sessies en mislukte scenario's.
Opening: Kan een nieuwe speler het doel, de beschikbare tijd en de acties om het spel af te ronden herkennen?
Cyclus: Levert elke geaccepteerde actie een zichtbaar gevolg op en een geldige volgende stap of een einde?
Keuze: Kunnen spelers uitleggen waarom ze een bepaalde route of versieringsoptie hebben gekozen?
Randvoorwaarde: Slaagt het meenemen van het lint gevolgd door bezorging via de tuin precies op het moment dat de resterende tijd nul is?
Validatie: Blijft de status correct bij dubbelzinnige, herhaalde en niet-beschikbare verzoeken?
Geheugen: Blijven grondstoffen, keuzes en beschikbare acties bewaard na opslaan en opnieuw laden?
Mislukking: Eindigt een onbetaalbare bezorgsituatie duidelijk, met de mogelijkheid om opnieuw te beginnen?
Herstel: Kan het spel doorgaan als de vertelling mislukt, zonder dat er opnieuw kosten worden gerekend?
Consistentie: Komt elk einde overeen met de vastgelegde route en de status van het lint?
