Bonjour à tous !
Actuellement en train de développer un puissance 4, je sèche un peu sur l'IA.
En effet, je pensais que ma fonction qui attribue les scores aux différents coups n'était pas bonne (et c'est surement le cas) mais ce n'est pas le seul problème. En gros, mon algo ne fonctionne pas très bien ^^
Petite paranthèse: j'en ai parlé avec quelqu'un ayant développé un système similaire et il m'a confirmé que ma méthode de vérification pouvait fonctionner. En effet, ma vérification de grille ne scanne pas toute la grille mais se base sur x et y (x étant la dernière colonne choisie et y étant le dernier emplacement de la colonne rempli). De ce fait, la vérification se fait dans tous les sens sur base du dernier jeton placé. Quelle est la meilleure solution finalement ?
Sinon, voici ma fonction NegaMax avec l'élaguage Alpha-Beta:
Et voici comment je l'appelle:
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 int IA_NegaMaxAlphaBeta(int profondeur, int alpha, int beta, int grille[LIGNES][COLONNES], int emplacements[COLONNES], int colonne, int emplacement, int joueur) { int x = COLONNES/2, y, i, k = 1; if (profondeur == 0) { return IA_Evaluation(grille, emplacements, colonne, emplacement, joueur); } for(i = 0; i < COLONNES && alpha < beta; i++) { // EFFICACITE: Balayer les colonnes du milieu vers l'extérieur (alternativement gauche/droite) x += i*k; k = -k; if (emplacements[x] > -1) { y = InsererJeton(grille, emplacements, x, joueur); alpha = max(alpha, -IA_NegaMaxAlphaBeta(profondeur-1, -beta, -alpha, grille, emplacements, x, y, joueur^1)); AnnulerJeton(grille, emplacements, y, x); } } return alpha; }
Est-ce la bonne technique ? Qu'est-ce qui cloche dans le code ?
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 int x = COLONNES/2, y, i, k = 1, scoreCoup, scoreMeilleur = -1000000, col = -1; for(i = 0; i < COLONNES; i++) { // EFFICACITE: Balayer les colonnes du milieu vers l'extérieur (alternativement gauche/droite) x += i*k; k = -k; if (emplacements[x] > -1) { y = InsererJeton(grille, emplacements, x, joueur); scoreCoup = IA_NegaMaxAlphaBeta(4, -1000000000, 1000000000, grille, emplacements, colonne, emplacement, joueur); if (scoreCoup > scoreMeilleur) { scoreMeilleur = scoreCoup; col = x; } AnnulerJeton(grille, emplacements, y, x); } }
Pour ma fonction qui attribue des scores, je suis un peu dans le flou... Avez-vous des idées pour avoir une fonction assez performante ?
Merci d'avance pour votre aide.
Bonne journée !
Partager