Bonsoir,
je suis en train de programmer un jeu de morpion qui va de la taille 3*3 a 30*30.
Dans un soucis d’optimisation, j'ai complètement changé mon ia. Je suis passé de l’idée de minimax (qui marchais très bien, mais pas encore suffisamment optimisé ) a une idée de for imbriqués.
Voici mon idée actuelle (en résumé) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
ia{
Déclaration des variables
profondeur maximale de recherche : ici 3 (mais dépendra de la dimension du plateau de jeu)
On connais deja la liste des cases vides donc jouables
 
 for (i=0; i<NbCasesVides; i++) //pour toutes les cases vides du plateau,
    {
        JouerCoup(i);
        verifFini(...);
...
        AnnulerCoup(...);
        AnnuleVerifFini(...);
    }
 
Si on ne peut pas gagner en jouant 1 case (pour le joueur), alors on continue la recherche en testant 2 cases (pour le joueur et l'adversaire)
 
for (j=0; j<NbCasesVides; j++) //pour toutes les cases vides du plateau,
    {
      for (i=0; i<NbCasesVides; i++) //pour toutes les cases vides du plateau,
       {
            if(i!=j)//si on choisit une case pas deja testée, alors
            {
                  JouerCoup(j);
                  JouerCoup(i);
                  verifFini(...);
 
                  AnnulerCoup(...);
                  AnnulerCoup(...);
                  AnnuleVerifFini(...);
    }}}
 
Si on ne peux pas gagner en jouant 2 cases(pour le joueur et l'adversaire), alors on continue la recherche en testant 3 cases (joueur - adversaire - joueur)
 
for (m=0; m<NbCasesVides; m++) //pour toutes les cases vides du plateau, pour O
{
    for (j=0; j<NbCasesVides; j++) //pour toutes les cases vides du plateau, pour X
    {
        for (i=m+1; i<NbCasesVides; i++) //pour toutes les cases vides du plateau, pour O mis plus grand que m sinon deja testée
       {
            if((i!=j)&&(j!=m))//si on choisit une case pas deja testée, alors
            {
                JouerCoup(m);// ia teste m pour lui
                JouerCoup(j);// ia teste j pour lui
                JouerCoup(i);// ia teste i pour l'adversaire
                verifFini(...);
 
                AnnulerCoup(...);
                AnnulerCoup(...);
                AnnulerCoup(...);
                AnnuleVerifFini(...);
             }
        }
    }
}
 
 
On joue la case choisie.
}

Mon problème est le suivant :
1. Il est fortement possible que je soit obligé d'aller plus loin que 3 cases testées : (joueur - adversaire - joueur - adversaire)
2. Mon code se répète (à l'intérieur des boucles for). Mais je n'arrive pas à faire une fonction récurrente qui accumule le nombre de for et ne reprends pas une valeur deja testée
3. Si je teste 4 cases avec les variables i, j,m, n, (avec m>i et n>j) il faut aussi que i!=j, (i!=m), i!=n, j!=m, (j!=n), m!=n avant de jouer.
4. Si je teste 5 cases avec les variables i, j,m,n,r (avec r>m>i et n>j) il faut aussi que i!=j, (i!=m), i!=n,( i!=r), j!=m,( j!=n),j!=r, m!=n, (m!=r), n!=r avant de jouer.

Je vous serais très reconnaissant de bien vouloir m'aider.