Partage
  • Partager sur Facebook
  • Partager sur Twitter

Variable qui ne peut être résolu

Dans une structure if...else

Sujet résolu
    13 août 2017 à 11:05:11

    Bonjour,

    Je débute en java et je rencontre un problème ; je n'arrive pas à créer un objet qui soit de la classe 1 ou 2 suivant le choix de l'utilisateur.

    Voici le code :

    package MainClass;
    
    import p_personage.*;
    import java.util.Scanner;
    import p_inventaire.*;
    
    public class Jdr {
    
    	public static void main(String[] args) {
    
    		/********************************************************************************/
    		// création d'item
    		Item potionVie = new Item(10,0,0);
    		Item potionMana = new Item(0,10,0);
    		Item potionDegat = new Item(0,0,20);
    				
    		//création Boss 
    		Boss1 boss = new Boss1();
    		
    		// champs
    		Scanner sc = new Scanner(System.in);
    		
    		/********************************************************************************/	
    		// Demarrage de l'interface
    		System.out.println("---------------------------------------------");
    		System.out.println("----------Jdr------v0.1----------------------");
    		System.out.println("---------------------------------------------");
    		System.out.println("");
    		
    		System.out.println("Quel est votre nom ? : ");
    		String nom = sc.nextLine();
    		
    		System.out.println("votre classe guerrier(1) ou mage(2) ? : ");
    		int classe = sc.nextInt(); 
    
    			if (classe == 1){Guerrier joueur = new Guerrier(nom);} 
    			else if (classe == 2){Magicien joueur = new Magicien(nom);} 
    			else {System.out.println("erreur...");}
    			
    			
    		/********************************************************************************/	
    		// Test
    			joueur.tapper(boss);
    			
    	}
    
    }
    

    J'ai cru comprendre qu'une variable ne pouvais pas etre declarer dans un bloc d'instruction if...else et etre utilisé a l'exterieur de ce bloc, dans ce cas comment je fait pour la declarer avant sachant que je ne sais pas si ce sera de classe Guerrier ou Magicien ?

    Merci pour votre aide !

    -
    Edité par Modjii 13 août 2017 à 12:56:27

    • Partager sur Facebook
    • Partager sur Twitter
      13 août 2017 à 14:27:22

      Salut. Tu peux créer une interface et y placer la méthode "tapper", ensuite il suffira que tes deux classes l'implémentent et tu pourras utiliser le polymorphisme. Sinon il va falloir qu'il y ait forcement de la duplication, par exemple

      if (classe == 1){Guerrier joueur = new Guerrier(nom);joueur.tapper(boss)}
                  else if (classe == 2){Magicien joueur = new Magicien(nom);joueur.tapper(boss)} 



      • Partager sur Facebook
      • Partager sur Twitter
        13 août 2017 à 17:35:48

        Bonjour,

        Le mieux serait, je pense, d'utiliser le polymorphisme (oui, même si ça fait peur ;D) en effet, je suppose que tu ne vas pas te contenter de simplement taper ton boss, mais que plusieurs autres actions vont suivre, et alors là, si tu dois gérer des conditions, des boucles etc... et devoir tout dupliquer pour ton guerrier et ton magicien, ce serait une belle galère (et plusieurs erreurs de frappe pourrait survenir).

        Autre truc pour utiliser le polymorphimachin, c'est que si tu décides d'ajouter un nouveau rôle (le SuperDézingueurDeBidulesSurPattes par exemple) et bien tu devras à nouveau te farcir toute la duplication de ton code (et alors là... bonjour le bazar xD)

        Mais je te laisse faire ton propre choix, car si tu n'as pas grand chose de plus à ajouter dans ton code, devoir créer toute une interface pour utiliser le polymorphitruc pour seulement deux commandes de rien du tout, ça ne vaut peut-être pas la peine (surtout si tu ne connais pas...). Mais d'un autre côté, apprendre quelque chose... x)

        Bonne chance en tout cas ;)

        Amicalement,

        Johan

        PS: Exemple ->

        Role joueur = null;
        if(classe==1){
        joueur = new Guerrier(nom);
        }
        else if(classe==2){
        joueur = new Magicien(nom);
        }
        else{
        //erreur
        }
        joueur.taper(boss);



        -
        Edité par NoaFayn 13 août 2017 à 17:40:09

        • Partager sur Facebook
        • Partager sur Twitter
          13 août 2017 à 17:47:48

          Merci pour ta réponse Kulturman.

          Mes classes Guerrier et Magicien sont héritées de la classe Personnage, qui comporte la méthode tapper() que je ne redéfinis pas dans les classes enfants, ducoup je ne pense pas avoir besoin d'interface dans le cas la, mais peut être que je me trompe.

          Pour la duplication ça m’embête car j'aurais tout un tas d'instructions à effectuer sur ma variable joueur, je ne voudrais pas recopier l’intégralité des instruction à la fois dans le if et le else if.

          voici mon message d'erreur :

          Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
          	joueur cannot be resolved


          le problème est qu'il faudrait que je déclare joueur en dehors de mon if...else, mais je ne comprend pas comment faire étant donnée qu'il y à deux possibilités.

          • Partager sur Facebook
          • Partager sur Twitter
            13 août 2017 à 18:05:23

            J'imaginais bien qu'il y avait une classe de base mais je n'ai pas voulu faire de suppositions donc... Dans ce cas tu utilises directement le polymoprhisme!!!

            Personnage joueur;
            if (classe == 1){joueur = new Guerrier(nom);}
                        else if (classe == 2){joueur = new Magicien(nom);}
                        else {System.out.println("erreur...");}
            joueur.tapper(boss);

            Évidemment ça va lever une exception si l'utilisateur saisit autre chose que 1 ou 2(à toi de régler ça).
            Au fait c'est "taper"(un seul p) :lol:

            PS: ça aurait marché même si tu avais redéfini la méthode "tapper" dans les classes filles.

            -
            Edité par kulturman 13 août 2017 à 18:12:22

            • Partager sur Facebook
            • Partager sur Twitter
              13 août 2017 à 18:13:53

              merci johan,

              Effectivement j'aurais plusieurs instructions sur ma variable, je me suis lancé dans un mini projet de jeu de rôle pour apprendre le java directement "sur le tas". 

              Je n'avais pas encore bien saisie la notion du polymorphisme, pour moi c’étais "simplement" le fait de ré-écrire une méthode de la classe enfant...

              ah oui effectivement taper... merci pour la précision (je suis une bille en orthographe ><)

              Çà fonctionne ! merci à vous deux pour vos réponses !

              -
              Edité par Modjii 13 août 2017 à 18:22:45

              • Partager sur Facebook
              • Partager sur Twitter

              Variable qui ne peut être résolu

              × 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