Alternatieve Opdracht
We gaan een eenvoudig spelletje implementeren met behulp
van het minimax-algoritme. Deze opdracht mag je maken in plaats van opdrachten 4 en 5, maar vergt wel programmeerervaring. Ook kan deze opdracht, vanwege zijn grootte, niet door de compensatieopdracht worden vervangen. Denk dus goed na voor je hieraan begint (zijn er nog lezers?).
De interface van het onderstaande spel hoeft niet denderend te zijn, maar wel overzichtelijk. Het gaat ons uiteraard voornamelijk om de code en de functionaliteit. De keuze voor de taal is redelijk vrij; C++, java, pascal.... Laat ons gelijk weten wat je van plan bent, dan kunnen wij je vertellen of we het ook kunnen nakijken.
Kalah: de spelregels
Kalah is een afrikaans bordspelletje, waarin gebruik gemaakt wordt van
een "bord", dat bestaat uit 14 kuiltjes: 12 kleine kuiltjes, en 2 grote
kuilen, de "Kalahs". In elk van deze kuiltjes kan een aantal steentjes
liggen. Bij het begin van het spel zijn beide Kalah's leeg, en ligt in
elk klein kuiltje een zelfde aantal. Dit aantal kan varieren van 3 tot
8, hoe meer steentjes, des te langer het spel duurt en gecompliceerder het is.
Beginsituatie met drie steentjes

Zoals te zien is, zijn de kuiltjes in een soort rechthoek geplaatst. Elke
speler heeft zes kleine kuiltjes en een Kalah. Doel van het spel is
om zoveel mogelijk steentjes in je eigen kalah te krijgen. Het
spel is dan ook afgelopen als een van beide spelers meer dan de helft van
het totale aantal steentjes in zijn Kalah heeft.
Het doen van zetten
Spelers doen om de beurt een zet. Een zet bestaat uit het z.g. zaaien.
Dit doe je door een van je eigen kleine kuiltjes leeg te halen, en
deze over de andere kuiltjes uit te zaaien.
Het zaaien begint bij het kuiltje direct rechts van de
beginkuil, en gaat verder tegen de klok in. Dit is inclusief je eigen
kleine kuiltjes, je eigen kalah en de kleine kuiltjes van de tegenstander,
maar exclusief de Kalah van je tegenstander. Een voorbeeld:

In deze situatie kiest speler 1 kuiltje zes om te zaaien. Hij begint met
1 in zijn eigen kalah te gooien, vervolgens 1 in elk van de tegenstanders
kleine kuiltjes, en tenslotte in de kleine kuiltjes van hemzelf,
eindigend in zijn eigen kalah. De bordsituatie is vervolgens:

Merk op dat er in de Kalah's alleen maar steentjes bijkomen, aangezien je
niet vanuit de kalah kunt zaaien.
Speciale zetten
Bij het zaaien kan er sprake zijn van twee speciale gevallen. Deze
hebben beide betrekking op het laatste steentje dat je zaait.
Het eerste speciale geval is als het laatste steentje in
een van je eigen kleine kuiltjes terecht komt, nadat je ook eerst in je
tegenstanders kuiltjes hebt gezaaid. Indien het kuiltje waar je uitkomt
niet leeg is, pak je de inhoud van dit kuiltje en zaai je hiermee verder
(inclusief het ene steentje van de vorige "zaaiing").
Een voorbeeld:
Als je hier kuiltje 6 speelt, dan kom je uit in kuiltje 3 aan je eigen kant,
en zaai je hiermee verder. Het resultaat is:

Het tweede speciale geval is, als het laatste steentje in een klein
kuiltje van je tegenstander terecht komt. Indien met dit steentje
het totaal aantal steentjes in dat kuiltje op 2 of 3 komt, mag je
de inhoud van dat kuiltje in je eigen Kalah gooien. Indien het
kuiltje direct ervoor ook 2 of 3 steentjes bevat, mag je die ook
in je Kalah gooien enzovoort. Het is dus in theorie mogelijk in een
zet al je tegenstanders kleine kuiltjes te legen!
Een voorbeeld van zo'n meervoudige "slag":

Als je hier kuiltje 6 leegt, kom je uit in het vierde kuiltje van
je tegenstander, dat daarmee twee steentjes bevat. Deze mag je in je
kalah gooien. Het kuiltje ervoor bevat echter 3 steentjes, dus die
mag ook in de kalah, evenals die daarvoor met 2 steentjes.
Eindresulaat:
Einde van het spel
Het spel is beeindigd indien een van beide spelers meer dan de helft van
de steentjes in zijn bezit heeft. Indien een speler niet meer kan zetten
omdat al zijn kleine kuiltjes leeg zijn, mag de andere speler wat
hij nog in zijn kleine kuiltjes heeft in zijn Kalah gooien, en wint
degene met de meeste steentjes.
Opdracht
Schrijf allereerst een programma waarmee twee menselijke spelers het spel kunnen spelen, en lever dit uiterlijk vrijdag 12 maart in. Hierna ga je het programma uitbreiden zodat het spel een rol van een speler kan overnemen. Zorg dus ook dat er twee computerspelers tegen elkaar kunnen spelen. Gebruik hiervoor het minimax-algorithme. Gebruik als statische
evaluatiefunctie bijvoorbeeld het aantal steentjes uit de eigen Kalah minus dat uit
de vijandelijke Kalah.
Zorg ook dat je kunt instellen hoeveel beurten er vooruit wordt gedacht.
Inleveren:
Lever je code in, voorzien van commentaar!! (Onvoldoende commentaar zorgt ervoor dat je een onvoldoende krijgt. duh).
Lever ook een gecompileerd programma in, dat scheelt ons weer.