Tic Tac Toe parfait AI algorithme: plus profond dans "créer fourche" étape

J'ai déjà lu beaucoup de Tic Tac Toe sujets sur StackOverflow. Et j'ai trouvé la stratégie sur Wikipédia est adapté à mon projet de présentation:

Un joueur peut jouer parfait tic-tac-toe si elles choisissent de le déplacer avec le
la priorité la plus élevée dans le tableau suivant[3].

1) Win: Si vous avez deux dans une rangée, jouer le troisième d'obtenir trois dans une
ligne.

2) Bloc: Si l'adversaire a deux en ligne, jouer à la troisième bloc
.

3) Fourche: Créer une occasion où vous pouvez gagner de deux façons.

4) Bloquer l'Adversaire Fourche:

Option 1: Créer deux dans une rangée pour forcer l'adversaire à défendre, comme
longtemps qu'il n'a pas en eux de la création d'une fourchette ou de gagner. Pour
exemple, si "X" a un coin, "O" est le centre, et "X" a la
coin opposé, "O" ne doit pas jouer un coin afin de gagner.
(La lecture d'un coin dans ce scénario crée une fourchette pour "X" pour gagner.)

Option 2: Si il y a une configuration où l'adversaire peut fourche,
bloc de fourche.

5) Center: Jouez du centre.

6) Coin Opposé: Si l'adversaire est dans le coin, jouer de la
coin opposé.

7) Coin Vide: Jouer un coin vide.

8) Vide Côté: Jouer un coté vide.

J'ai suivi ces étapes, et l'ordinateur ne perd jamais. Toutefois, la façon dont il attaque n'est pas parfait. Parce que je n'ai aucune idée de comment faire l'étape 3. Voici ce que je fais dans l'étape 3: la numérisation de chaque cellule, de vérifier si mettre un jeton sur la cellule crée une fourchette, puis l'a mis là.

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;
    }

}

Merci de me donner quelques conseils sur cette étape.

EDIT1: Le comte de la fourche va compter combien de fourche ordinateur (ordinateur de jetons est de 2, jetons des joueurs est de 1, parce que j'ai utilisé cette méthode pour l'étape 4 aussi, donc il y a un paramètre pour jeton dans countFork fonction).

EDIT2: La raison pour laquelle je dis qu'il n'est pas parfait, c'est ce (CPU passe en premier, et ses cellules sont en bleu, les cellules humaines sont en rouge).
Tic Tac Toe parfait AI algorithme: plus profond dans
Comme vous pouvez le voir, si je le mets dans la partie supérieure de la cellule, l'ordinateur gagne. Mais si je le mets sur le côté droit de la cellule, c'est une cravate, bien que l'ordinateur peut encore gagner.

EDIT3: je Ne sais pas pourquoi, mais j'ai commenté l'étape 3, et l'ordinateur joue... parfaitement! Je suis vraiment surpris! Voici mon countFork fonction (j'ai besoin de port ce code d'Alice, qui ne prend pas en charge 2-dimension tableau, j'ai donc utiliser getNumberFromXY de convertir 2-dimension tableau à 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: correction du bug selon soandos, et mise à jour du code à MODIFIER 3, maintenant il fonctionne parfaitement!

source d'informationauteur Luke Vo