Bonjour.
J'ai développé un petit jeu de puissance4, avec possibilité de jouer en JoueurvsJoueur, JoueurvsIA, et IAvsIA.
Le jeu fonctionne parfaitement par le biais de la console (entrer les valeurs à la main, et affichages console), donc les méthodes du jeu en lui-même n'ont aucun problème.
Je me heurte juste à un problème graphique:
Lorsque je lance l'application, la fenêtre de nouvelle partie s'ouvre bien, je choisis le mode de jeu, et je peux jouer une partie comme il faut.
Le problème est que si la partie se termine, ou que je clique sur le bouton "nouvelle partie", ma fenêtre de jeu se "bloque", aucune erreur dans la console et je n'ai plus qu'à forcer l'arrêt du programme à la main.
J'ai fait quelques tests et ai pu remarquer que lors de la première partie, isActive(maVue) vaut true, et dès que j'essaie de faire une seconde partie, isValide(maVue) vaut false...
Je vous joins des extraits du code, ce qui concerne les interactions avec l'interface, puisque le problème vient uniquement de là.
Classe Controler:
Classe Vue:
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142 public class Controler { public static Vue maVue; public void setVue(Vue v) { maVue = v; } private static Model model; static FonctionEvaluationCharles f = new FonctionEvaluationCharles(); static JoueurAlphaBeta2 IA1 = new JoueurAlphaBeta2(Model.JOUEUR1,f,6); static JoueurAlphaBeta2 IA2 = new JoueurAlphaBeta2(Model.JOUEUR2,f,6); static JoueurHumain j1 = new JoueurHumain(); static JoueurHumain j2 = new JoueurHumain(); public Controler(Model g){ model=g; } public static void nouvellePartie() { reinitVue(); Object[] possibilities = {"1 joueur - IA commence","1 joueur - joueur commence", "2 joueurs", "IA vs IA"}; String s = (String)JOptionPane.showInputDialog( maVue, "Sélectionnez le mode de jeu : ", "Customized Dialog", JOptionPane.PLAIN_MESSAGE, null, possibilities, "1 joueur"); if (s == "1 joueur - IA commence") { IA1 = new JoueurAlphaBeta2(Model.JOUEUR1,f,6); j1 = new JoueurHumain(); jouer(IA1,j1); } else if (s == "1 joueur - joueur commence") { IA1 = new JoueurAlphaBeta2(Model.JOUEUR1,f,6); j1 = new JoueurHumain(); jouer(j1,IA1); } else if (s == "2 joueurs"){ j1 = new JoueurHumain(); j2 = new JoueurHumain(); jouer(j1,j2); } else { IA1 = new JoueurAlphaBeta2(Model.JOUEUR1,f,6); IA2 = new JoueurAlphaBeta2(Model.JOUEUR2,f,6); jouer(IA1,IA2); } reinitVue(); System.out.println("Nouvelle partie lancée !"); } /** * Fonction qui effectue la boucle de jeu. * * @param joueur1 : le premier joueur. - ROUGE * @param joueur2 : le second joueur. - JAUNE */ public static void jouer(Joueur joueur1, Joueur joueur2){ Resultat res; int coup; Joueur joueurCour = joueur1; int numJoueur = Model.JOUEUR1; //le joueur 1 commence à jouer int vainqueur = 0;//match nul boolean jeuFini = false; //boucle de jeu while(!jeuFini){ //affichage de la model System.out.println(model); res = joueurCour.coup(model, numJoueur); coup = res.getColonne(); if(model.coupGagnant(numJoueur, coup)){ model.joueEn(numJoueur, coup); if(!model.peutJouerEn(coup)) maVue.desactiverBouton(coup); maVue.repaint(); vainqueur = numJoueur; jeuFini = true; } else{ model.joueEn(numJoueur, coup); if(!model.peutJouerEn(coup)) maVue.desactiverBouton(coup); maVue.repaint(); numJoueur = model.joueurSuivant(numJoueur); if(joueurCour == joueur1)joueurCour = joueur2; else joueurCour = joueur1; } if(model.estPleine()) jeuFini = true; }//while - boucle de jeu //affichage de la model System.out.println(model); //affichage du vainqueur switch(vainqueur){ case Model.JOUEUR1: System.out.println("Victoire du joueur 1"); JOptionPane.showMessageDialog(maVue, "Le joueur"+Model.JOUEUR1+"a gagné. Bravo !"); break; case Model.JOUEUR2: JOptionPane.showMessageDialog(maVue, "Le joueur"+Model.JOUEUR2+"a gagné. Bravo !"); break; default: System.out.println("Match nul"); JOptionPane.showMessageDialog(maVue, "Egalité !"); } } public void setModel(Model model){ Controler.model=model; } public static void reinitVue(){ maVue.reinitialiser(model); } }
Classe Model:
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 @SuppressWarnings("serial") // pour retirer un warning public class Vue extends JFrame { public final String[] STATUS = {"Joueur Rouge joue", "Joueur Jaune joue"}; private Controler c; private Model model; public Vue(Controler c, Model model) { this.c = c; this.model=model; creerInterface(); } public void creerInterface() { setDefaultCloseOperation(EXIT_ON_CLOSE); superPanel = new JPanel(); //Création de l'interface..... //bouton pour lancer une nouvelle partie JButton bNouveau = new JButton("Nouvelle partie !"); bNouveau.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { c.setModel(new Model()); c.nouvellePartie(); } }); //ajout de tous les composants graphiques add(superPanel); } public void reinitialiser(Model model) { this.model=model; repaint(); } }
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 public class Model{ public static final int NB_LIGNES = 6; public static final int NB_COLONNES = 7; public static final int JOUEUR1 = -1; public static final int JOUEUR2 = 1; private static final Random RANDOM = new Random(); private int[][] _model; //la model représentant le jeu private int[] _libre; //la 1ère colonne libre de chaque ligne private int _nbCoups; //le nombre de coups joués //Je vous épargne toutes les méthodes de la classe, qui fonctionnent parfaitement en mode console //Le problème vient uniquement du refresh de l'interface graphique lors du lancement d'une nouvelle partie public Model(){ _model = new int[NB_LIGNES][NB_COLONNES]; _libre = new int[NB_COLONNES]; _nbCoups = 0; } public int joueurSuivant(int joueur){ int advers; switch(joueur){ case JOUEUR1: advers = JOUEUR2; break; default: advers = JOUEUR1; } return advers; } public int get_model(int l,int c){ return _model[l][c]; } public int[][]getModel(){ return _model; } }
En espérant que vous saurez me sauver : )
Merci.
Partager