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.
Partager