Tic Tac Toe-die perfekte AI-Algorithmus: tiefer in "erstellen Gabel" Schritt
Hab ich auch schon gelesen, dass viele Tic Tac Toe Themen auf StackOverflow. Und ich fand die Strategie auf der Wikipedia ist passend für meine Präsentation Projekt:
Ein Spieler kann perfekt tic-tac-toe, wenn Sie wählen Sie das verschieben mit der
höchste Priorität in der folgenden Tabelle[3].1) Gewinnen: Wenn Sie zwei in einer Reihe, spielen die Dritte, um drei in einem
Zeile.2) - Block: Wenn der Gegner hat zwei in einer Reihe, spielen die Dritte, um zu blockieren
.3) Gabel: Erstellen Sie eine Gelegenheit, wo Sie gewinnen können, gibt es zwei Möglichkeiten.
4) Block Gegners Gabel:
Option 1: Erstellen Sie zwei in einer Reihe zu zwingen, den Gegner in der Verteidigung, als
solange führen Sie nicht in Sie schaffen eine Gabel oder zu gewinnen. Für
Beispiel, wenn "X" hat eine Ecke, "O" hat das Zentrum, und "X" hat die
entgegengesetzte Ecke, "O" darf nicht spielen eine Ecke, um zu gewinnen.
(Das spielen von einer Ecke in diesem Szenario erzeugt eine Gabel für "X" zu gewinnen.)Option 2: Wenn es eine Konfiguration, wo der Gegner kann Gabel,
block, Gabel.5) Center: Spielen der Mitte.
6) Gegenüberliegende Ecke: Wenn der Gegner in der Ecke, spielen die
gegenüberliegenden Ecke.7) Leere Ecke: Spielen Sie eine leere Ecke.
8) Leere Seite: Spielen Sie eine leere Seite.
Ich habe folgte diesen Schritt, und der computer verliert nie. Jedoch, die Art von it-Angriffen ist nicht perfekt. Weil ich habe keine Ahnung, wie zu tun, Schritt 3. Hier ist, was ich in Schritt 3: Scannen Sie jede Zelle prüfen, ob der put-token auf, die Zelle erzeugt eine Gabel, dann legen Sie es dort.
private void step3() //Create Fork.
{
int[] dummyField = (int[])field.Clone();
//Try Level 1 Dummy
for (int i = 0; i < 9; i++)
{
if (dummyField[i] != 0) continue;
dummyField[i] = 2;
if (countFork(dummyField, 2) >= 2)
{
nextCell = i;
return;
}
dummyField[i] = 0;
}
}
Bitte geben Sie mir einige Ratschläge zu diesem Schritt.
EDIT1: Die Anzahl Gabel zählen, wie viele Gabeln, die computer (computer-Token 2, Spieler-Token 1 ist, denn ich habe diese Methode in Schritt 4 zu, so gibt es einen parameter für den token countFork
- Funktion).
EDIT2: Der Grund, warum ich sagen, es ist nicht perfekt, ist dies (CPU geht zuerst, und seine Zellen sind blau, die menschliche Zellen sind rot).
Wie Sie sehen können, wenn ich in der oberen Seite der Zelle, der computer gewinnt. Aber, wenn ich in der rechten Seite der Zelle, ist es ein Unentschieden, obwohl der computer noch gewinnen kann.
EDIT3: ich weiß nicht warum, aber ich kommentierte den Schritt 3, und der computer spielt... perfekt! Ich bin wirklich überrascht! Hier ist mein countFork-Funktion (brauche ich zum Anschluss diesen code, um Alice, die nicht unterstützt 2-dimensionales array, so dass ich mit getNumberFromXY zu konvertieren 2-dimensionales array in 1 dimension):
private int countFork(int[] field, int token)
{
int result = 0;
//Vertical
int cpuTokenCount;
int spareCell;
for (int x = 0; x < 3; x++)
{
cpuTokenCount = 0;
spareCell = -1;
for (int y = 0; y < 3; y++)
{
if (field[getNumberFromXY(x, y)] == token)
cpuTokenCount++;
else if (field[getNumberFromXY(x, y)] == 0)
spareCell = getNumberFromXY(x, y);
}
if (cpuTokenCount == 2 && spareCell != -1) result++;
}
//Horizontal
for (int y = 0; y < 3; y++)
{
cpuTokenCount = 0;
spareCell = -1;
for (int x = 0; x < 3; x++)
{
if (field[getNumberFromXY(x, y)] == token)
cpuTokenCount++;
else if (field[getNumberFromXY(x, y)] == 0)
spareCell = getNumberFromXY(x, y);
}
if (cpuTokenCount == 2 && spareCell != -1) result++;
}
//Top-Left To Lower-Right Diagonal
cpuTokenCount = 0;
spareCell = -1;
for (int i = 0; i < 3; i++)
{
if (field[getNumberFromXY(i, i)] == token)
cpuTokenCount++;
else if (field[getNumberFromXY(i, i)] == 0)
spareCell = getNumberFromXY(i, i);
}
if (cpuTokenCount == 2 && spareCell != -1) result++;
//Top-Right To Lower-Left Diagonal
cpuTokenCount = 0;
spareCell = -1;
for (int i = 0; i < 3; i++)
{
if (field[getNumberFromXY(2 - i, i)] == token)
cpuTokenCount++;
else if (field[getNumberFromXY(2 - i, i)] == 0)
spareCell = getNumberFromXY(2 - i, i);
}
if (cpuTokenCount == 2 && spareCell != -1) result++;
return result;
}
EDIT4: der Fehler nach soandos, und aktualisiert den code zu BEARBEITEN 3, jetzt funktioniert es perfekt!
InformationsquelleAutor der Frage Luke Vo | 2011-11-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin nicht sicher, ob es der eleganteste Weg, es zu tun, aber hier ist eine zwei-Schritt-Weise der Blick auf die Gabeln.
Wenn der computer nicht gewinnen kann nächsten Zug, und es ist nicht das erste oder zweite Abzweigung, Gabel könnte möglich sein (dies geht nicht mit dem erstellen der setup für die Gabel, nur der Suche nach einer Gabel).
Für jede der Zellen, die leer sind, füllen Sie es, dann führen Sie die Schritt 1-Funktion (sieht, wenn es zwei in einer Reihe). Wenn es feststellt, dass zwei Orte, herzlichen Glückwunsch, Sie haben eine Gabel. Wenn nicht, dann nicht.
InformationsquelleAutor der Antwort soandos