Amazones is een strategiespel voor twee spelers. Het wordt gespeeld op een dambord dat de vorm heeft van een \(10 \times 10\) rooster. De twee spelers zijn wit en zwart. Elke speler heeft vier amazones die in de volgende beginopstelling op het spelbord gezet worden.

beginopstelling
Beginopstelling van een spelletje Amazones.
beginopstelling (letters)
Beginopstelling van een spelletje Amazones, waarbij de amazones aangeduid worden door letters.

Er is ook een voorraad schijven nodig die pijlen voorstellen. Om naar de velden op het spelbord te kunnen verwijzen, worden de rijen van boven naar onder genummerd en de kolommen van links naar rechts, telkens vanaf nul. De amazones van de spelers worden aangeduid met letters, zoals aangegeven in de rechter figuur: witte amazones worden aangeduid met kleine letters (a, b, c en d) en zwarte amazones met hoofdletters (A, B, C en D).

Wit is eerst aan zet en daarna komen de spelers afwisselend aan zet. Elke zet bestaat uit twee delen. Eerst moet één van de eigen amazones over één of meer lege velden in een rechte lijn verzet worden (horizontaal, verticaal of diagonaal). Dat is dezelfde manier van bewegen als de koningin bij het schaken. Bij het verzetten mag een amazone geen velden kruisen of betreden die bezet wordt door een amazone (van gelijk welke kleur) of door een pijl.

richtingen
Een amazone kan in acht richtingen horizontaal, verticaal en diagonaal bewegen, net zoals een koningin op het schaakbord. De richtingen worden voorgesteld door N, NO, O, ZO, Z, ZW, W en NW.

Na het verzetten van een amazone, schiet die amazone een pijl af vanaf haar landingsplaats naar een ander veld, opnieuw in één van de bewegingsrichtingen van een koningin op het schaakbord. Deze pijl kan dus horizontaal, verticaal of diagonaal afgeschoten worden (zelfs achteruit langs hetzelfde pad dat de amazone zojuist heeft afgelegd, naar of over haar startveld indien gewenst). Net als een amazone, kan een pijl geen velden kruisen of betreden waar een andere pijl geland is of waar er een amazone staat (van gelijk welke kleur). Het veld waar de pijl landt, wordt aangeduid met een (neutrale) schijf om aan te geven dat het veld bezet is en dus niet langer kan betreden of gekruist worden.

wit zet
Een mogelijke eerste zet van wit: amazone a wordt 2 velden verzet in zuidoostelijke (ZO) richting en schiet een pijl af over 6 velden in noordoostelijke (NO) richting.
wit wint
Zwart zit volledig ingesloten en kan geen volgende zet meer doen. Wit wint het spel.

De eerste speler die geen zet meer kan doen, verliest het spel. Gelijkspel is niet mogelijk.

Opgave

De positie van een veld op het spelbord wordt voorgesteld door een array \([r, k]\), waarbij \(r \in \mathbb{N}\) (Number) het rijnummer en \(k \in \mathbb{N}\) (Number) het kolomnummer aanduidt.

De acht richtingen waarin amazones zich kunnen verplaatsen en pijlen kunnen afschieten, worden aangeduid door één of twee hoofdletters (String) zoals aangegeven in de figuur uit de inleiding die illustreert hoe de koningin in het schaakspel kan bewegen.

Definieer een klasse Amazones waarmee het spelverloop van een spelletje Amazones kan gesimuleerd worden. Bij het aanmaken van een nieuw spel (Amazones) moeten er geen argumenten doorgegeven worden: het spel heeft altijd dezelfde beginopstelling. Elk spel (Amazones) moet minstens de volgende eigenschappen hebben:

Daarnaast moet een spel (Amazones) minstens ook de volgende methoden ondersteunen:

Voorbeeld

