So schreiben Sie ein Tic-Tac-Toe-Programm in Java
Einführung:
Tic-Tac-Toe ist ein sehr verbreitetes Spiel, das ziemlich einfach zu spielen ist. Die Spielregeln sind einfach und bekannt. Aufgrund dieser Dinge ist Tic-Tac-Toe ziemlich einfach zu codieren. In diesem Tutorial werden wir uns ansehen, wie man ein funktionierendes Spiel von Tic-Tac-Toe in Java codiert. In diesem Lernprogramm wird davon ausgegangen, dass Sie mit der grundlegenden Syntax von Java vertraut sind und auf einen funktionierenden Java-Compiler zugreifen können. In diesem Tutorial wird die Eclipse-IDE verwendet.
Allgemeiner Überblick:
Es gibt viele Möglichkeiten, ein Spiel von Tic-Tac-Toe in Java zu implementieren. Bevor wir mit dem Codieren beginnen, müssen wir uns überlegen, wie wir das Spiel spezifisch implementieren werden. In diesem Tutorial werden wir eine textbasierte Version von Tic-Tac-Toe codieren. Unser Tic-Tac-Toe druckt zunächst das Brett und bittet dann den ersten Spieler um Eingabe, der angibt, wo auf dem Brett die Marke dieses Spielers platziert werden soll. Nachdem wir die Marke gesetzt haben, drucken wir den Board-Status erneut und fragen dann den anderen Spieler nach seinem Zug. Dieser Vorgang wird fortgesetzt, bis ein Spieler gewinnt oder das Brett voll ist (was darauf hinweist, dass ein Unentschieden aufgetreten ist). Die Eingabe, die verwendet wird, um anzugeben, wo eine Marke platziert werden soll, hat das Format von zwei Ganzzahlen, die die Zeile und Spalte angeben, in der die Marke platziert werden soll. Unten finden Sie ein Beispiel dafür, wie ein Spiel gespielt wird.
Schritt 1: Erstellen Sie Ihr Projekt
Der erste Schritt beim Codieren ist das Erstellen eines neuen Projekts! Erstellen Sie in Ihrer IDE ein neues Java-Projekt mit dem Namen TicTacToe. In diesem Instructable wird das Standardpaket verwendet. Erstellen Sie in Ihrem Projektpaket zwei Klassen: Main.java und TTT.java. Main.java hostet die Hauptmethode und wird verwendet, um den Code in TTT.java auszuführen. TTT.java enthält ein Tic-Tac-Toe-Objekt, das den Status des Bretts und Methoden zur Manipulation des Spiels enthält.
Schritt 2: Starten der TTT-Klasse
Bevor wir Code zum Ausführen unseres TTT-Objekts erstellen können, müssen wir ein funktionierendes TTT-Objekt erstellen. Da ein TTT-Objekt für ein Spiel von Tic-Tac-Toe repräsentativ ist, muss es zwei Mitgliedsvariablen enthalten. Nachfolgend sind die Elementvariablen aufgeführt, die in die TTT-Klasse eingefügt werden sollen, gefolgt von Beschreibungen, warum sie benötigt werden.
private char [] [] board;
Diese Variable ist eine 2D-Anordnung von Zeichen, die für das Drei-mal-Drei-Brett eines Tic-Tac-Toe-Spiels repräsentativ ist. Es wird zu jedem Zeitpunkt den Status des Spiels innerhalb des TTT-Objekts speichern.
private char currentPlayerMark;
Diese Variable enthält entweder ein 'x' oder ein 'o', was angibt, welcher Spieler zu einem bestimmten Zeitpunkt an der Reihe ist. Die Methoden der TTT-Klasse verwenden dies beim Markieren der Tafel, um zu bestimmen, welcher Markierungstyp platziert wird.
Schritt 3: Initialisieren von Methodenprototypen in der TTT-Klasse
Das Folgende ist eine allgemeine Einrichtung des Programms. Nachfolgend finden Sie alle Methodenheader für die Methoden, die zur TTT-Klasse gehören. Diese Methoden wirken auf die Mitgliedsvariablen der TTT-Klasse ein, um das Spiel Tic-Tac-Toe veränderlich zu machen. Jeder hat eine kurze Beschreibung dessen, was die Methode darunter tun wird. Diese Verhaltensweisen sind notwendig, um eine vollständige Partie Tic-Tac-Toe zu spielen.
öffentliches TTT ()
Dies ist der Konstruktor. Es ist dafür verantwortlich, dass das Board ordnungsgemäß initialisiert wird und wer der erste Spieler ist.
public void initializeBoard ()
Diese Methode initialisiert die Board-Variable so, dass alle Slots leer sind.
public void printBoard ()
Diese Methode druckt die Tic-Tac-Toe-Karte auf Standardausgabe.
public boolean isBoardFull ()
Diese Methode prüft, ob die Karte voll ist oder nicht. Es wird true zurückgegeben, wenn das Board voll ist, andernfalls false.
public boolean checkForWin ()
Diese Methode prüft, ob ein Spieler gewonnen hat, und gibt in diesem Fall true zurück.
private boolean checkRowsForWin ()
Diese Methode überprüft speziell die Zeilen auf einen Gewinn.
private boolean checkColumnsForWin ()
Diese Methode überprüft speziell die Spalten auf einen Gewinn.
private boolean checkDiagonalsForWin ()
Diese Methode überprüft speziell die Diagonalen auf einen Gewinn.
private boolesche checkRowCol (char c1, char c2, char c3)
Diese Methode überprüft die drei angegebenen Zeichen, um festzustellen, ob alle drei Zeichen "x" oder "o" sind. Wenn ja, wird true zurückgegeben.
Hinweis : Wenn Sie Methodenstubs für alle Methodenheader in Ihrer TTT-Klasse codieren, wird Ihr Compiler Sie wahrscheinlich darüber informieren, dass Ihr Code Fehler enthält. Das ist normal. Der Compiler erwartet lediglich, dass für alle nicht ungültigen Methoden ein Wert zurückgegeben wird.
Schritt 4: Initialisieren Sie das Board

