Tic Tac Toe

In deze opgave zul je het spel Tic Tac Toe, in het Nederlands bekend als Boter-kaas-en-eieren1 maken. Als je niet meer goed weet hoe dit spel werkt, kan je het zelf spelen door in Google “TicTacToe” te zoeken.

Spelregels

Opgave - Deel 1

Schrijf een Java-klasse TicTacToe. Deze klasse stelt een spelbord voor en moet volgende constructor en minstens volgende methoden bevatten. Je bent volledig vrij om de nodige instantievariabelen te kiezen en het is ook toegelaten (en aangeraden!) om extra methodes toe te voegen, dit kan je helpen bij het zoeken naar fouten. Merk op dat deze methoden gebruikmaken van een TicTacToePlayer-enum. Deze kan je hier2 downloaden, het is de bedoeling dat je deze lokaal in dezelfde map plaatst als de TicTacToe klasse, maar je hoeft deze niet in te dienen.

Constructor

De constructor heeft geen argumenten.

public TicTacToe()

Methodes

Je klasse moet minstens onderstaande methoden hebben. Deze zijn gerangschikt in alfabetische volgorde, niet volgens moeilijkheid.

getCell()

public TicTacToePlayer getCell(int row, int column)

Deze methode vraagt de waarde van de cel op rij row, kolom column op. Merk op dat zowel de rij als de kolom waarden tussen 1 en 3 aannemen (en dus niet van 0 tot 2). Indien de cel leeg is, moet de methode null teruggeven.

getCurrentTurn()

public TicTacToePlayer getCurrentTurn()

Deze methode geeft weer welke speler momenteel aan de beurt is.

getWinner()

public TicTacToePlayer getWinner()

Deze methode geeft de winnaar van het spel terug. Indien het spel nog niet is afgelopen (en er dus nog geen winnaar is), of als het spel eindigde op een gelijkspel, moet deze methode null teruggeven.

isEmpty()

public boolean isEmpty(int row, int column)

Deze methode controleert of de cel op rij row, kolom column leeg is. Merk op dat zowel de rij als de kolom waarden tussen 1 en 3 aannemen (en dus niet van 0 tot 2). Indien de cel leeg is, moet de methode true teruggeven, anders false.

isFinished()

public boolean isFinished()

Deze methode controleert of het spel afgelopen is. Het spel is afgelopen als één van volgende voorwaarden geldt:

setCell()

public boolean setCell(int row, int column)

Deze methode vult de cel op rij row, kolom column in, met ofwel een X ofwel een O (afhankelijk van welke speler momenteel aan de beurt is). Indien dit lukt (het vakje was leeg), wordt de huidige beurt aangepast naar de volgende speler en geeft de methode true terug, anders false.

toString()

public String toString()

Deze methode zet het spelbord om naar een string. Een voorbeeld van hoe deze string eruit moet zien, kan je vinden in de onderstaande voorbeelduitvoer van het spelverloop (je kan dit simpelweg kopiëren en plakken).

Opgave - Deel 2

Nu je alle spelregels hebt geïmplementeerd, kan je het effectieve spelverloop implementeren. Schrijf hiervoor een main-methode, waarin je volgende pseudocode implementeert:

public static void main(String[] args) {
    // maak een nieuwe instantie van het spel.
    // print het lege spelbord
    // zolang het spel niet afgelopen is {
           // lees de volgende zet in met een Scanner.
           // roep de setCell()-methode van het spel op om de gekozen zet uit te voeren.
           // print het spelbord
    // }
    // als het spel geen winnaar heeft {
    //    print de Gelijkspel-boodschap
    // } anders {
    //    print welke speler gewonnen heeft
    // }
}

Voorbeelduitvoer

De tekst in het rood stelt invoer van de gebruiker voor en wordt logischerwijs niet uitgeprint door je programma.

X wint het spel

╔═══╦═══╦═══╗
║   ║   ║   ║
╠═══╬═══╬═══╣
║   ║   ║   ║
╠═══╬═══╬═══╣
║   ║   ║   ║
╚═══╩═══╩═══╝
De beurt is aan X. Kies een vakje (rij,kolom).
1,1
╔═══╦═══╦═══╗
║ X ║   ║   ║
╠═══╬═══╬═══╣
║   ║   ║   ║
╠═══╬═══╬═══╣
║   ║   ║   ║
╚═══╩═══╩═══╝
De beurt is aan O. Kies een vakje (rij,kolom).
1,2
╔═══╦═══╦═══╗
║ X ║ O ║   ║
╠═══╬═══╬═══╣
║   ║   ║   ║
╠═══╬═══╬═══╣
║   ║   ║   ║
╚═══╩═══╩═══╝
De beurt is aan X. Kies een vakje (rij,kolom).
2,2
╔═══╦═══╦═══╗
║ X ║ O ║   ║
╠═══╬═══╬═══╣
║   ║ X ║   ║
╠═══╬═══╬═══╣
║   ║   ║   ║
╚═══╩═══╩═══╝
De beurt is aan O. Kies een vakje (rij,kolom).
1,3
╔═══╦═══╦═══╗
║ X ║ O ║ O ║
╠═══╬═══╬═══╣
║   ║ X ║   ║
╠═══╬═══╬═══╣
║   ║   ║   ║
╚═══╩═══╩═══╝
De beurt is aan X. Kies een vakje (rij,kolom).
3,3
╔═══╦═══╦═══╗
║ X ║ O ║ O ║
╠═══╬═══╬═══╣
║   ║ X ║   ║
╠═══╬═══╬═══╣
║   ║   ║ X ║
╚═══╩═══╩═══╝
X heeft gewonnen!

