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.
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.
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.
De eerste speler die geen zet meer kan doen, verliest het spel. Gelijkspel is niet mogelijk.
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:
amazones
: Een object (Object
) dat de positie van elke amazone
op het spelbord afbeeldt op de letter (String
) waarmee de amazone aangeduid
wordt. Aangezien de eigenschappen van objecten enkel strings (String
)
kunnen zijn, stellen we hierbij posities voor als strings "{r}-{k}"
,
waarbij {r}
en {k}
resp. de rij en kolom aanduiden.pijlen
: een array (Array
) met de posities (Array
) van alle pijlen op
het spelbord, in de volgorde waarin ze afgeschoten werden.Daarnaast moet een spel (Amazones
) minstens ook de volgende methoden
ondersteunen:
toString
die een stringvoorstelling (String
) van
het spelbord teruggeeft. Daarin vormt elke rij een afzonderlijke
regel, worden lege velden voorgesteld door een underscore (_
),
velden waarop een pijl geland is door een asterisk (*
) en velden
met een amazone door de corresponderende letter.positie
waaraan de letter (String
) van een amazone
moet doorgegeven worden. De methode moet de positie van de amazone
op het spelbord teruggeven.mogelijkeRichtingen
waaraan de letter (String
) van
een amazone moet doorgegeven worden. De methode moet een array
(Array
) teruggeven met alle richtingen (String
) waarin de
amazone minstens één veld kan verzet worden (of een pijl kan
afschieten, want dat is hetzelfde). De richtingen moeten in wijzerzin
opgelijst worden, te beginnen in het noorden (N
).verzetAmazone
waaraan drie argumenten moeten
doorgegeven worden: i) de letter (String
) van een amazone,
ii) een richting (String
) en iii) een getal \(n \in
\mathbb{N}_0\) (Number
). De methode moet de amazone \(n\) velden
verzetten in de gegeven richting en een verwijzing teruggeven naar
het object waarop de methode werd aangeroepen. Als dat niet kan,
dan moet de amazone blijven staan en moet de methode een
AssertionError
opwerpen met de boodschap ongeldige zet
.schietPijl
waaraan drie argumenten moeten doorgegeven
worden: i) de letter (String
) van een amazone, ii) een
richting (String
) en iii) een getal \(n \in \mathbb{N}_0\)
(Number
). De methode moet de amazone een pijl laten afschieten
over \(n\) velden in de gegeven richting en een verwijzing
teruggeven naar het object waarop de methode werd aangeroepen. Als
dat niet kan, dan moet er geen pijl afgeschoten worden en moet de
methode een AssertionError
opwerpen met de boodschap ongeldige
zet
.winnaar
waaraan geen argumenten moeten doorgegeven
worden. De methode moet een getal (Number
) teruggeven dat
aangeeft wie het spel wint: er is nog geen winnaar (0
), wit wint
(1
) of zwart wint (2
).> 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