Voor deze programmeeropgave gaan we het spel Go-bang programmeren, dat verdacht veel lijkt op het bekende Vier-op-een-rij. Het is de bedoeling een klasse Gobord te maken, die onder meer memberfuncties heeft als afdrukken, spelerzet en computerzet. Uiteraard heeft deze klasse ook een constructor en een destructor. Verder moeten gedane zetten met behulp van een stapel ongedaan gemaakt kunnen worden.
Het "normale" spel Vier-op-een-rij gaat als volgt. Op een 6 bij 7 bord wordt gespeeld met witte en zwarte schijfjes. Om de beurt leggen de spelers -wit W en zwart Z geheten- een schijfje met hun eigen kleur op een nog leeg vakje, en wel op het onderste lege veld uit een kolom naar keuze. Als een kolom vol is, kan hierin niet meer een schijfje gelegd worden. Wit mag altijd beginnen. Het spel is afgelopen als het bord vol is, of als één der spelers gewonnen heeft. Een speler wint als er minstens vier stenen van zijn kleur direct horizontaal naast elkaar staan, of verticaal, of diagonaal. Bij Go-bang mag de speler die aan de beurt is zijn/haar schijf steeds op een willekeurige plaats neerleggen, dus niet noodzakelijk onderin een kolom.
We spelen het spel als volgt. Allereerst mag de speler zijn/haar kleur kiezen; de computer speelt dan voor de andere kleur. Daarna kiest de speler de strategie van de computer. De computer kan naar keuze van de speler namelijk op één van twee nivo's spelen:
Schrijf een constructor voor de klasse Gobord die
een pointerstructuur aanlegt,
waarbij ieder vakje, naast bijvoorbeeld een char als inhoud,
tevens een array met 8 pointers naar
de onmiddellijke buren heeft: linksboven, middenboven,
rechtsboven, rechts, rechtsonder,
middenonder, linksonder en links. De vakjes aan de randen
bevatten uiteraard diverse NULL-pointers.
Het bord is dus niet een m bij n array,
maar een zeer ingewikkelde pointerstructuur.
Alle tussenstanden moeten
op een stapel worden bijgehouden, en spelerzetten kunnen
daarmee zelfs herhaald teruggenomen worden.
Hiertoe moeten dus alle standen
(en niet de zetten) worden onthouden,
of liever gezegd: zodra de speler zet, wordt de oude stand opgeslagen.
Er moet dus een memberfunctie kopieer
gemaakt worden, die de gehele pointerstructuur kopieert!
Verder dient er een recursieve memberfunctie
vervolg geschreven te worden
die gegeven een zekere stand het totale
aantal mogelijke vervolgpartijen, dat overigens erg groot
kan zijn, uitrekent.
Hiervoor moeten alle mogelijke
zetten van beide spelers doorgerekend worden.
Dit onderdeel is zeker niet eenvoudig;
mocht het ontbreken, dan kost dat een halve punt.
Enkele algemene opmerkingen:
Uiterste inleverdatum:
voor voltijdstudenten: vrijdag 10 december 1999, 17.00 uur;
voor deeltijdstudenten: vrijdag 17 december 1999.
In te leveren: schijfje met de C++-files en
de makefile
(of het programma en de makefile per email aan de nakijker
(dagstudenten: hoen@liacs.nl; avondstudenten:
kosters@liacs.nl) sturen)
en listing op papier;
beide in de bak in de metalen boekenkast achterin
de gang bij de Indyzaal.
Overal duidelijk de datum en de namen van de makers vermelden.
Te gebruiken compiler: als het maar C++ is.
Normering: layout 1; commentaar 2; modulariteit en OOP 3; werking 4.
Vragen en/of opmerkingen kunnen worden gestuurd naar: kosters@liacs.nl.
9 november 1999 - http://www.liacs.nl/home/kosters/pm/op4pm99.html