PRAKTICUMOPGAVE 2

De tweede practicumopgave is het maken van een programma om het spel "Reversi" te spelen, zoals hieronder omschreven.

Het practicum moet in groepjes van twee worden gemaakt en ingeleverd. Steekproefsgewijs kan aan beide auteurs om een toelichting worden gevraagd. Overnemen van (delen van) programma's van anderen of van Internet is niet toegestaan.

De uitwerking van deze opdracht moeten worden ingeleverd met behulp van het automatische inleversysteem Submit. Kies als opgave-naam: Imperatief programmeren - Reversi. Maak een zip-file (of een 7z-file, of een rar-file) van de hele project-directory, met uitzondering van de subdirectories "bin" en "obj", en lever die in.

Het spel "Reversi"

Het spel wordt gespeeld op een bord met vierkante velden. De twee spelers kunnen de beurt een blauwe, respectievelijk een rode steen neerzetten op een vrij veld.
Aan het begin van het spel liggen er al twee blauwe en twee rode stenen op het bord, volgens het volgende patroon (hier getoond op een bord met 6x6 velden, maar het spel kan ook gespeeld worden op een bord met andere afmetingen).

Spelers zijn niet helemaal vrij in hun keuze waar ze een steen kunnen zetten. Blauw mag een steen alleen maar neerzetten, als daarmee een of meer rode stenen worden ingesloten tussen de nieuwe steen en een van de al op het bord liggende blauwe stenen. Het insluiten kan horizontaal, vertikaal of diagonaal gebeuren. Bijvoorbeeld, in de beginsituatie heeft blauw (die als eerste aan zet is) de keus uit de volgende velden:

Door het doen van de zet veranderen alle stenen van de tegenspeler die met die zet worden ingesloten in de eigen kleur. Bijvoorbeeld, als blauw in de beginsituatie voor de "bovenste" van de vier mogelijkheden kiest, dan wordt de ingesloten, direct daaronder liggende rode steen blauw. Daarna is rood aan zet, die drie mogelijkheden heeft om een blauwe steen in te sluiten.

Na nog een tijdje spelen kan de situatie onstaan zoals hier links onder getekend is. Rood is aan zet, en kiest bijvoorbeeld voor het veld aangegeven met het gele rondje. De twee blauwe stenen er diagonaal rechtsboven (aangegeven met een geel vierkantje) worden ingesloten, maar ook de blauwe steen er recht boven (aangegeven met een groen vierkantje). Die worden dus allemaal rood, en de eindsituatie is zoals hier rechts onder getekend is. Merk op dat als gevolg van het veranderen van kleur weer andere blauwe stenen ingesloten raken (zoals die aangegeven met het gele vierkantje), maar die veranderen niet van kleur: bij het insluiten moet de nieuw neergezette steen betrokken zijn.
      

In zeldzame gevallen kan het gebeuren dat een speler geen zet kan doen, omdat er geen enkele mogelijkheid is om stenen van de andere partij in te sluiten. De speler moet dan passen, en de andere speler is weer aan de beurt. Kan ook de andere speler geen zet doen, dan is het spel afgelopen. Winnaar is dan degene met de meeste stenen op het bord (bij gelijk aantal is de uitslag "remise").

Het programma

Het programma moet een een userinterface hebben dat de volgende dingen toont:

Standaard moet het bord 6x6 velden bevatten, maar aantal rijen en het aantal kolommen van het bord moet door het aanpassen van twee constante-declaraties in het programma gewijzigd kunnen worden (minimaal 3x3, anders is het spel meteen afgelopen!). Het bord kan ook langwerping worden.

De beginstand staat altijd in het midden van een bord, of (bij een oneven aantal rijen of kolommen) vlakbij het midden.

Met de knop "nieuw spel" kan de gebruiker op elk moment een nieuw spel starten. Door het indrukken van de "help"-knop geeft het programma aan op welke velden een zet gedaan mag worden. Nogmaals indrukken van de "help"-knop schakelt deze functie weer uit.

Door met de muis op een veld van het bord te klikken kan de gebruiker een zet doen voor de partij die aan de beurt is. Het moet natuurlijk wel een toegestane zet zijn, anders wordt de zet niet geaccepteerd. (De twee spelers zullen dus om de beurt de muis moeten bedienen. Je hoeft niet "tegen de computer" te kunnen spelen).

De afbeeldingen hieronder tonen een voorbeeld hoe het scherm er uit kan zien aan het begin, en na een tijdje met aanschakelen van de help-functie. De layout in deze voorbeelden is tamelijk rudimentair; in je eigen programma mag het er wel wat mooier uitzien.
      

Hints