Bonjour,
Je travaille sur un TD morpion pour ma formation et je bloque un peu sur la méthode qui permet de trouver un gagnant.
La version du morpion sur laquelle on travaille est évolutive avec une grille n*n et il faut aligner 5 pions pour gagner.
Pour le moment, j’ai une première méthode rechercherAlignement() qui recherche un alignement de pions du joueur courant.
La méthode rechercherAlignement() est appelée par une méthode coupGagnant() qui recherche après chaque coup, un alignement de pions du joueur courant dans toutes les directions (8 directions) à partir de la position du dernier pion joué.
Cet algo ne me détecte pas toutes les combinaisons gagnantes*:
exemple 1*: dernier position jouée (3,3) → gagnant non détecté
[ X ] [ O ] [ X ] [ O ] [ O ] [ O ]
[ O ] [ X ] [ X ] [ O ] [ X ] [ O ]
[ O ] [ O ] [ X ] [ X ] [ O ] [ O ]
[ O ] [ O ] [ O ] [ X ] [ X ] [ O ]
[ O ] [ O ] [ X ] [ O ] [ X ] [ X ]
[ O ] [ O ] [ O ] [ O ] [ O ] [ O ]
exemple 2*: dernier position jouée (4,4) → gagnant détecté
[ X ] [ O ] [ X ] [ O ] [ O ] [ O ]
[ O ] [ X ] [ X ] [ O ] [ X ] [ O ]
[ O ] [ O ] [ X ] [ X ] [ O ] [ O ]
[ O ] [ O ] [ O ] [ X ] [ X ] [ O ]
[ O ] [ O ] [ X ] [ O ] [ X ] [ X ]
[ O ] [ O ] [ O ] [ O ] [ O ] [ O ]
Je ne vois pas trop comment faire sans multiplier les tests tout autours de la dernière position jouée.
d’avance merci de votre aide.
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
59
60
61
62 boolean coupGagnant(int x, int y) { //case courante = dernier pion joué int ligne = x; int colonne = y; //boucle sur les tableaux de déplacements pour faire une recherche //dans toutes les directions de la dernière case jouée for (int i=0; i<8; i++) { //case de départ --> dernier coup joué //on stocke le nombre de pions alignés dans chaque direction alignement[i] = rechercherAlignement(ligne, colonne, DEP_COL[i], DEP_LIG[i]); //println("Nombre de pions alignés direction "+i+": "+alignement[i]); //Vérification des conditions pour gagner if (alignement[i]>=5) { println("Joueur "+joueurCourant+" gagnant"); //textSize(24); //textAlign(CENTER, CENTER); //text("Joueur "+joueurCourant+" gagnant", 400, 50); return true; } } return false; } int rechercherAlignement(int x, int y, int depX, int depY) { int ligne = x; int colonne = y; int nombreAlignes = 0; //On récupère la liste des cases composant l'alignement pour //éventuellement le ré-afficher //ArrayList<Integer> listeCases = new ArrayList<>(); //5 == au nombre de pion qui doivent être alignés pour gagner for (int i=0; i<5; i++) { //si la case correspond à un pion du joueur courant //on incrémente le compteur //on teste que l'on est dans la grille if (ligne>=0 && ligne<nbCases && colonne>=0 && colonne<nbCases) { if (tableau[ligne][colonne]==joueurCourant) { nombreAlignes++; //sinon, on réinitialise le compteur } else { nombreAlignes=0; } //deplacement depuis la position du dernier pion joué //utiliser le tableau des déplacements en X et Y colonne+=depX; ligne+=depY; } } ligne = 0; colonne = 0; return nombreAlignes; }
Partager