> const spelbord = new Amazones()
> spelbord.amazones
{"3-0": "A", "6-0": "a", "0-3": "B", "9-3": "b", "0-6": "C", "9-6": "c", "3-9": "D", "6-9": "d"}
> spelbord.pijlen
[]
> console.log(spelbord.toString())
___B__C___
__________
__________
A________D
__________
__________
a________d
__________
__________
___b__c___
> spelbord.winnaar()
0
> spelbord.positie("a")
[ 6, 0 ]
> spelbord.mogelijkeRichtingen("a")
[ "N", "NO", "O", "ZO", "Z" ]
> spelbord.verzetAmazone("a", "W", 3)
Uncaught { name: "AssertionError", message: "ongeldige zet" }
> console.log(spelbord.verzetAmazone("a", "ZO", 2).toString())
___B__C___
__________
__________
A________D
__________
__________
_________d
__________
__a_______
___b__c___
> spelbord.amazones
{"3-0": "A", "0-3": "B", "9-3": "b", "0-6": "C", "9-6": "c", "3-9": "D", "6-9": "d", "8-2": "a"}
> spelbord.positie("a")
[ 8, 2 ]
> spelbord.mogelijkeRichtingen("a")
["N",  "NO", "O", "Z",  "ZW", "W", "NW"]
> spelbord.schietPijl("a", "ZO", 1)
Uncaught { name: "AssertionError", message: "ongeldige zet" }
> console.log(spelbord.schietPijl("a", "NO", 6).toString())
___B__C___
__________
________*_
A________D
__________
__________
_________d
__________
__a_______
___b__c___
> spelbord.pijlen
[ [ 2, 8 ] ]
> spelbord.winnaar()
0
> spelbord.positie("C")
[ 0, 6 ]
> spelbord.mogelijkeRichtingen("C")
[ "O", "ZO", "Z", "ZW", "W" ]
> console.log(spelbord.verzetAmazone("C", "O", 3).schietPijl("C", "ZW", 2).toString())
___B_____C
__________
_______**_
A________D
__________
__________
_________d
__________
__a_______
___b__c___
> spelbord.amazones
{"3-0": "A", "0-3": "B", "9-3": "b", "9-6": "c", "3-9": "D", "6-9": "d", "8-2": "a", "0-9": "C"}
> spelbord.pijlen
[ [ 2, 8 ], [ 2, 7 ] ]
> spelbord.positie("C")
[ 0, 9 ]
> spelbord.mogelijkeRichtingen("C")
[ "Z", "ZW", "W" ]
> spelbord.winnaar()
0
> spelbord.verzetAmazone("c", "N", 3).schietPijl("c", "N", 4)
> spelbord.verzetAmazone("D", "N", 2).schietPijl("D", "Z", 1)
> spelbord.verzetAmazone("a", "NW", 2).schietPijl("a", "NO", 4)
> spelbord.verzetAmazone("B", "O", 5).schietPijl("B", "W", 1)
> spelbord.verzetAmazone("b", "N", 3).schietPijl("b", "N", 4)
> spelbord.verzetAmazone("A", "NO", 2).schietPijl("A", "Z", 1)
> spelbord.verzetAmazone("a", "N", 4).schietPijl("a", "O", 1)
> console.log(spelbord.verzetAmazone("A", "O", 6).schietPijl("A", "W", 1).toString())
_______*BC
_______*AD
a****_****
__________
__________
__________
___b__c__d
__________
__________
__________
> spelbord.amazones
{"6-9": "d", "0-9": "C", "6-6": "c", "1-9": "D", "0-8": "B", "6-3": "b", "2-0": "a", "1-8": "A"}
> spelbord.pijlen
[[ 2, 8 ], [ 2, 7 ], [ 2, 6 ], [ 2, 9 ], [ 2, 4 ], [ 0, 7 ], [ 2, 3 ], [ 2, 2 ], [ 2, 1 ], [ 1, 7 ]]
> spelbord.mogelijkeRichtingen("A")
[]
> spelbord.winnaar()
1