Bonjour à tous,

Voilà je dois faire le jeu "Lines of Action" comme projet. J'ai pas mal de soucis, et en plus je débute dans la programmation ainsi qu'en Java.

J'ai donc tenté de faire une methode qui ... me dise si un joueur à gagné ou pas.

Bon le code n'est pas forcément beau, j'ai tenté un "semi" backtracking (je n'en avais jamais fais auparavant et je sèche vraiment sur le code ...).

Je sais qu'il doit y avoir une methode toute simple pour faire ça, et que j'ai du faire bien compliqué mais bon ...

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
 private int Back (ArrayList<Coordinate> ListPositionJ, int joueur, Coordinate coord, int nbr) {
     int k = 0;
     int r = coord.getRow();
     int c = coord.getColumn();
 
     for (Coordinate coordB : ListPositionJ) {
         if (coord.equals(coordB)) { k = 1; }
     }
     if (k == 0) { ListPositionJ.add(coord); nbr++;}
 
     if (inTab(r, (c+1))) {
         if (M[r][c+1] == joueur) {
             coord = new Coordinate(r,(c+1));
             Back(ListPositionJ, joueur, coord, nbr);
         }
     }
     if (inTab((r+1), (c+1))) {
         if (M[r+1][c+1] == joueur) {
             coord = new Coordinate((r+1),(c+1));
             Back(ListPositionJ, joueur, coord, nbr);
         }
     }
     if (inTab((r+1), c)) {
         if (M[r+1][c] == joueur) {
             coord = new Coordinate((r+1),c);
             Back(ListPositionJ, joueur, coord, nbr);
         }
     }
     if (inTab((r+1), (c-1))) {
         if (M[r+1][c-1] == joueur) {
             coord = new Coordinate((r+1),(c-1));
             Back(ListPositionJ, joueur, coord, nbr);
         }
     }
     if (inTab(r, (c-1))) {
         if (M[r][c-1] == joueur) {
             coord = new Coordinate(r,(c-1));
             Back(ListPositionJ, joueur, coord, nbr);
         }
     }
     if (inTab((r-1), (c-1))) {
         if (M[r-1][c-1] == joueur) {
             coord = new Coordinate((r-1),(c-1));
             Back(ListPositionJ, joueur, coord, nbr);
         }
     }
     if (inTab((r-1), c)) {
         if (M[r-1][c] == joueur) {
             coord = new Coordinate((r-1),c);
             Back(ListPositionJ, joueur, coord, nbr);
         }
     }
     if (inTab((r-1),(c+1))){
         if (M[r-1][c+1] == joueur) {
             coord = new Coordinate((r-1),(c+1));
             Back(ListPositionJ, joueur, coord, nbr);
         }
     }
     return nbr;
 }
 
private int seTouche(Coordinate coord, int joueur){
    ListPositionJ = new ArrayList<Coordinate>();
    int k = 0;
    int nb = Back(ListPositionJ, joueur, coord, k);
 
    return nb;
}
 
private Coordinate CoordJ (int joueur) {
    int k = 0;
    Coordinate coord = null;
    for (int r = 0 ; r < M.length; r++) {
        for (int c = 0; c < M.length; c++) {
            if ((M[r][c] == joueur) && (k == 0)) { coord = new Coordinate(r,c); k = 1; }
        }
    }
    return coord;
    }
 
/**
  * @pre  -
  * @post renvoie l'indication appropriée sur un éventuel gagnant:
  *       une des constantes X_WIN, O_WIN, PAT, NOBODY
  */
  private int winOrPat() {
  int nbB = nbJoueur(PLAYER_B);
  int nbN = nbJoueur(PLAYER_N);
 
  int ToF = seTouche(CoordJ(PLAYER_B), PLAYER_B);
  if (ToF == nbB) {return B_WIN;}
    else {
      ToF = seTouche(CoordJ(PLAYER_N), PLAYER_N);
      if (ToF == nbN) {return N_WIN;}
        else {
          return NOBODY;
        }
    }
 
  }
En gros, WinOrPat appelle ma methode seTouche, avec comme coordonnée la première occurence de pion du joueur choisis (CoordJ), et dans seTouche, la methode Back est appellé, qui regarde tout autour d'elle si il y a un pion du joueur, et si c'est dans le tableau (inTab), et si c'est le cas, je réappelle récurcivement Back.

Je me doutes que ca doit être moche, mais je débute

Merci d'avance !