Java-Tic Tac Toe mit Eclipse
Unter der Sprache Java lassen sich beeindruckende Spiele programmieren. Wir zeigen Ihnen, wie Sie das bekannte Spiel Tic Tac Toe schrittweise aufbauen. Für die Bedienungsoberfläche des Taktikspiels nutzen Sie Komponenten der Swing-Bibliothek.

- Java-Tic Tac Toe mit Eclipse
- init-Methode
Auch wenn Vielen das Spielprinzip von Tic Tac Toe bekannt sein dürfte, darf eine kurze Erklärung nicht fehlen: Zwei Spieler treten gegeneinander an. Das Spielbrett ist in eine Matrix von drei mal drei Feldern aufgeteilt. Auf dieser Fläche besetzen die Spieler also neun Felder. Der eine Spieler...
Auch wenn Vielen das Spielprinzip von Tic Tac Toe bekannt sein dürfte, darf eine kurze Erklärung nicht fehlen: Zwei Spieler treten gegeneinander an. Das Spielbrett ist in eine Matrix von drei mal drei Feldern aufgeteilt.
Auf dieser Fläche besetzen die Spieler also neun Felder. Der eine Spieler verfügt über Steine mit einer X-Kennung, während der andere Spieler Steine mit einer O-Kennung setzt. Die Spieler sind wechselseitig an der Reihe. Sobald es einem Spieler gelungen ist, drei Felder waagerecht, senkrecht oder diagonal zu besetzen, hat dieser Spieler gewonnen.
Analyse und Hauptfenster

Zunächst einmal analysieren Sie, welche Klassen für unser Spiel notwendig sind. Da wäre zunächst das Hauptfenster der Applikation, welches unseren Spielplan später anzeigt. Da dieses Hauptfenster über ein Menü verfügt, benötigen Sie eine Klasse zur Ereignisbehandlung (MenüAktion). Nachdem das Spielfeld aufgebaut ist, muss das Programm auf Mausklicks der Spieler reagieren.
Dies wiederum erledigt die Klasse FeldAktion. Sobald das Spiel beendet ist, wird ein Dialog eingeblendet, wofür die Klasse EndDialog zuständig ist. Aus dem Klassendiagramm nach der UML-Notation (Unified Modeling Language) sehen Sie, wie die einzelnen Klassen zusammenhängen.
Als Erstes setzen Sie die Klasse Hauptfenster um. Da es sich um ein Fenster handelt, leiten Sie diese Klasse von der Swing-Klasse JFrame ab. Im Deklarationsbereich legen Sie die einzelnen Variablen an. Mit dem Befehl new JMenuBar() erzeugen Sie die Fensterleiste für das Fenster und legen dessen Referenz innerhalb der Variablen menuleiste ab.

Nun legen Sie über die Anweisung new JMenu() ein Menü an und sichern die Referenz innerhalb der Variable spiel. Da das Menü auch über Einträge verfügen soll, legen Sie diese mit dem Kommando new JMenuItem("Neues Spiel") an und sichern dessen Referenz in der Variablen neuesspiel. Hierüber startet der Spieler seinen Zeitvertreib.
Um im Programm zu ermitteln, welcher Spieler an der Reihe ist und wer gewonnen hat, legen Sie die Variablen aktuellerSpieler und gewinner an, welche vom Typ Spieler sind. Da jeder Spieler ein eigenes Markierungssymbol (X oder O) hat, legen Sie diese über eine Aufzählungsvariable enum Spieler { X, O } an. Der aktuelle Stand eines Spielfeldes wird innerhalb einer Matrix festgehalten.
Also legen Sie einen entsprechenden Arraybereich mit dem Befehl Spieler[] matrix = new Spieler[3][3] an. Der Array hat eine Größe von 3x3, welcher der kompletten Spielfeldfläche entspricht. Damit das Programm auch auf Menüreignisse reagieren kann, legen Sie mit enum MenuAktion { NEUESSPIEL } eine entsprechende Ereignis-Variable an.
Anschließend realisieren Sie die init()-Methode, welches das Hauptfenster aufbaut. Sie setzen mit setTitle("Tic Tac Toe") den Titel des Fensters. Damit das Fenster später per Mausklick endet, rufen Sie den Befehl setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE) auf. Mit Hilfe von setSize(300,300) bestimmen Sie die Größe des Fensters. Mittels des Befehls setJMenuBar(menuleiste) fügen Sie innerhalb des Fensters die Fensterleiste hinzu.
Über menuleiste.add(spiel) fügen Sie ein Menü innerhalb der Fensterleiste hinzu. Der Befehl spiel.add(neuesspiel) erzeugt einen Menüeintrag im Menü. Für alle Ereignisse, die innerhalb des Menüs eintreten, erzeugen Sie eine Instanz der Klasse MenüAktion. Damit diese Klasse auch auf Ereignisse reagiert, muss sie mit addActionListener(ma) registriert sein.
Nun werden alle Menü-Ereignisse an diese Klasse weitergeleitet. Um speziell diesen Menüeintrag zu behandeln, registrieren Sie dieses Ereignis über setActionCommand(MenuAktion.NEUESSPIEL.toString()). Anschließend erzeugen Sie über den Befehl new Spielplan(this) unseren Spielplan und setzen diesen über setVisible(false) auf nicht sichtbar, weil dieser noch nicht innerhalb des Fensters erscheinen soll.
Über setLayout(new BorderLayout()) legen Sie das Layout für das Fenster fest und fügen den Spielbereich mit add(spielplan.BorderLayout.CENTER) dem Fenster hinzu. Zum Schluss setzen Sie mit setVisible(true) das Fenster auf sichtbar.
Nun benötigen Sie noch die Methode neuesSpiel(), um das Spiel zu starten. Diese setzt über setzeAktuellenSpieler(Spieler.O) den Spieler, der beginnen soll. Da es zu Beginn noch keinen Gewinner gibt, setzen Sie über gewinner=null die Variable. Die einzelnen Felder des Spielplans werden mit dem Befehl markiereFeld(i, null) innerhalb einer Schleife entsprechend dem Spieler besetzt. Zum Schluss schalten Sie per setVisible(true) den Spielplan sichtbar.

Um im Programm den aktuellen Spieler zu ermitteln, definieren Sie die Methode holeAktuellenSpieler(). Diese liefert über den Befehl return aktuellerSpieler den Wert des aktuellen Spielers zurück. Um diesen erstmal zu setzen, legen Sie die Methode setzeAktuellenSpieler() an. Der Befehl this.aktuellerSpieler = aktuellerSpieler setzt dessen Wert zurück. Um einen Gewinner zu ermitteln, definieren Sie die holeGewinner-Methode.
Diese liefert über das Kommando return gewinner den aktuellen Gewinner zurück. Mit der Methode prüfeSpielStatus prüfen Sie nach jedem Spielerzug, ob es einen Gewinner gibt, um diesen zurückzuliefern. Eine gezielte Abfrage der Einträge matrix[X][Y] prüft dazu, ob auf der Waagerechten, Senkrechten oder Diagonalen diese Spielfelder dreimal mit demselben Spielersymbol (X oder O) besetzt sind.
Wenn dies der Fall ist, wird das Symbol dieses Spielers in der Gewinner-Variable festgehalten. Zum Schluss testet die Abfrage if (gewinner != null, ob ein Gewinner vorliegt. Wenn dies der Fall ist, blendet das Programm EndDialog ein.