O wint het spel

╔═══╦═══╦═══╗
║   ║   ║   ║
╠═══╬═══╬═══╣
║   ║   ║   ║
╠═══╬═══╬═══╣
║   ║   ║   ║
╚═══╩═══╩═══╝
De beurt is aan X. Kies een vakje (rij,kolom).
2,1
╔═══╦═══╦═══╗
║   ║   ║   ║
╠═══╬═══╬═══╣
║ X ║   ║   ║
╠═══╬═══╬═══╣
║   ║   ║   ║
╚═══╩═══╩═══╝
De beurt is aan O. Kies een vakje (rij,kolom).
2,2
╔═══╦═══╦═══╗
║   ║   ║   ║
╠═══╬═══╬═══╣
║ X ║ O ║   ║
╠═══╬═══╬═══╣
║   ║   ║   ║
╚═══╩═══╩═══╝
De beurt is aan X. Kies een vakje (rij,kolom).
1,1
╔═══╦═══╦═══╗
║ X ║   ║   ║
╠═══╬═══╬═══╣
║ X ║ O ║   ║
╠═══╬═══╬═══╣
║   ║   ║   ║
╚═══╩═══╩═══╝
De beurt is aan O. Kies een vakje (rij,kolom).
3,1
╔═══╦═══╦═══╗
║ X ║   ║   ║
╠═══╬═══╬═══╣
║ X ║ O ║   ║
╠═══╬═══╬═══╣
║ O ║   ║   ║
╚═══╩═══╩═══╝
De beurt is aan X. Kies een vakje (rij,kolom).
1,2
╔═══╦═══╦═══╗
║ X ║ X ║   ║
╠═══╬═══╬═══╣
║ X ║ O ║   ║
╠═══╬═══╬═══╣
║ O ║   ║   ║
╚═══╩═══╩═══╝
De beurt is aan O. Kies een vakje (rij,kolom).
1,3
╔═══╦═══╦═══╗
║ X ║ X ║ O ║
╠═══╬═══╬═══╣
║ X ║ O ║   ║
╠═══╬═══╬═══╣
║ O ║   ║   ║
╚═══╩═══╩═══╝
O heeft gewonnen!

Gelijkspel

╔═══╦═══╦═══╗
║   ║   ║   ║
╠═══╬═══╬═══╣
║   ║   ║   ║
╠═══╬═══╬═══╣
║   ║   ║   ║
╚═══╩═══╩═══╝
De beurt is aan X. Kies een vakje (rij,kolom).
3,1
╔═══╦═══╦═══╗
║   ║   ║   ║
╠═══╬═══╬═══╣
║   ║   ║   ║
╠═══╬═══╬═══╣
║ X ║   ║   ║
╚═══╩═══╩═══╝
De beurt is aan O. Kies een vakje (rij,kolom).
2,2
╔═══╦═══╦═══╗
║   ║   ║   ║
╠═══╬═══╬═══╣
║   ║ O ║   ║
╠═══╬═══╬═══╣
║ X ║   ║   ║
╚═══╩═══╩═══╝
De beurt is aan X. Kies een vakje (rij,kolom).
1,3
╔═══╦═══╦═══╗
║   ║   ║ X ║
╠═══╬═══╬═══╣
║   ║ O ║   ║
╠═══╬═══╬═══╣
║ X ║   ║   ║
╚═══╩═══╩═══╝
De beurt is aan O. Kies een vakje (rij,kolom).
3,2
╔═══╦═══╦═══╗
║   ║   ║ X ║
╠═══╬═══╬═══╣
║   ║ O ║   ║
╠═══╬═══╬═══╣
║ X ║ O ║   ║
╚═══╩═══╩═══╝
De beurt is aan X. Kies een vakje (rij,kolom).
1,2
╔═══╦═══╦═══╗
║   ║ X ║ X ║
╠═══╬═══╬═══╣
║   ║ O ║   ║
╠═══╬═══╬═══╣
║ X ║ O ║   ║
╚═══╩═══╩═══╝
De beurt is aan O. Kies een vakje (rij,kolom).
1,1
╔═══╦═══╦═══╗
║ O ║ X ║ X ║
╠═══╬═══╬═══╣
║   ║ O ║   ║
╠═══╬═══╬═══╣
║ X ║ O ║   ║
╚═══╩═══╩═══╝
De beurt is aan X. Kies een vakje (rij,kolom).
3,3
╔═══╦═══╦═══╗
║ O ║ X ║ X ║
╠═══╬═══╬═══╣
║   ║ O ║   ║
╠═══╬═══╬═══╣
║ X ║ O ║ X ║
╚═══╩═══╩═══╝
De beurt is aan O. Kies een vakje (rij,kolom).
2,3
╔═══╦═══╦═══╗
║ O ║ X ║ X ║
╠═══╬═══╬═══╣
║   ║ O ║ O ║
╠═══╬═══╬═══╣
║ X ║ O ║ X ║
╚═══╩═══╩═══╝
De beurt is aan X. Kies een vakje (rij,kolom).
2,1
╔═══╦═══╦═══╗
║ O ║ X ║ X ║
╠═══╬═══╬═══╣
║ X ║ O ║ O ║
╠═══╬═══╬═══╣
║ X ║ O ║ X ║
╚═══╩═══╩═══╝
Gelijkspel!

Opmerkingen en tips