Partage
  • Partager sur Facebook
  • Partager sur Twitter

JFrame qui se "bloque"

Sujet résolu
    20 mars 2010 à 19:56:26

    �                 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.>
    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:
    @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:
    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:
                  �
    • Partager sur Facebook
    • Partager sur Twitter
      20 mars 2010 à 20:00:46

      commence par mettre ton code dans les balises appropriées.
      • Partager sur Facebook
      • Partager sur Twitter
        20 mars 2010 à 20:13:40

        c'est vrai que c'est plus joli comme ça :)
        • Partager sur Facebook
        • Partager sur Twitter
          20 mars 2010 à 20:15:33

          Pas très joli en fait, remplaces <code> par<code type="java">
          • Partager sur Facebook
          • Partager sur Twitter
            20 mars 2010 à 20:49:09

            wow merci du tuyau, ça en devient presque de l'art
            • Partager sur Facebook
            • Partager sur Twitter
              21 mars 2010 à 21:38:24

              Juste comme ça :
              if (s == "1 joueur - IA commence")
              

              J'ai vu plus haut que s était un objet (un String même). Donc dans ce cas là ta condition sera toujours false.
              On teste l'égalité entre deux objets avec la méthode equals() !

              Pour ce qui est de ton soucis, aucune idée. Ca peut venir d'une boucle infinie, du thread dédié à Swing surchargé (c'est typique quand l'application ne répond plus), du mauvais schéma add-remove-validate, que sais-je encore...
              • Partager sur Facebook
              • Partager sur Twitter
                22 mars 2010 à 0:06:47

                pour les String c'est vrai que j'aurais du mettre ça avec la méthode equals, enfin étrangement ça fonctionne.

                Fin du coup j'avance pas vraiment. Mais merci quand même de ta réponse.
                • Partager sur Facebook
                • Partager sur Twitter
                  22 mars 2010 à 0:57:28

                  D'abord lorsque le programme plante sans lancer aucune exception, dans 99% des cas il s'agit d'une boucle infinie.
                  lors du clic sur le Bouton, l'ActionPerformed() du listener du bouton s'exécute, donc le programme fera appel à la méthode c.nouvellePartie() et hop, une belle boucle infinie que le programme n'en sortira jamais !!!
                  Les threads doivent résoudre le problème, cf le tuto de Cysboy pour plus d'infos ...
                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 mars 2010 à 1:10:14

                    beh j'ai pas de boucle dans nouvellePartie() :(

                    Et puis quand je lance en debug, je mets un point d'arrêt à ce niveau. Ca va bien jusqu'à:

                    res = joueurCour.coup(model, numJoueur);

                    Et cette méthode attend une action du joueur.
                    Si c'est l'IA qui joue, j'ai l'affichage dans la console qui me montre qu'il joue bien, mais quand c'est au tour d'un joueur humain (que ce soit en 1er ou après l'IA) cette méthode attend une action du joueur, c'est à dire un clic sur un bouton de la frame. Seulement impossible de cliquer dans un composant de la frame puisqu'elle est freezée...


                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 mars 2010 à 1:23:31

                      Citation : minod

                      beh j'ai pas de boucle dans nouvellePartie() :(



                      Si !! nouvellePartie() fait appel a la méthode jouer() qui, elle, contient une boucle, dans ccette boucle, ta méthode attends l'action du joueur, alors que ce dernier ne peut effectuer aucune action car la Gui reste bloquée dans l'actionPerformed()
                      Donc je répète : threads :)</span>
                      • Partager sur Facebook
                      • Partager sur Twitter
                        22 mars 2010 à 1:25:00

                        ok, merci du conseil, j'essaierai demain avec des threads.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          22 mars 2010 à 20:28:59

                          Citation : minod

                          pour les String c'est vrai que j'aurais du mettre ça avec la méthode equals, enfin étrangement ça fonctionne.

                          Fin du coup j'avance pas vraiment. Mais merci quand même de ta réponse.



                          C'est normal que ca fonctionne, comme c'est des string déclaré en dur dans le code, il s'agit à chaque fois du même objet String, c'est une optimisation du compilateur. Par contre c'est juste immonde de faire ca, pourquoi utiliser des string lol, tu pouvais simplement utiliser des enum, et même si tu ne connaissais pas les enum tu aurais alors dû utiliser un int ou un char avec des final pour définir leurs différente valeur possible et leurs signification grâce au nom de la constante.

                          Sinon pas besoin de thread, car en fait tu as déjà deux thread, en effet les méthodes actionPerformed sont exécutée dans le thread de la gui (logique parce que sinon tu pourrais pas appuyer sur un bouton tant que ton programme fais autre chose). Donc au lieu de relancer la méthode, il suffit que depuis l'actionPerformed tu set un boolean dans ta class Controler pour que ta boucle de jeu puisse alors réinitaliser la partie.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            24 mars 2010 à 0:03:46

                            merci anarion, je m'en suis sorti grâce à ta méthode, sujet résolu.
                            • Partager sur Facebook
                            • Partager sur Twitter

                            JFrame qui se "bloque"

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown