PlayPendium

Salvo · Voer voor de geest

Binnenin Salvo

Onder het simpele klikken op vakjes schuilt een deterministische engine die verborgen vloten, op waarschijnlijkheid gewogen redeneringen en het klassieke duel van verbergen en ontdekken modelleert. 3

In het Engels geschreven en geredigeerd. Deze Nederlandse versie is met machinevertaling gemaakt; waar precisie ertoe doet, is het Engelse origineel leidend. Lees het origineel in het Engels →

De twee borden

In het hart van het spel zit een paar Board-objecten: het ene stelt jouw verborgen opstelling voor, het andere de verborgen opstelling van de tegenstander. Elk bord draagt een vloot schepen die op een gelinieerd raster zijn geplaatst, maar de posities blijven voor de andere kant verborgen. Jij vuurt op het vijandelijke raster terwijl de AI op het jouwe vuurt, en elk schot raakt óf een schip, óf valt in leeg water. Deze architectuur met twee borden legt de fundamentele informatieasymmetrie van het duel met verborgen vloten vast: elke kant kent zijn eigen bord volledig, maar kan de opstelling van de ander alleen afleiden uit het patroon van zijn schoten. 3

De symmetrie van deze opzet is wat het spel zijn karakter geeft. Geen van beide kanten ziet de schepen van de ander rechtstreeks. In plaats daarvan moeten beide kanten een mentaal model van het verborgen raster opbouwen uit de schaarse terugkoppeling van treffers en missers. Elk schot wordt data, elke treffer verkleint het aantal mogelijkheden en elke misser streept gebied weg. De spelcoördinator van de engine beheert deze twee borden en zorgt ervoor dat schoten worden vastgelegd, dat treffers correct worden toegeschreven en dat het spel pas eindigt wanneer de volledige vloot van een van beide kanten tot zinken is gebracht. 3

Een deterministisch model maakt van blind raden een geïnformeerde zoektocht.

Willekeurige opstelling, deterministische regels

Voordat het spel begint, roept de engine randomFleet aan om de schepen van de AI op een willekeurige manier neer te leggen. Die willekeur is niet lukraak: ze is geseed, wat betekent dat een gegeven seedwaarde altijd dezelfde opstelling oplevert. Dit geseede determinisme is een ontwerpkeuze die het spel reproduceerbaar en testbaar maakt. Als je het spel met dezelfde seed draait, krijg je dezelfde scheepsposities, dezelfde reeks AI-beslissingen en dezelfde uitkomst. Die eigenschap is waardevol bij het debuggen en om te begrijpen hoe de AI zich onder verschillende omstandigheden gedraagt. 3

Zodra de vloot is opgesteld, liggen de regels die het spel bepalen vast en zijn ze deterministisch. De AI gooit geen dobbelstenen en de engine brengt halverwege het spel geen willekeur in. Elke beslissing die de AI neemt, volgt uit het waarschijnlijkheidsmodel dat hij bijhoudt, en elk schot dat jij afvuurt wordt vastgelegd en geanalyseerd. De enige bron van variatie is de seed die de beginopstelling van de vloot bepaalt. Dat betekent dat het spel uiteindelijk een puzzel is: kun jij, binnen de grenzen van de regels en met de terugkoppeling van de schoten, de verborgen opstelling afleiden voordat de AI die van jou afleidt? 3

Het schot afvuren

Wanneer je een schot afvuurt, legt de engine het vast op het doelbord en controleert hij of het schot raak of mis was. Dat gebeurt via de functie fire, die de toestand van het bord bijwerkt en de uitkomst bepaalt. Een treffer markeert het vakje als bezet door een schip, een misser markeert het als leeg water. Vervolgens controleert de engine of het schip waartoe dat vakje behoort volledig tot zinken is gebracht, door al zijn vakjes na te lopen. Als alle vakjes van een schip zijn geraakt, is het schip gezonken, en die informatie wordt aan beide kanten meegedeeld. 3

De winvoorwaarde is eenvoudig maar ingrijpend. Een kant wint wanneer alle schepen van de tegenstander gezonken zijn. Dat wordt gecontroleerd via de functie allSunk, die nagaat of elk schip op het bord van de tegenstander volledig is geraakt. Het spel eindigt onmiddellijk zodra aan die voorwaarde is voldaan. Dit alles-of-niets-karakter van de winvoorwaarde betekent dat elk schot telt, en dat de druk om schepen snel tot zinken te brengen wordt afgewogen tegen de noodzaak om je eigen opstelling niet prijs te geven. 3

De AI jaagt op waarschijnlijkheid en maakt af door te richten.

De waarschijnlijkheidsengine

De tegenstander in dit spel is geen simpele willekeurige schutter. Het is een AI die op waarschijnlijkheid richt en afweegt hoe groot de kans is dat elk verborgen vakje een schip bevat. De AI houdt een waarschijnlijkheidsmodel van het vijandelijke raster bij en werkt dat bij naarmate er schoten worden afgevuurd en terugkoppeling binnenkomt. Vakjes die vanwege de plaatsingsbeperkingen van de resterende schepen geen schip kunnen bevatten, worden als onwaarschijnlijk gemarkeerd, terwijl vakjes die wel een schip moeten bevatten om de resterende plaatsingen mogelijk te maken, als waarschijnlijk worden gemarkeerd. De AI vuurt vervolgens op het vakje met de hoogste waarschijnlijkheid, en verandert zo blind gokken in gericht zoeken. 3

Dit waarschijnlijkheidsmodel is geworteld in de wiskunde van de kansrekening, waarin gebeurtenissen worden beschreven met getallen tussen nul en één 2. Een kans van nul betekent dat een gebeurtenis niet kan plaatsvinden, een kans van één dat ze moet plaatsvinden. De AI gebruikt deze getalsmatige beschrijvingen om zijn schoten te sturen, met een voorkeur voor vakjes waar de kans om een schip te vinden het grootst is. Die aanpak is wat de AI onderscheidt van een puur willekeurige schutter en hem zijn kenmerkende jachtgedrag geeft.

Jagen en richten

Het gedrag van de AI laat zich in twee fasen beschrijven: jagen en richten. In de jachtfase zoekt de AI naar schepen door te vuren op de vakjes waar onontdekte schepen het meest waarschijnlijk liggen. Dit is een brede zoektocht die erop gericht is het eerste contact met vijandelijke schepen te maken. Zodra een treffer is geregistreerd, gaat de AI over naar de richtfase, waarin hij zich concentreert op de vakjes naast de treffer om dat schip helemaal tot zinken te brengen. Deze aanpak in twee fasen weerspiegelt hoe menselijke spelers het spel benaderen: eerst de schepen vinden, dan tot zinken brengen. 3

De overgang tussen jagen en richten wordt bepaald door de vraag of het laatste schot raak of mis was. Als het laatste schot mis was, keert de AI terug naar de jachtmodus en zoekt hij naar de vakjes met de hoogste waarschijnlijkheid. Als het laatste schot raak was, gaat de AI in de richtmodus en vuurt hij op de vakjes naast de treffer. Deze simpele regel, gecombineerd met het waarschijnlijkheidsmodel, levert een samenhangende strategie op die verkennen en benutten in balans houdt. De AI verkent het raster om schepen te vinden en benut zijn kennis van een treffer om dat schip efficiënt tot zinken te brengen. 3

Drie moeilijkheidssterktes stemmen het gedrag van de AI af.

Drie sterktes

De AI heeft drie moeilijkheidssterktes die zijn gedrag afstemmen. Deze sterktes beïnvloeden hoe de AI waarschijnlijkheden weegt en beslissingen neemt. Op lagere sterktes kan de AI meer fouten maken of minder agressief richten. Op hogere sterktes is de AI consequenter in zijn waarschijnlijkheidsberekeningen en meedogenlozer in zijn richten. Deze variatie in sterktes laat spelers een uitdagingsniveau vinden dat bij hen past, van ontspannen spel tot serieuze competitie.

De precieze implementatie van deze sterktes zit in het AI-onderdeel van de engine, de klasse SalvoAI. De moeilijkheidsniveaus veranderen hoe de AI het waarschijnlijkheidsmodel interpreteert en hoe hij verkennen tegen benutten afweegt. Dit ontwerp maakt de AI zowel toegankelijk voor gelegenheidsspelers als uitdagend voor ervaren spelers, zonder de fundamentele mechanismen van het spel te veranderen. 3

Sonarping

Bovenop de klassieke regels zit een twist: de sonarping. Met deze vaardigheid kan een kant een 3×3-uitlezing van het vijandelijke raster onthullen, ten koste van het schot van die beurt. De sonarping onthult of elk vakje in het 3×3-gebied een schip bevat of leeg water is. Die informatie kan van onschatbare waarde zijn om de positie van schepen in te perken, maar het kost je je schot van die beurt. 3

De beslissing om de sonarping te gebruiken is een strategische. Wanneer is de informatie de prijs waard? Als je moeite hebt om schepen te vinden, kan de sonarping de doorbraak opleveren die je nodig hebt. Als je op het punt staat een schip tot zinken te brengen, kan de prijs van een verloren schot te hoog zijn. De sonarping voegt een laag van middelenbeheer aan het spel toe en dwingt spelers om de waarde van informatie af te wegen tegen de waarde van actie. 3

Verplaatsen is een eenmalige defensieve optie.

Eenmaal per spel verplaatsen

