IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Java Discussion :

Jframe qui se "bloque"


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 17
    Par défaut Jframe qui se "bloque"
    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.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 17
    Par défaut
    personne n'a le courage de lire mon code?

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo