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).
Tic Tac Toe-die perfekte AI-Algorithmus: tiefer in
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

Schreibe einen Kommentar