public void initializeBoard ()
Dadurch wird die Karte auf alle leeren Werte gesetzt. Innerhalb dieser Methode müssen Sie 2 for-Schleifen ineinander erstellen, die alle Zeilen und Spalten durchlaufen und jedes Leerzeichen auf '-' setzen. Um die Zeilen zu durchlaufen, erstellen Sie eine for-Schleife und eine Ganzzahl, in diesem Fall i, um darzustellen, welche Zeile wir gerade beobachten.
für (int i = 0; i <3; i ++) {}
Innerhalb dieser for-Schleife erstellen wir eine zweite for-Schleife mit einer Ganzzahl j, um darzustellen, welche Spalte wir gerade beobachten.
für (int j = 0; j <3; j ++) {}
Innerhalb der zweiten for-Schleife setzen wir die Board-Position auf '-'. Wenn beide Schleifen ordnungsgemäß abgeschlossen und verschachtelt sind, können wir jede Stelle innerhalb des 2D-Arrays der Platine durchlaufen.
board [i] [j] = '-';
Diesem Schritt ist ein Bild beigefügt, das eine mögliche Implementierung der Methode initializeBoard () zeigt.
Schritt 5: Drucken der Karte


Die erste Leiterplatte sieht aus wie das erste Bild.
Es wird in der Methode public void printBoard () behandelt, die sich in der TTT-Klasse befindet. Um die Karte zu drucken, müssen wir auf jede Stelle im 2D-Array mit dem Namen board in unserer TTT-Klasse zugreifen. Da es sich um ein 2D-Array handelt, wird dies mit verschachtelten for-Schleifen behandelt.
Zuerst müssen wir nur eine Reihe von Strichen (in diesem Fall 13) drucken, die die Oberseite der Tafel kennzeichnen. Darunter benötigen wir eine for-Schleife, die jede der drei Zeilen durchläuft. Diese Schleife enthält einen Aufruf zum Drucken eines '|' Zeichen, eine weitere for-Schleife zum Durchlaufen der Spalten und ein Aufruf der Funktion System.out.println () zum Drucken einer neuen Zeile und der nächsten 13 Striche auf dem Bildschirm.
Unsere innere for-Schleife durchläuft auch nur drei Spalten. Da unsere äußere for-Schleife bereits die erste | gedruckt hat Zeichen jeder Zeile der Tafel können wir fortfahren, um das Zeichen zu drucken, das in das Feld gehört. Dazu drucken wir das Zeichen in dieser Zeile und Spalte mit board [i] [j] (i ist die Variable, die für die äußere for-Schleife verwendet wird, die die Zeile war, und j ist die Variable, die für die innere Schleife verwendet wird Dies ist die Spalte.) Diese print-Anweisung enthält auch ein verkettetes | Zeichen, um die Felder zu trennen.
Sie müssen nur noch den letzten Aufruf drucken, um die neue Zeile zu drucken, um jede Zeile zu trennen, gefolgt von den 13 Strichen. Das zweite angehängte Bild zeigt ein Beispiel dafür, wie die beschriebene Druckfunktion aussehen könnte.
Schritt 6: Suche nach einem Gewinner (Teil 1)
Es gibt drei verschiedene Funktionen, um nach einem Gewinn zu suchen: Zeilen, Spalten und Diagonalen. Computer müssen diese in verschiedene Bedingungen unterteilen, da sie sich alle in Bezug auf Arrays unterscheiden. checkForWin () ist unsere Hauptfunktion, um alle drei dieser Funktionen für jedes Szenario zu testen, das von der Benutzereingabe betroffen ist.
Für die checkForWin () -Methode: Sie benötigen lediglich eine return-Anweisung, die die drei verschiedenen Funktionen aufruft. Wenn das Überprüfen der Zeilen auf win nicht true zurückgibt, überprüfen Sie die Spalten auf win usw. Innerhalb der return-Anweisung sollte Folgendes aussehen: checkRowsForWin () || checkColumnsForWin () || checkDiagonalsForWin ()
Für die checkRowsForWin () -Methode: Wir durchlaufen die Zeilen, um festzustellen, ob es Gewinner gibt. Dies erfordert eine for-Schleife mit einer if-Anweisung. Die for-Schleife wird durch die Ganzzahl i inkrementiert, um jede Zeile zu überprüfen. for (int i = 0; i <3; i ++) Die if-Anweisung vergleicht jedes Leerzeichen in der Zeile miteinander und gibt einen 'true'-Wert an, wenn alle gleich sind. Wenn die Zeile beispielsweise drei x in einer Zeile enthält, gibt die Methode true zurück. if (checkRowCol (board [i] [0], board [i] [1], board [i] [2]) == true) Innerhalb dieser if-Anweisung sollte es also Folgendes geben: return true; Und nach der for-Schleife muss die Methode zurückgeben, dass diese Zeile keine drei aufeinander folgenden übereinstimmenden Symbole hatte, wenn die Methode nie gestoppt wurde. Daher schreiben wir kurz vor dem Schließen der Methode mit ihrem letzten '}': return false; Befriedigung der Notwendigkeit, einen Booleschen Wert zurückzugeben.
Für die checkColumnsForWin () -Methode: Kopieren Sie den Inhalt der checkRowsForWin () -Methode und fügen Sie ihn ein. Die einzige Änderung befindet sich in der if-Anweisung. Anstatt durch die Zeilen zu inkrementieren, werden wir durch die Spalten inkrementieren. Während in checkRowsForWin eine if-Anweisung steht, die besagt: if (checkRowCol (board [i] [0], board [i] [1], board [i] [2]) == true) checkColumnsForWin () hat ein if Anweisung, die besagt: if (checkRowCol (board [0] [i], board [1] [i], board [2] [i]) == true) Ansonsten bleibt alles andere in der Methode gleich.
Für die checkDiagonalsForWin () -Methode: Alles, was geschrieben wurde, kann in Klammern einer return () -Anweisung enthalten sein. Die erste Überprüfung, die wir durchführen werden, erfolgt in der Diagonale von der oberen linken Ecke zur unteren rechten Ecke. Dazu überprüfen wir alle Leerzeichen, die in diesem Abschnitt enthalten wären. checkRowCol (board [0] [0], board [1] [1], board [2] [2]) == true) Dann haben wir noch eine Anweisung, aber wir werden die beiden durch ein ODER-Symbol trennen: ' || ' Die zweite Anweisung wird von der oberen rechten Ecke zur unteren linken Ecke überprüft. checkRowCol (board [0] [2], board [1] [1], board [2] [0]) == true) Ihr Endprodukt der checkDiagonalsForWin () -Methode sollte also ein return () sein und sich darin befinden sollte die erste Anweisung ODER die zweite Anweisung enthalten.
Schritt 7: Suchen Sie nach einem Gewinner (Teil 2)
Jetzt müssen wir sicherstellen, dass ein Spieler, der drei in Folge bekommt, gewinnt. checkRowCol () ist eine Funktion, die alle drei Buchstaben miteinander vergleicht. Wenn sie übereinstimmen, wird true zurückgegeben.
Für die checkRowCol () -Methode: Diese Methode wird von den anderen Methoden verwendet, um drei Werte zu senden. Wir überprüfen zunächst, ob der erste Wert nicht leer ist, z. B. '-'. Dann vergleichen wir den ersten Wert mit dem zweiten und den zweiten mit dem dritten. Wenn und nur wenn alle drei Werte gleich sind UND keine leeren Anweisungen sind, gibt diese Methode true zurück. Innerhalb einer return () - Anweisung überprüft unsere erste Anweisung, ob dies kein '-' ist. (c1! = '-') Trennen Sie die erste und die zweite Anweisung mit einem '&&'. Die zweite Anweisung prüft, ob der erste Wert dem zweiten Wert entspricht. (c1 == c2) Trennen Sie die zweite und dritte Anweisung mit einem '&&'. Die dritte Anweisung prüft, ob der zweite Wert gleich dem dritten ist. (c2 == c3) Ihre letzte checkRowCol () -Methode ist also eine return (), die die erste Anweisung && die zweite Anweisung && die dritte Anweisung enthält.
Schritt 8: Wechseln zwischen Spielern (x und O)


public void changePlayer ()
Die Methode changePlayer () tauscht die Variable currentPlayerMark zwischen x und o aus. Überprüfen Sie dazu einfach, was die Variable aktuell enthält. Wenn die Variable ein 'x' enthält, ändern Sie es in ein 'o'. Andernfalls ändern Sie es in ein 'x'.
public boolean placeMark (int row, int col)
Die placeMark () -Methode platziert den richtigen Buchstaben in der angegebenen Zeile und Spalte in der Board-Variablen (als Parameter verwendet). Es wird true zurückgegeben, wenn es sich um eine gültige Platzierung handelt. Andernfalls werden keine Änderungen an der Brettvariablen vorgenommen, und der Spieler muss versuchen, seinen Buchstaben an einer anderen Stelle zu platzieren, da eine ungültige Stelle ausgewählt wurde oder eine Stelle, an der ein Spieler seinen Buchstaben bereits platziert hat. Um dieses Verhalten zu erreichen, müssen einige Dinge überprüft werden. Stellen Sie zunächst (mithilfe einer if-Anweisung) sicher, dass das Zeilenargument zwischen 0 und 2 liegt. Überprüfen Sie anschließend, ob das col-Argument zwischen 0 und 2 liegt. Stellen Sie schließlich sicher, dass die betreffende Stelle derzeit ein '- enthält ', was bedeutet, dass noch kein Zahler diese Stelle markiert hat. Wenn alle drei Bedingungen ausgecheckt sind, setzen Sie eine Markierung (deren Typ durch die Klassenvariable currentPlayerMark angegeben wird) an die durch row und col angegebene Position und geben Sie dann true zurück. Wenn eine der drei Bedingungen nicht erfüllt ist, sollte eine Notiz erfolgen und false zurückgegeben werden.
Diesem Schritt sind Bilder beigefügt, die mögliche Implementierungen der oben genannten Methoden zeigen.
Schritt 9: Spielereingabe und Spielen des Spiels

