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

Langage Java Discussion :

Des "else if " interminables!


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 13
    Par défaut Des "else if " interminables!
    Bonjour,

    Je sollicite votre aide s'il vous plait, je suis bloqué depuis plus de 5 jours...

    Voici mon problème:

    Je travaille sur une application sous forme de QCM de maths.Après avoir selectionné un niveau scolaire, un chapitre et un niveau de difficulté, l'utilisateur arrive sur l'écran qui lui permet de travailler sur un QCM qui a été généré alétoirement selon les choix qu'il avait faits.

    Sur cet écran (le code ci-joint concerne uniquement cet écran), l'utilisateur se trouve devant une question et 3 boutons radio comme réponses (dont une seule est la bonne).

    Voici ce que je souhaite réaliser:

    L'utilisateur choisit une première réponse, si elle est bonne, un message est affiché sur un label accompagné d'un effet sonore(message1 + effet1) , les deux autres bontons sont désactivés. Si la réponse est fausse, un nouveau message accompagné d'un autre effet sonore (message2 +effet2) est affiché, le bouton en question est désactivé et on attend la réponse de l'utilisateur sur le même écran.Si la réponse est bonne alors (message1 +effet1) sinon on affiche un troisième message accompagné d'un troisième effet sonore(message3+effet3).

    Je suis arrivé à rédiger un code avec des "else if" interminables sauf qu'il ne tourne pas comme je le souhaite : si l'utilisateur se trompe la première et la deuxième fois, l'effet sonore3 est joué mais le message 3 n'est pas affiché..!

    J'ai bon cherché la cause mais en vain. Je sais que ça vient de mes "else if" mais je ne trouve pas. Je sais aussi qu'il y'a certaiment une autre façon de procéder, j'ai pensé (et essayé) avec des hread mais toujours en vain.

    J'ai aussi inséré des compteurs pour compter les bonnes et mauvaises réponses de l'utilisateur (histoire de lui faire un récapitilatif en fin de QCM) mais les valeurs retournées par ces variables ne reflètent pas non plus la réalité.

    Si quelqu'un voudrait bien me venir en aide, j'en serais reconnaissant..
    Fichiers attachés Fichiers attachés

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Par défaut
    Pour ma part, plutôt que de gérer des if et else, j'attribuerai un entier (1, 2, 3) à chaque réponse (une valeur dans une classe dédiée, avec set et get; personnellement je fais toujours une classe spécifique pour ces valeurs temporaires) et ferais :
    swith(réponse){
    case 1: (//l'effet souhaité
    break;
    case 2 :idem
    case 3 :idem}

    Ce serait plus simple à gérer vraisemblablement.

  3. #3
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 13
    Par défaut
    C'est vrai qu'on pourrait utiliser les switch... case, d'ailleurs je vais essayer le faire, mais ce qui m'intrigue le plus dans mon code, c'est pourquoi lorsque l'utilisateur se trompe deux fois de suite, l'effet sonore est joué, mais le message ne s'affiche pas alors que les deux se trouve dans le même bloc else if !!

    Merci en tout cas...
    @+

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Tu dois revoir toute la conception et penser "objet".
    Exemple possible :
    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
    class Question
    {
      private String question;
      private String[] choix;
      private int reponse;
      ... constructeur ...
      ... accesseurs ...
      public booleen reponseValide( int num )
      {
        return reponse == num;
      }
      public int getNombreChoix()
      {
        return choix.size();
      }
    }
    L'objet question contient toutes les informations nécessaires.
    Ensuite, dans l'interface graphique :
    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
    class Gui
    {
      int indexQuestion;
      ArrayList<Question> questions;
      ArrayList<RadioButton> listRadio;
     
      public Gui()
      {
        JFrame frame = ...
        ... construction et ajout des RadioButton avec les listeners ...
      }
      public void questionSuivante()
      {
        ... gérer si on est à la derniere question ...
        ... sinon
          ++indexQuestion;
          afficherQuestionCourante();
      }
      public void questionPrecedente()
      {
        ... gérer si on est à la première question ...
        ... sinon
          --indexQuestion;
          afficherQuestionCourante();
      }
      public void afficherQuestionCourante()
      {
        ... rendre invisible tous les RadioButton ...
        ... remplir les différents JLabel et RadioButton avec la question courante récupérable par indexQuestion ...
        ... rendre visible le bon nombre de RadioButton en fonction du nombre de choix de la question courante ...
      }
     
      ... méthode du listener des RadioButton ...
      {
        ... recherche index du RadioButton cliqué dans la liste des RadioButton ...
        ... si questionCourante.reponseValide( index du RadioButton ) ...
        ... etc etc etc ...
      }
    }
    Premier avantage (négligeable) : le nombre de réponses possibles pour une question n'est pas figé. Il faut penser en "générique".
    Second avantage : cette approche est "objet". C'est l'objet Question qui connait la réponse. Il suffit de lui demander si la réponse est correcte.
    Le code est plus court, plus simple, plus facile à maintenir, débbuguer...

    Pour faire encore mieux, tu pourrais créer un autre objet, QCM, qui gère lui même les questions : la question courante, la suivante, précédente, connait le nombre maximum de réponse... Ca te permettrait de faire une différence entre l'interface graphique et la gestion des questions.
    N'hésite pas à découper avec de petits objets pour gérer les différentes parties. Il ne faut pas trop en faire non plus, ça nuirait à la compréhension.

    Bon courage !
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Par défaut
    Je suis d'accord avec dinobogan. Peut-être peux-tu créer des classes spécifiques pour chaque type de réponse et les appeler avec
    case 1 : new reponse1();

    Dans la parenthèse au besoin, tu "envoies" tes boutons, panel graphique ou ce que tu veux que tu rappelles dans le constructeur de la classe reponse :
    class reponse (JButton[] BoutonsReponse){
    this.BoutonsReponse = BoutonsReponse;}

    etc.

  6. #6
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 13
    Par défaut
    Merci dinobogan et HNoury pour ces remarques pertinentes . J'avais en effet le presentiment que je ne "pensais pas vraiment objet".D'ailleurs il y'a de quoi: je n'avais jamais fais de POO et je débute en Java.

    Vos propositions tombent à pic.
    Je vais essayer de revoir ma conception et si j'y arrive (et je dois!) je reviendrai marquer mon poste comme résolu.

    @+

  7. #7
    Membre Expert

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Par défaut
    Bonjour

    Citation Envoyé par HNoury Voir le message
    Pour ma part, plutôt que de gérer des if et else, j'attribuerai un entier (1, 2, 3) à chaque réponse (une valeur dans une classe dédiée, avec set et get; personnellement je fais toujours une classe spécifique pour ces valeurs temporaires) et ferais :
    swith(réponse){
    case 1: (//l'effet souhaité
    break;
    case 2 :idem
    case 3 :idem}

    Ce serait plus simple à gérer vraisemblablement.
    Ca serait déjà bien mieux, mais on pourrait faire des enum

  8. #8
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 13
    Par défaut
    Citation Envoyé par Alain Defrance Voir le message
    Bonjour



    Ca serait déjà bien mieux, mais on pourrait faire des enum
    Si tu veux bien detailler ces enum davantage......merci

  9. #9
    Membre Expert

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Par défaut
    Citation Envoyé par charad Voir le message
    Si tu veux bien detailler ces enum davantage......merci
    http://java.developpez.com/faq/java/...ns#NOTION_enum

  10. #10
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 13
    Par défaut De retour
    Bonjour,

    J'ai revu un peu mon code à la lumière de vos remarques, mais j'ai toujours besoin de votre aide.
    J'ai crée la methode reponseValide() de la classe Exercice qui permet de vérifier si la repone est bonne.
    J'ai crée un seul Listener pour les 3 boutons radio (j'en ai que 3 tjs) mais je suis bloqué à l'intérieur de l'instruction "else" de la classe BoutonRadioListener().
    Veuillez lire le commentaire que j'ai mis dans mon code (concerne uniquement la classe BoutonRadioListener()) pour comprendre ce j'aimerais bien faire.
    Au besoin jettez un coup d'oeil sur la capture d'écran ci jointe.

    Merci infiniment pour votre aide, j'en ai énormement besoin....

    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
    //classe interne qui ecoute les boutons radio
     
    public class BoutonRadioListener implements ActionListener{
     
    	int index=0;
     
    	//methode qui determine l'index d'un objet JRadioButton
    	public int getIndex(JRadioButton pJRB){
    		int index=0;
    		if (pJRB== reponse1)
    			index=1;
    		else if(pJRB==reponse2)
    			index=2;
    		else if (pJRB==reponse3)
    			index=3;
    		return index;
     
    	}
     
    	//methode qui fait l'inverse: elle rend un bouton à partir de son index
     
    	public JRadioButton getRadioBouton(int id){
    		JRadioButton radio= new JRadioButton();
    		if(id==1)
    			radio=reponse1;
    		else if(id==2)
    			radio=reponse2;
    		else if(id==3)
    			radio=reponse3;
    		return radio;
    		}
     
    	//methode qui desactive deux bouttons.
     
    	public void desactiverLesDeuxAutresBouton(int pIndice){
     
    		if (pIndice ==1){
    			reponse2.setEnabled(false);
    			reponse3.setEnabled(false);
    		}
    		else if(pIndice ==2){
    			reponse1.setEnabled(false);
    			reponse3.setEnabled(false);
    		}
    		else if(pIndice ==3){
    			reponse1.setEnabled(false);
    			reponse2.setEnabled(false);
    		}
    	}
    	public void actionPerformed(ActionEvent e) {
     
     
    		// TODO Raccord de méthode auto-généré
     
    		//si la reponse est bonne
            	if(exerc.reponseValide(getIndex((JRadioButton)e.getSource()))){
     
            		//on affiche un message accompagné d'un son
    				afficherMessageEtJouerEffet("Bonne réponse",new Color(0,255,0),"happy","happy");
     
    				//on desactive les deux autres boutons
    				desactiverLesDeuxAutresBouton(getIndex((JRadioButton)e.getSource()));			
            	}
            	//si la reponse est fausse
    			else{
     
    				//on affiche un nouveau message assorti d'un son
    				afficherMessageEtJouerEffet("Mauvaise réponse..! Il faut recommencer",new Color(255,0,0),"sad","sad");
     
    				//on desactive le bouton on question
    				getRadioBouton(getIndex((JRadioButton)e.getSource())).setEnabled(false);
     
    				//on attend le choix de l'utilisateur sur les deux autres boutons restants
    				/**
                                     * Quel code dois-je mettre ici pour écouter ce qui se passe sur les deux autres boutons
                                     * tout en restant sur le même écran.
                                     * Je veux que si l'utilisateur se trompe de nouveau on lui affiche 
                                     * un troisième message avec un autre effet sonore, sinon on lui affiche le message de bonne réponse déjà vu.
                                     * Est ce qu'il ne faut pas utiliser des thread pour résoudre ce problème?
                                     * 
                                     */
     
    				}
     
    	}
     
    }
    Images attachées Images attachées  

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 14
    Dernier message: 30/11/2007, 11h58

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