Video: Coding Challenge #4: Purple Rain in Processing 2024
Diese Java Programmierung Herausforderung baut auf den vorherigen Herausforderungen in dieser Tic-Tac-Toe-Serie und testet Ihre Fähigkeit, Arrays zu verwenden - zwei von ihnen in der Tat.
In der Java-Programmierung Herausforderung: Ein einfaches Tic-Tac-Toe-Spiel und Java-Programmierung Challenge: Hinzufügen von Klasse zum einfachen Tic-Tac-Toe-Programm Sie sind aufgefordert, ein Programm zu schreiben, um das einfache Spiel von Tic-Tac-Toe zu spielen..
Als Spiel ruft Tic-Tac-Toe nach einem Array, um den Status des Spiels darzustellen. Ohne Arrays müssen Sie eine separate Variable verwenden, um jedes Quadrat der Karte darzustellen. Mit einem Array können Sie eine einzelne Variable verwenden, um alle neun Quadrate darzustellen.
Diese Programmieraufgabe ist einfach: Schreiben Sie eine verbesserte Version des Programms, das Arrays verwendet. Sie müssen mindestens zwei Arrays in Ihrer Lösung verwenden:
-
Sie müssen ein Array verwenden, um die Karte darzustellen. Höchstwahrscheinlich möchten Sie ein eindimensionales Array mit neun Elementen wie folgt verwenden:
0 | 1 | 2 --- | --- | --- 3 | 4 | 5 --- | --- | --- 6 | 7 | 8
Mit anderen Worten, das obere linke Quadrat (A1) wird in dem Array-Element 0 gespeichert, und das untere rechte Quadrat (C3) wird in dem Array-Element 8 gespeichert.
-
Sie müssen auch ein Array verwenden, um die acht möglichen Drei-in-einer-Reihe-Vektoren darzustellen.
Sie können dieses Array dann verwenden, um festzustellen, ob ein Spieler das Spiel gewonnen hat. Höchstwahrscheinlich werden Sie für diese Aufgabe ein zweidimensionales Array verwenden wollen. Das Array wird acht Arrays mit drei Elementen enthalten, von denen jedes die drei Indizes eines bestimmten Drei-in-einer-Reihe-Vektors darstellt.
Das vollständige Array würde die folgenden Daten enthalten:
0 1 2 3 4 5 6 7 8 0 3 6 1 4 7 2 5 8 0 4 8 2 4 6
Eine zusätzliche Anforderung dieses Programms ist, dass die TicTacToeBoard-Klasse, die Sie für Diese Herausforderung muss vollständig mit der Klasse kompatibel sein, die Sie für die vorherige Herausforderung erstellt haben. Mit anderen Worten muss es genau die gleichen Methoden implementieren. Für Ihre Bequemlichkeit werden diese Methoden in der folgenden Tabelle wiederholt.
Da sich diese Methoden auf die Quadrate der Tic-Tac-Toe-Karte beziehen, die Zeilen-Spaltenbezeichnungen wie A1 oder B2 verwenden, muss Ihre Implementierung diese Bezeichnungen auf Indexnummern abbilden. Wenn beispielsweise die Zeichenfolge A1 an die playAt-Methode übergeben wird, muss das Programm die Wiedergabe am Index 0 im Array markieren.
Konstruktor | Beschreibung |
---|---|
TicTacToeBoard | Erzeugt ein neues TicTacToeBoard mit allen Feldern leer. |
Methode | Beschreibung |
void reset () | Setzt den Status jedes Quadrats auf leer zurück. |
void playAt (String square, int player) | Markiert das angegebene Quadrat (A1, A2, A3, B1, B2, B3, C1, C2 oder C3) für den angegebenen Spieler (1 für X, 2 für O). Löst IllegalArgumentException aus, wenn square nicht zu den zulässigen Werten gehört, player nicht 1 oder 2 ist oder das angegebene Quadrat nicht leer ist. |
int isGameOver () | Legt fest, ob das Spiel beendet ist. Gibt 0 zurück, wenn das Spiel noch nicht beendet ist, 1, wenn X das Spiel gewonnen hat, 2, wenn O das Spiel gewonnen hat, und 3, wenn das Spiel unentschieden ist. Die Spielendbedingungen lauten wie folgt:
1: Wenn eine Zeile, Spalte oder Diagonale alle X enthält. 2: Wenn eine Zeile, Spalte oder Diagonale alle O enthält. 3: Wenn es keine leeren Quadrate gibt und weder X noch O gewonnen haben. |
int getNextMove () | Gibt eine ganze Zahl zurück, die den nächsten Zug für den Computergegner darstellt. Diese Methode sollte eine rudimentäre Anstrengung unternehmen, um einen guten Zug gemäß der folgenden Strategie auszuwählen:
* Wenn das Zentrum (Quadrat B2) leer ist, spielen Sie das mittlere Quadrat. * Wenn die Mitte nicht leer ist, aber eine der vier Ecken (Quadrate A1, A3, C1 oder C3) leer ist, spielen Sie eine der Ecken (es spielt keine Rolle, welche). * Wenn die Mitte nicht leer ist und keine Ecken leer sind, spielen Sie eine der Kanten (Quadrate A2, B1, B3 oder C2). |
String toString () | Gibt eine Zeichenfolge zurück, die den aktuellen Status der Karte darstellt. Die Zeichenfolge enthält Zeilenumbruchzeichen, um die Zeilen sowie Trennlinien in separaten Konsolenzeilen anzuzeigen, wie in diesem Beispiel:
O | | O - | - | - | X | - | - | - | X | |
Als weitere Herausforderung sollte der Computerspieler bei dieser Version der TicTacToeBoard-Herausforderung eine intelligentere Strategie gegen den menschlichen Gegner einsetzen. Bestimmen Sie das Spiel des Computers wie folgt:
-
Wenn es dem Computer möglich ist, bei seinem nächsten Spiel zu gewinnen, sollte der Computer auf dem Gewinnfeld spielen.
-
Wenn es für den menschlichen Gegner möglich ist, bei seinem nächsten Spiel zu gewinnen, sollte der Computer auf dem Gewinnfeld des menschlichen Gegners spielen, um den Gewinn zu blockieren.
-
Wenn das mittlere Quadrat verfügbar ist, sollte der Computer das mittlere Quadrat einnehmen.
-
Wenn ein Eckquadrat verfügbar ist, sollte der Computer in einer der verfügbaren Ecken spielen.
-
Der Computer sollte in einem verfügbaren Kantenquadrat spielen.
Beachten Sie, dass Sie zur Durchführung dieser Strategie eine Routine entwickeln müssen, die bestimmen kann, ob ein Spieler bei seinem nächsten Zug gewinnen kann. Um dies zu tun, müssen Sie jeden der acht, drei-in-einer-Reihe-Vektoren betrachten, um zu bestimmen, ob der Vektor ein leeres Quadrat enthält und ob jedes der anderen zwei Felder Markierungen für denselben Gegner enthält (ist, zwei X's oder zwei O's).
Sie können das tun, indem Sie 0 verwenden, um ein leeres Quadrat darzustellen, 1 um ein X darzustellen und 2 um ein O zu repräsentieren. Aber das würde ziemlich komplizierte Logik erfordern - so etwas wäre erforderlich, vorausgesetzt, dass s1, s2, und s3 sind ganze Zahlen, die den Inhalt der drei Quadrate eines der acht, drei in einer Reihe liegenden Vektoren enthalten:
if (s1 == 0 & s2 == 1 & s3 == 1) // X kann Gewinn durch Spielen in s1 if (s2 == 0 & s1 == 1 & s3 == 1) // X kann gewinnen durch Spielen in s2 if (s3 == 0 & s1 == 1 & s2 == 1) // X kann gewinnen, indem man in s3
spielt. Hier ein Tipp: Anstatt 0, 1 und 2 zu verwenden, um ein leeres Quadrat, ein X und ein O darzustellen, verwende stattdessen die Primzahlen 2, 3 und 5.Um dann zu bestimmen, ob ein Spieler einen bestimmten Vektor gewinnen kann, multiplizieren Sie einfach die drei Werte für diesen Vektor. Wenn das Ergebnis 18 ist, kann X gewinnen (233 = 18). Wenn das Ergebnis 50 ist, kann O gewinnen (255 = 50).
Beachten Sie auch, dass, obwohl diese Strategie eine Verbesserung gegenüber der Strategie ist, die für frühere Versionen des Programms verwendet wurde, es immer noch keine perfekte Strategie ist: Sie können den Computer immer noch mit der richtigen Abfolge von Spielen schlagen. Wenn Sie eine zusätzliche Herausforderung haben möchten, überlegen Sie sich, welche zusätzliche Strategie notwendig wäre, um das Spiel unwinnbar zu machen, und überlegen Sie dann, wie Sie die neue Strategie umsetzen können.
Die Lösung für diese Herausforderung finden Sie auf der Registerkarte Downloads der Produktseite Java All-in-One für Dummies, 4th Edition.
Viel Glück!