Nachdem die TTT-Klasse und alle ihre Methoden abgeschlossen sind, muss eine Hauptmethode erstellt werden, die ein ganzes Spiel von Tic-Tac-Toe mit unserem TTT-Objekt durchläuft. Die Hauptmethode muss einige Dinge tun, um ein vollständiges Spiel Tic-Tac-Toe auszuführen.
Zunächst muss ein Scannerobjekt erstellt werden, um Eingaben von System.in entgegenzunehmen. Außerdem muss ein TTT-Objekt instanziiert werden, mit dem das Tic-Tac-Toe-Spiel gespielt werden soll. Danach muss die Karte des TTT-Objekts durch Aufrufen der Methode initializeBoard () initialisiert werden.
Nachdem diese Schritte abgeschlossen sind, muss das tatsächliche Spiel berücksichtigt werden. Um Kurven zu fahren, ist eine do while-Schleife erforderlich. Die Schleife sollte ausbrechen, wenn das Spiel beendet ist, dh wenn das Brett des TTT-Objekts voll ist oder einen Gewinner hat. Innerhalb der Schleife sollte der aktuelle Board-Status vor jeder Runde gedruckt werden. Zeigen Sie dem Spieler also, welche Felder verfügbar sind und welche Felder belegt sind. Dann sollten zwei Eingaben zur Kennzeichnung der Zeile und Spalte vorgenommen werden, um eine Markierung für die Abbiegung zu platzieren. Nachdem diese Eingabe eingegeben wurde, sollte die Markierung mit der Methode des TTT-Objekts platziert werden, und der Player sollte ebenfalls mit der Methode des TTT-Objekts geändert werden.
Unterhalb der while-Schleife, die alle Runden bis zum Ende des Spiels abwickelt, muss angegeben werden, wer der Gewinner des Spiels ist (oder ob das Spiel ein Unentschieden war). Überprüfen Sie dazu zuerst, ob das Spiel ein Unentschieden war, indem Sie prüfen, ob beide Bretter voll waren und es keinen Gewinner gab. Wenn dies der Fall ist, drucken Sie aus, dass das Spiel ein Unentschieden war. Andernfalls drucken Sie aus, wer gewonnen hat, indem Sie das Gegenteil des aktuellen Status der currentPlayerMark-Variablen des TTT-Objekts ausdrucken. Dies kann erreicht werden, indem zuerst die changePlayer () -Methode des TTT-Objekts aufgerufen wird und anschließend die getCurrentPlayerMark () -Methode des TTT-Objekts verwendet wird, um den Status der currentPlayerMark-Variablen abzurufen. Es kann auch schön sein, die Tafel noch einmal auszudrucken, um den endgültigen Zustand der Tafel anzuzeigen.
Eine beispielhafte Hauptmethode wurde als Bild angehängt.
Schritt 10: Verwenden Sie Class, Compile und Run

Sobald Sie an diesem Punkt angelangt sind, sollte Ihr Projekt vollständig genug sein, um ausgeführt zu werden. Wenn es Fehler gibt oder Klammern oder Semikolons fehlen, ist es jetzt an der Zeit, diese zu finden und zu beheben. Wenn Sie sich nicht sicher sind, wie Ihr Projekt aussehen soll, haben wir eine herunterladbare Datei beigefügt, mit der Sie Ihren Code mit einem funktionierenden Endprodukt vergleichen können. Fahren Sie fort und kompilieren Sie Ihr Projekt. In Eclipse gibt es eine Wiedergabetaste, die dem an diesen Schritt angehängten Bild ähnelt.
Anhänge
Working Final Product.zip herunterladen