Java-Programmierung Herausforderung: Hinzufügen von Arrays mit dem einfachen Tic-Tac-Toe-Programm

Diese Java-Programmierung Herausforderung baut auf den bisherigen Herausforderungen in diesem Tic-Tac-Toe-Serie und testet Ihre Fähigkeit Arrays zu verwenden - zwei von ihnen in der Tat.

Im Java-Programmierung Herausforderung: Ein einfaches Tic-Tac-Toe-Spiel und Java-Programmierung Herausforderung: Hinzufügen Klasse mit dem einfachen Tic-Tac-Toe-Programm Sie sind aufgefordert, ein Programm zu schreiben, die einfaches Spiel von Tic-Tac-Toe zu spielen.

Als Spiel, ruft Tic-Tac-Toe für die Verwendung eines Arrays aus den Status des Spiels darstellen. Ohne Arrays, müssen Sie eine separate Variable verwenden, um jedes Quadrat des Board zu vertreten. Mit einer Reihe, können Sie eine einzelne Variable verwenden, um alle neun Quadrate repräsentieren.

Diese Programmierung Herausforderung ist einfach: eine verbesserte Version des Programms schreiben, die Verwendung von Arrays macht. Sie müssen mindestens zwei Arrays in Ihrer Lösung verwenden:

  1. Sie müssen ein Array verwenden, um die Platine zu repräsentieren. Höchstwahrscheinlich werden Sie ein eindimensionales Array mit neun Elementen verwendet werden soll, wie folgt:

     0 | 1 | 2 --- | --- | --- 3 | 4 | 5 --- | --- | --- 6 | 7 | 8

    Mit anderen Worten, links die obere Quadrat (A1) In Array-Element 0 und das untere rechte Quadrat gespeichert (C3) In Array-Element gespeichert 8.

  2. Sie müssen auch ein Array verwenden, um die acht möglichen Drei-in-einer-Reihe-Vektoren zu repräsentieren.

    Sie können dann dieses Array verwenden, um festzustellen, ob einer der Spieler das Spiel gewonnen hat. Höchstwahrscheinlich werden Sie für diese Aufgabe ein zweidimensionales Array zu verwenden. Das Array acht Drei-Element-Arrays zu halten, von denen jeder die drei Indizes einer bestimmten drei-in-einer-Zeilenvektor.

    Der komplette Array würde folgende Daten enthalten:

     1 23 4 0 56 7 80 3 61 4 72 5 80 4 82 4 6 

Eine zusätzliche Anforderung dieses Programms ist es, dass die TicTacToeBoard Klasse, die Sie für diese Herausforderung schaffen müssen vollständig mit der Klasse, die Sie für die vorhergehende Herausforderung geschaffen kompatibel sein. In anderen Worten muss es exakt die gleichen Methoden implementieren. Für Ihre Bequemlichkeit sind diese Methoden in der folgenden Tabelle wiederholt.

Da beziehen sich diese Methoden auf den Plätzen der Tic-Tac-Toe-Board mit Zeilen-Spalten-Bezeichnungen wie A1 oder B2, Ihre Umsetzung wird diese Bezeichnungen Indexnummern zuordnen müssen. Wenn beispielsweise die Zeichenfolge A1 wird auf den übergebenen playAt Verfahren, das Programm muss das Spiel bei Index 0 im Array markieren.

Die TicTacToeBoard Klasse
constructorBeschreibung
TicTacToeBoard
Erstellt ein neues TicTacToeBoard mit allen Plätzen leer.
VerfahrenBeschreibung
void reset ()Setzt den Status jedes Quadrat zu leeren.
nichtig playAt (String Quadrat, int-Spieler)Markiert den angegebenen Platz (A1, A2, A3, B1, B2, B3, C1, C2, oder C3) Für den angegebenen Spieler (1 für X, 2 für O). wirft Illegal wenn Platz nicht einer der zulässigen Werte ist, Spieler ist nicht 1 oder 2, oder der angegebene Platz ist nicht leer.
int isGameOver ()Legt fest, ob das Spiel vorbei ist. Gibt 0 zurück, wenn das Spiel nicht vorbei ist, 1, wenn X das Spiel gewonnen hat, 2, wenn O das Spiel gewonnen hat, und 3, wenn das Spiel unentschieden ist. Die Spielbedingungen enden, sind wie folgt:
1: Wenn eine Zeile, Spalte oder diagonal alle X enthält.
2: Wenn eine Zeile, Spalte oder Diagonale enthält alle O.
3: Wenn es keine leeren Plätze und weder X noch O hat gewonnen.
int getNextMove ()Gibt eine ganze Zahl, die den nächsten Schritt für den Computer-Gegner. Diese Methode sollte ein rudimentäres Anstrengungen unternehmen, um einen guten Zug zu wählen, nach folgender Strategie:
* Wenn das Zentrum (Quadrat B2) Ist leer, der Mitte Platz zu spielen.
* Wenn das Zentrum nicht leer, aber jeder der vier Ecken (Quadrate A1, A3, C1, oder C3) Leer sind, eine der Ecken spielen (es ist egal, welche).
* Wenn das Zentrum nicht leer ist und keine Ecken sind leer, eine der Kanten spielen (Quadrate A2, B1, B3, oder C2).
String toString ()Gibt eine Zeichenfolge zurück, die den aktuellen Status der Karte darstellt. Die Zeichenfolge enthält new-line Zeichen die Zeilen angezeigt werden sowie Trennlinien auf separaten Konsole Linien, wie in diesem Beispiel:
O | | O
---| --- | ---
| X |
---| --- | ---
| X |

Als eine weitere Herausforderung, für diese Version der TicTacToeBoard Herausforderung, sollte der Computer-Spieler eine intelligentere Strategie gegen die menschlichen Gegner verwenden. Bestimmen Sie das Spiel des Computers wie folgt vor:

  1. Wenn es möglich ist, dass der Computer auf die nächste Spiel zu gewinnen, sollte der Computer in der Gewinner Platz spielen.

  2. Wenn es möglich ist, für die menschlichen Gegner auf seine nächste Spiel zu gewinnen, sollte der Computer in den menschlichen Gegners zu gewinnen Platz spielen um den Sieg zu blockieren.

  3. Wenn der Mitte Platz zur Verfügung steht, sollte der Computer die Mitte Platz nehmen.

  4. Wenn jeder Ecke Platz zur Verfügung steht, sollte der Computer in einem der verfügbaren Ecken spielen.

  5. Der Computer sollte in einem freien Rand Platz spielen.

Beachten Sie, dass diese Strategie umzusetzen, müssen Sie eine Routine zu entwickeln, die bestimmen können, wenn einer der Spieler auf seinen nächsten Zug zu gewinnen. Um dies zu tun, werden Sie an jedem der acht, zu suchen haben drei-in-einer-Reihe-Vektoren, um zu bestimmen, ob der Vektor ein leeres Feld enthält und die jeweils anderen beiden Quadrate enthalten Markierungen für den gleichen Gegner (das ist, zwei X oder zwei O).

Sie können mit 0 bis ein leeres Quadrat darstellen, 1, um ein X darstellen, und 2 eine O. darstellen Aber das würde erfordern ziemlich komplizierte Logik zu tun, dass - so etwas wie dies erforderlich wäre, vorausgesetzt, dass s1, s2, und s3 den Inhalt der drei Quadrate von einer der acht, drei-in-a-Zeilenvektoren ganze Zahlen sind, enthält:

if (s1 == 0 s2 == 1 s3 == 1) // X kann durch das Spielen in s1if (s2 == gewinnen 0 s1 == 1 s3 == 1) // X kann durch das Spielen in s2if (s3 == gewinnen 0 s1 == 1 s2 == 1) // X kann durch das Spielen in s3 gewinnen

Also hier ist ein Tipp: Anstelle der Verwendung von 0, 1 und 2 auf einen leeren Platz darstellen, ein X und ein O, verwenden Sie die Primzahlen 2, 3 und 5 statt. Dann, um festzustellen, ob ein Spieler an einem gegebenen Vektor gewinnen kann, einfach zu multiplizieren, die drei Werte für diesen Vektor. Wenn das Ergebnis 18 ist, kann X (233 = 18) zu gewinnen. Wenn das Ergebnis 50 ist, kann O (255 = 50) zu gewinnen.

Beachten Sie, dass auch, obwohl diese Strategie eine Verbesserung gegenüber der Strategie, die für frühere Versionen des Programms eingesetzt wird, ist es noch nicht eine perfekte Strategie ist: Sie immer noch den Computer mit der richtigen Reihenfolge von Spielen zu schlagen. Wenn Sie eine zusätzliche Herausforderung wollen, überlegen, was zusätzliche Strategie notwendig wäre, das Spiel nicht zu gewinnen zu machen, und dann einen Weg ausdenken, um die neue Strategie umzusetzen.

Sie können die Lösung für diese Herausforderung auf die finden Registerkarte Downloads des Java All-in-One For Dummies, 4th Edition Produktseite.

Viel Glück!

Menü