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:
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 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
 
 
 
@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();
 
	}
}
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
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.