Een andere twist op de klassieke regels is het verplaatsen, eenmaal per spel. Elke kant mag tijdens het spel één keer een van zijn eigen schepen verplaatsen. Deze verdedigende ontwijking kost geen beurt, wat betekent dat je kunt verplaatsen en in dezelfde beurt nog steeds een schot kunt afvuren. Met de verplaatsvaardigheid kun je een schip uit de gevarenzone halen wanneer het bedreigd wordt, of het naar een beter te verdedigen plek verhuizen. 3

De verplaatsvaardigheid is een eenmalige optie, en juist dat maakt haar kostbaar. Wanneer moet je haar gebruiken? Als een schip op het punt staat te zinken, kan verplaatsen het redden. Als je vertrouwen hebt in je huidige opstelling, is verplaatsen misschien verspilling. De beslissing om te verplaatsen is een strategische, die een zorgvuldige afweging vergt van de huidige stand van het spel en de waarschijnlijke acties van je tegenstander. 3

Eén schot per beurt

Onder al deze mechanismen ligt de klassieke regel van één schot per beurt. Elke kant vuurt precies één schot per beurt af, om en om. Deze regel bepaalt het ritme van het spel en zorgt ervoor dat beide kanten evenveel gelegenheid hebben om te handelen. De regel van één schot per beurt is wat het spel tot een duel van vernuft maakt in plaats van een race om snelheid. 3

Deze klassieke regel verankert het spel in de traditie van zeeslag, een strategisch raadspel voor twee spelers dat op gelinieerde rasters wordt gespeeld, waarbij de vloot van elke speler voor de tegenstander verborgen blijft 1. De regel van één schot per beurt is wat het spel tot een test van deductie en waarschijnlijkheid maakt in plaats van een test van reflexen. Het is een simpele regel, maar wel een die het spel zijn karakter en zijn uitdaging geeft.

Puur determinisme maakt het spel testbaar.

Geseed determinisme

De engine is puur en geseed-deterministisch, aangedreven door zijn eigen geseede toevalsgenerator. Dat betekent dat elk aspect van het spel wordt bepaald door de seedwaarde die aan het begin wordt meegegeven. Bij dezelfde seed levert het spel altijd dezelfde reeks gebeurtenissen op, van de beginopstelling van de vloot tot het laatste schot. Die eigenschap maakt het spel testbaar, omdat hetzelfde scenario kan worden gereproduceerd en onderzocht. 3

Geseed determinisme heeft ook gevolgen voor het begrijpen van het spel. Als je wilt weten hoe de AI zich in een bepaald scenario gedraagt, kun je het spel met een specifieke seed draaien en de uitkomst observeren. Als je een bepaalde strategie wilt testen, kun je het spel meerdere keren met dezelfde seed draaien en zien hoe ze presteert. Die reproduceerbaarheid is een waardevolle eigenschap voor zowel spelers als ontwikkelaars.

Sources & notes

  1. "Battleship (game)," Wikipedia, a strategy-type guessing game for two players, played on ruled grids on which each player's fleet of warships is marked and concealed from the opponent; players alternate calling shots at the other's grid to hit and sink ships, aiming to sink the entire fleet; the game evolved from a pencil-and-paper game dating to around the World War I era; the first commercial version was called Salvo, published by the Starex company in 1931, and in 1967 Milton Bradley published a version using plastic pegboards and miniature ships; and in the "salvo" variant a specified number of squares are targeted at one time, all attacked simultaneously. en.wikipedia.org/wiki/Battleship_(game).
  2. "Probability," Wikipedia, a branch of mathematics concerning numerical descriptions of how likely events are to occur; the probability of an event is a number between 0 and 1, where 0 indicates impossibility and 1 indicates certainty, and the larger the probability the more likely the event (for example, a fair coin flip has probability 0.5 for each outcome). en.wikipedia.org/wiki/Probability.
  3. This game's engine: a Battleship game where each side has a Board with a hidden fleet, the human fires at the enemy fleet and the AI at the human's, one shot per turn (classic rules), fire records a hit or miss, and a side wins when the opponent's ships are all sunk (allSunk); the opponent is a probability-targeting SalvoAI with three difficulty strengths that "hunts" for ships by favouring the cells where an undiscovered ship is most likely to sit and then "targets" the neighbours of a hit to finish it; two twists sit on the classic rules, a sonar ping reveals a 3×3 ship/empty readout but costs that turn's shot, and each side may reposition one of its own ships once per game (a dodge that does not cost the turn); and the engine is pure and seeded-deterministic.
  4. Further reading on Probability, Interpretations of Probability (Stanford Encyclopedia of Philosophy/Winter 2012 Edition). plato.stanford.edu.
  5. Further reading on Probability, Probability -- from Wolfram MathWorld. mathworld.wolfram.com.
  6. Further reading on Probability, Logical foundations and measurement of subjective probability. doi.org.
Was this worth reading?
← Back to Salvo
PlayPendium · About · Contact · Privacy · Terms · Cookies · Accessibility · Copyright · Browse all games · Inspirations · © 2026