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 :

[Problème]2 boucles et pas de reboot


Sujet :

Langage Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2014
    Messages : 17
    Points : 4
    Points
    4
    Par défaut [Problème]2 boucles et pas de reboot
    EDIT :
    [Problème 1]2 boucles et pas de reboot -> solution de joel.drigo (poste 2 et plus précisément poste 4)
    [Problème 2]Compréhension des getteur/setteur, et de "this" -> solution par Oussapik (poste 6 et plus précisément poste 8)
    [Problème 3]Erreur dans la déclaration de variable "super" -> solution par Oussapik (poste 10)
    [Problème 4]Utiliser l'héritage quand ce n'est pas nécessaire, quel problème ? est-ce une erreur ? -> solution par Oussapik (poste 12)
    [Problème 5]Question de mise en forme du programme (utilisation de l'héritage ou non) -> solution par Carhiboux (poste 14)
    [Problème 6]Incompréhension de certains termes "Affichage""Modèle de classe""Implémenter" ->

    Bonjour à tous !

    Je suis tout nouveau tout neuf dans le monde du JAVA, et je dois dire que ça fait 15 jours que j'ai commencé.
    Avec un ami on c'est lancé un petit défis de faire un jeu textuel type D&D, mais en version ultra basic pour neuneu (un peu comme notre niveau en fait !).

    On a déjà écrit des petits bouts de code, mais voilà ça fait 1 jour et demi qu'on traîne sur un problème, surement très stupide.

    WARNING : Je ne réponds pas coupable du saignement de vos yeux à cause de code dégeux/horrible/vulgaire/moche. Désolé beginner inside....

    En gros voilà notre soucis en résumé :
    une boucle "rencontre" s'ouvre.
    3 possibilités : info perso(1), infos monstre(2), attaquer(3).
    (1)et(2) ne posent pas de soucis, (3) par contre...
    une fois (3) sélectionner :

    Appel d'un "event" nommé "combat", nouvelle boucle donc.
    Le joueur attaque le monstre, le monstre attaque le joueur, premier tour terminé, point de vie affiché tout va bien.
    une fois de plus, 3 possibilités :
    (1) info perso; (2) infos monstre; (3)continuer attaque
    (1)et(2) toujours OK
    Si on sélectionne (3), la boucle ne reboot pas sur la première, mais laisse le "script" s’enchaîner, et comme le script prend fin ici pour le moment, on arrive après la sélection à la phrase "tchao"(fin du programme).

    Je voudrais donc savoir si vous pourriez m'indiquer des pistes à suivre pour résoudre ce problème ?

    Code Main : 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
    do{//boucle rencontre
    		System.out.println("Que voulez-vous faire ?");
    		System.out.println("1 - Obtenir des informations sur vous");
    		System.out.println("2 - Obtenir des informations sur le monstre");
    		System.out.println("3 - Attaquer");
    		mode=sc.nextLine().charAt(0);
    			if(mode!='1' && mode!='2' && mode!='3')
    				System.out.println("Je ne pense pas que ceci soit le meilleur choix à faire...");
    			if(mode=='1'){			
    				j2.dire();
    				System.out.println(j2.dire());
    				System.out.println("j'ai "+j2.lif+" de vie");
    			}
    			else if(mode=='2'){
    				System.out.println(m1.dire());
    				System.out.println("j'ai "+m1.lif+" de vie");
    			}
    			else if(mode=='3'){
    				E.combat(j2.forc, m1.forc, j2.def, m1.def, j2.lif, m1.lif);
    			}
    	}while( mode!='1' | mode!='2' | mode!='3');

    Code event : 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
    public void combat(int forJ, int forM, int defJ, int defM, int lifeJ, int lifeM){
    	System.out.println("Un monstre apparait");
    do{//boucle combat
       			if(forJ > defM){
       				System.out.println("touché !");
       				lifeM =lifeM-1;
       				System.out.println("En plein dans le mille, ça vie diminue, plus que : "+lifeM+" points de vie");
       			}
       			else{
       				System.out.println("vous ratez l'attaque");
     
     
       			}
       			if(forM>defJ){
       				System.out.println("aie");
       				lifeJ =lifeJ-1;
       				System.out.println("En plein dans le mille, votre vie diminue, plus que : "+lifeJ+" points de vie");
       			}
       			else{
       				System.out.println("la chance, vous esquivez");
       			}
     
    			System.out.println("La vie du monstre est de "+lifeM);
    			System.out.println("Votre vie est de "+lifeJ);
    			do{
    				System.out.println("Un échange de fait, que faire maintenant :");
    				System.out.println("1 - Savoir la vie du monstre");
    				System.out.println("2 - Savoir votre vie");
    				System.out.println("3 - Attaquez encore !");
     
    				Scanner sc=new Scanner(System.in);
    				System.out.println("Parlez !");
    				rep=sc.nextLine().charAt(0);
    		if(rep!='1' && rep!='2' && rep!='3')
    			System.out.println("Pas las bonne touche");
    		if(rep=='1'){
    			System.out.println("La vie du monstre est de "+lifeM);
    		}
    		else if(rep=='2'){
    			System.out.println("Votre vie est de "+lifeJ);
    		}
    		else if(rep=='3'){
    			System.out.println("Le combat continu !");
    		}
    			}while(rep!='1' && rep!='2' && rep!='3');	
     
       		}while(lifeJ <= 0 || lifeM <= 0);
    	      		System.out.println("bravo");

    Merci par avance à vous tous !

    Mini (petit amateur de JAVA)

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    1) la condition de fin de la seconde boucle me semble étrange point de vue logique (pas étonnant donc qu'elle ne donne pas le résultat escompté, même si ça me semble étrange qu'on ne revienne pas dans la boucle appelante) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    }while(lifeJ <= 0 || lifeM <= 0);
    On boucle tant que la vie de l'un des deux protagonistes est inférieure à 0. A mon avis, je dirais que la vie des 2 protagonistes est censée être supérieure à 0, au début du combat, en toute logique. Donc, si l'un des 2 protagonistes perd toute sa vie dès la première attaque, on boucle. Bizarre, non ? Sinon le combat s'arrête, on affiche "bravo", et on repasse dans la première boucle... même si on a choisit l'option "continuer le combat". On devrait plutôt tester la vie des 2 protagonistes avant de commencer la boucle de menu : si le perso à 0 de vie, le jeu doit s'arrêter (personnage mort), et si c'est le monstre, le combat s'arrête. Dans les 2 cas, on ne doit pas lancer de boucle : autrement dit, on boucle tant que la vie des 2 est supérieure à 0, tant que lifeJ>0 && lifeM>0.

    2) il y a un problème dans la gestion de la vie : comme ces valeurs sont passées directement en paramètres de la méthode combat, elles sont modifiées dans la méthode combat, mais lorsqu'on revient à la méthode qui a appelée la méthode combat, la vie des 2 protagonistes n'a pas changée : le perso et le monstre ont en quelque sorte récupéré la vie qu'ils avaient avant le combat.

    Si tu as fait un code comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int a=0;
    methode(a);
    System.out.println(a);
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void methode(int a) {
       a=1;
    }
    , ça affichera 0 !

    Pour résoudre cette problématique, passes les références de perso et monstre, et décrémentes leur vie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void combat(Perso perso, Monstre monstre) {
     
        ...
        monstre.decrementeVie(pointsAttaque); // ou monstre.vie-=pointsAttaque si ça te semble plus simple pour commencer
        ...
     
    }
    3) dans la condition d'arrêt de la boucle 1, tu utilises l'opérateur de combinaison binaire (bitwyse) "ou" (|) et non pas l'opérateur de combinaison de condition (||).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while( mode!='1' | mode!='2' | mode!='3');
    Cet opérateur réalise une combinaison logique bit à bit de chaque bit des opérandes : bon, ça donne le même résultat, mais ça ne veut pas dire tout à fait la même chose, à éviter donc.
    Cependant, on boucle tant que mode n'est pas 1, ou pas 2, ou pas 3 (la condition est vraie si l'une de condition au moins est vraie). Si mode est égal à 1, il n'est pas égal à 2, ni égal 3, donc on boucle. Si mode est 2, il n'est pas 1, ni 3, donc on boucle. Si mode est 3, pareil. Si mode est 4 (donc erreur), les trois conditions sont vraies, donc la combinaison est vraie donc on boucle : dans ce cas, je suppose que c'est bien ce que tu veux faire. En tout cas, on boucle toujours. Pas moyen de sortir de la rencontre avec le monstre.

    Je pense qu'il devrait y avoir 2 boucles ici : une première pour tester le choix de menu tant que ce n'est pas un choix valide. Une seconde englobante, tant qu'on choisit un choix valide. En outre, j'ajouterais une option, "passer mon chemin" ou "fuir", pour sortir de la boucle.

    4)ça me semble étrange d'avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println("Un monstre apparait");
    dans combat(). On attaque un monstre, donc on sait qu'il y en a un, donc il est déjà apparu avant.

    L'algo général est plutôt, par exemple :

    Code pseudocode : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    faire {
     
        choix = lire choix parmi ( se ballader, finir )
        if ( choix est se ballader ) {
     
           si tirage aléatoire = monstre apparaît appeler rencontre()
           sinon afficher "vous continuez votre chemin en toute tranquillité"
     
        }
     
     
    } tant que choix!=finir et joueur pas mort

    Code pseudocode : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    rencontre() {
         afficher "un monstre apparaît"
         faire {
               choix = lire choix parmi ( info perso, info monstre, attaquer, fuir )
               si choix est info perso afficher info perso
               sinon si choix est info monstre afficher info monstre
               sinon si choix est attaquer appeler combat(monstre)
         } tant que monstre et joueur pas mort et choix n´est pas fuir
         si monstre est mort afficher "bravo !"
         sinon si perso est mort "le monstre vous dévore"
    }

    tant que monstre et joueur pas mort et choix n'est pas fuir : ça se traduit par while ( monstre.vie>0 && perso.vie>0 && choix!=FUIR )
    Code pseudocode : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    combat(monstre) {
          déterminer  resultat attaque
          si resultat attaque est monstre touché {
                afficher "monstre touché"
                décrémenter vie monstre
          }  
          sinon si resultat attaque est perso touché {
                afficher "monstre riposte"
                décrémenter vie perso
          }  
          sinon {
                afficher "monstre pare l'attaque"
          }  
    }

    Code pseudocode : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    lire choix(liste de choix) {
        afficher liste de choix
        lire choix au clavier
        faire tant que choix au clavier n´est pas parmi liste de choix possible {
            afficher "erreur choix impossible"
            lire choix au clavier
        } 
        retourner choix
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2014
    Messages : 17
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup, avec tes explications j'ai presque tout changé et tout va presque bien !

    Alors pour expliquer ce que j'ai changé :
    j'ai migré la boucle combat et la boucle rencontre dans event.

    Comme ça dans main on a juste à appeler "rencontre()" une fois ce qui permet d'appeler "combat()".

    J'ai effectué les modifications que tu as proposé et tout va bien mieux depuis ça, merci !

    Cependant je bloque toujours un peu sur un petit soucis :
    Une fois la boucle "combat()" fini, c'est à dire joueur.life=0 ou monstre.life=0, je reboot sur la boucle "rencontre()", alors que j'aimerais retomber sur la boucle"quitter".

    Je pense que j'ai un soucis pour gérer les points de vie, soit que quand life.monstre =0, cette valeur soit reprise dans la boucle "que faire"(cf: code plus bas).

    En ce qui concerne les points de vie j'ai essayé de faire un plan de base du style :
    classe CaracBase qui contient les var int force, int def, int life, int level
    classe Joueur extends CaracBase : qui contient en static les valeurs de base du joueur au niveau 1 (ex : force =10, def = 8, life = 15, level =1)
    classe Monstre extends CaracBase : idem que Joueur (force = 7, def = 9, life = 10, level = 1)

    Je ne sais pas si j'ai bien expliqué le soucis que je rencontre actuellement. Si besoin est je peux joindre le code des classes sus-citées.

    Code Main : 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
     
    do{//boucle principal
    do{//boucle que faire
    	System.out.println("Que voulez-vous faire maintenant ?");
    	System.out.println("1 - Attendre");
    	System.out.println("2 - Combattre un monstre");
    	mode=sc.nextLine().charAt(0);
    		if(mode!='1' && mode!='2')
    			System.out.println("Pas compris");
    	if(mode=='1'){
    		System.out.println("rien ne se passe");
    	}
    	else if(mode=='2'){
    		E.rencontre(j2.forc, m1.forc, j2.def, m1.def, j2.lif, m1.lif, pseudo);
    	}
    }while( j2.lif>0 && m1.lif>0);	
     
    	do{//boucle quitter
    		System.out.println("Voulez-vous rejouer ? (O/N)");
    		reponse = sc.nextLine().charAt(0);
    		if(reponse!='O' && reponse!='N')
    			System.out.println("Pas compris ...");
    	}while(reponse!='O' && reponse!='N');
     
    }while(reponse=='O');//sortie boucle principale du jeu
    System.out.println("Merci et à bientôt");

    Code Event : 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
    public void rencontre(int forJ, int forM, int defJ, int defM, int lifeJ, int lifeM, String pseudo){
    	do{//boucle rencontre
    		System.out.println("Défendez-vous "+pseudo+" un Monstre se jette sur vous !");
    		System.out.println("Que voulez-vous faire ?");
    		System.out.println("1 - Obtenir des informations sur vous");
    		System.out.println("2 - Obtenir des informations sur le monstre");
    		System.out.println("3 - Attaquer");
    		System.out.println("4 - fuir");
    		rep=sc.nextLine().charAt(0);
    			if(rep!='1' && rep!='2' && rep!='3' && rep!='4')
    				System.out.println("Je ne pense pas que ceci soit le meilleur choix à faire...");
    			if(rep=='1'){			
    				System.out.println("j'ai "+lifeJ+" de vie");
    			}
    			else if(rep=='2'){
    				System.out.println("j'ai "+lifeM+" de vie");
    			}
    			else if(rep=='3'){
    				combat(forJ, forM, defJ, defM, lifeJ, lifeM);
    			}
    			else if(rep=='4'){
    				endGame();
    			}
    	}while( lifeM>0 && lifeJ>0 && rep!=4);
    }
     
     
    public void combat(int forJ, int forM, int defJ, int defM, int lifeJ, int lifeM){
    do{//boucle combat
       			if(forJ > defM){
       				System.out.println("touché !");
       				lifeM =lifeM-1;
       				System.out.println("En plein dans le mille, ça vie diminue, plus que : "+lifeM+" points de vie");
       			}
       			else{
       				System.out.println("vous ratez l'attaque");
     
     
       			}
       			if(forM>defJ){
       				System.out.println("aie");
       				lifeJ =lifeJ-1;
       				System.out.println("En plein dans le mille, votre vie diminue, plus que : "+lifeJ+" points de vie");
       			}
       			else{
       				System.out.println("la chance, vous esquivez");
       			}
     
    			System.out.println("La vie du monstre est de "+lifeM);
    			System.out.println("Votre vie est de "+lifeJ);
    			do{
    				System.out.println("Un échange de fait, que faire maintenant :");
    				System.out.println("1 - Savoir la vie du monstre");
    				System.out.println("2 - Savoir votre vie");
    				System.out.println("3 - Attaquez encore !");
    				rep=sc.nextLine().charAt(0);
    		if(rep!='1' && rep!='2' && rep!='3')
    			System.out.println("Pas las bonne touche");
    		if(rep=='1'){
    			System.out.println("La vie du monstre est de "+lifeM);
    		}
    		else if(rep=='2'){
    			System.out.println("Votre vie est de "+lifeJ);
    		}
    		else if(rep=='3'){
    			System.out.println("Le combat continu !");
    		}
    			}while(rep!='1' && rep!='2' && rep!='3');	
     
       		}while(lifeM>0 && lifeJ>0);
    	      		System.out.println("bravo");
     
     
    }

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    C'est normal qu'en fin de boucle dans une méthode on remonte à la boucle appelante, et non pas tous les niveaux d'un coup : c'est pour cette raison que dans mon pseudo code, les conditions de boucle contiennent toutes le test sur la mort du perso.

    Si tu as :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    do {
     
        ... 
     
        uneMethodeTruc( perso );
     
     
    } while ( perso.vie>0 );
     
    System.out.println("fin");
    et

    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
    public void uneMethodeTruc( Perso perso ) {
     
    boolean conditionDeFinDeBoucleTruc=false;
    do {
     
        ... 
     
        ...
     
        uneMethodeMachin( perso );
     
        conditionDeFinDeBoucleTruc = ...
     
     
    } while ( perso.vie>0 && !conditionDeFinDeBoucleTruc);
     
    }
    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
    public void uneMethodeMachin( Perso perso ) {
     
    boolean conditionDeFinDeBoucleMachin=false;
    do {
     
        ... 
     
        ...
     
        conditionDeFinDeBoucleMachin = ...
     
     
    } while ( perso.vie>0 && !conditionDeFinDeBoucleMachin);
     
    }
    On est dans la boucle de la méthode uneMethodeMachin : dès la vie du perso passe à 0, la boucle s'arrête, on remonte dans l'appel de uneMethodeMachin, soit la boucle dans uneMethodeTruc. Les condtions sont réunies pour la boucle de uneMethodeTruc s'arrête, donc on remonte dans la boucle principale. Les conditions sont réunies pour qu'elle s'arrête, et donc on affiche "fin".

    Si tu as du code à ne pas exécuter entre celui qui modifie la vie du perso et la fin du bloc de la boucle, ajoutes un if. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    do {
     
        ... du code qui modifie perso.vie ...
     
     
     
        ... du code à ne pas faire si perso.vie<= 0
     
    }while ( perso.vie>0 && !conditionDeFinDeBoucle )
    devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    do {
     
        ... du code qui modifie perso.vie ...
     
     
        if ( perso.vie>0 ) {
        ... du code à ne pas faire si perso.vie<= 0
        }
     
    }while ( perso.vie>0 && !conditionDeFinDeBoucle )

    Par aiileurs, je t'ai dit que rien ne fonctionnerait si tu passais tes valeurs de vie de la manière que tu le fais. Tu ne peux pas modifier la valeur d'un int déclaré dans un autre scope, même si celui-ci est passé en paramètre de ta méthode.

    Pour pouvoir modifier la vie du perso, comme du monstre, dans une méthode, il faut passer l'instance de classe Perso ou Monstre, et modifier les variables de ces instances. Le mieux étant de le faire via des méthodes, plutôt que par accès direct aux variables de classe.

    Exemple :

    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
    public class Creature {
       public int life;
       public Perso(int life) {  
           this.life=life;
       }
       public int getLife() {
            return life;
       }
       public void hit(int hitpoint) {
           if ( hitpoint>0 ) {
              if (life<hitpoint) {
                 life=0;
              }
              else {
                 life-=hitpoint;
              }
           }
       }
       public boolean isAlive() {
            return life>0;
       }
    }
    pas bon :
    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
     
     
    ... methode(...) {
     
       ...
       Creature perso = ...
       Creature monstre = ...
     
       ...
     
       do {
     
          ... 
     
          combat(perso.life, monster.life);
     
          ...
     
       } while( perso.isAlive() && monster.isAlive() );
     
    }
     
    public void combat(int persoLife, int monsterLife) {
     
           ... persoLife -= 50 ... // là, on modifie la variable persoLife, mais pas perso.life (à l'appel, la valeur de perso.life a été copiée dans persoLife, si tu veux, mais au retour, la copie inverse n'est jamais faite)
     
    }
    bon :
    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
     
     
    ... methode(...) {
    .  ...
       Creature perso = ...
       Creature monstre = ...
     
       ...
     
       do {
     
          ... 
     
          combat(perso, monster);
     
          ...
     
       } while( perso.isAlive() && monster.isAlive() );
     
    }
     
    public void combat(Creature perso, Creature monster) {
     
           ... perso.life -= 50 ...
     
    }
    Mieux :
    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
    public class Creature {
       private int life;
       public Perso(int life) {  
           this.life=life;
       }
       public int getLife() {
            return life;
       }
       public void hit(int hitpoint) {
           if ( hitpoint>0 ) {
              if (life<hitpoint) {
                 life=0;
              }
              else {
                 life-=hitpoint;
              }
           }
       }
       public boolean isAlive() {
            return life>0;
       }
    }
    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
     
     
    ... methode(...) {
    .  ...
       Creature perso = ...
       Creature monstre = ...
     
       ...
     
       do {
     
          ... 
     
          combat(perso, monster);
     
          ...
     
       } while( perso.isAlive() && monster.isAlive() );
     
    }
     
    public void combat(Creature perso, Creature monster) {
     
           ... perso.hit(50) ... // ou perso.hit( monster.getHitForce() ) par exemple
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2014
    Messages : 17
    Points : 4
    Points
    4
    Par défaut
    Merci pour les explications !

    En ce qui concerne les sorties de boucles je pensais avoir bien fait, mais non une ligne de sortie d'une boucle m'avait échappé et posait donc problème....
    Dur dur avec si peu de ligne, je me demande comment faire avec 1500 lignes... Mais je n'en suis pas encore la !

    Je m'excuse d'avance, mais j'ai du mal avec les accesseurs (set) et les mutateurs (get), je ne saisi pas encore comment les utiliser ni comment m'en servir dans d'autres classes. j'ai pourtant essayé de lire différents tuto, et ça semble pas compliquer pourtant ...

    Un accesseur est une méthode qui va nous permettre d'accéder aux variables de nos objets en lecture.
    Un mutateur nous permettra d'en faire de même en écriture
    Donc je dois déclarer "set" et get" (enfin pas comme ça bien sur ça va de soi !) dans une classe quand je désire user des "variables private" de celle-ci dans une autre classe.
    Jusque la, Mini il a compris !

    Mais après comment dois-je faire ?

    Imaginons que j'ai ça :

    Code Creature : 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
    public class Creature {
       public int life;
       public Perso(int life) {  
           this.life=life;
       }
       public int getLife() {
            return life;
       }
       public void hit(int hitpoint) {
           if ( hitpoint>0 ) {
              if (life<hitpoint) {
                 life=0;
              }
              else {
                 life-=hitpoint;
              }
           }
       }
       public boolean isAlive() {
            return life>0;
       }
    }

    Et que je veuille invoquer la variable "life" de Creature dans mon main. Dois-je faire comme suivant ?

    Code Main : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class Main {
     
    public static void main(String[] args) {
    Creature orc = new Creature();
    System.out.println(orc.life);
    }

    Merci beaucoup à toi de prendre du temps pour m'aider, c'est vraiment très appréciable de trouver conseil quand on bloque pendant des heures/jours....


    Sinon au cas ou, je me permets de copier coller tout le code que j'ai fait pour le moment, mais une fois de plus attention les yeux je ne réponds de rien si vous voyez des trucs capabled e vous tuer !

    Code Main : 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
    package jeu;
     
    import java.util.Scanner;
     
    public class Main {
     
    public static void main(String[] args) {
        String quelleRace;	
     
     
     
        //Try sur classe extends de fille(Perso), Joueur
        Joueur j2=new Joueur();
        quelleRace=j2.dire();
        System.out.println(quelleRace);
        System.out.println("force ="+j2.forc+"defence ="+j2.def+"life ="+j2.lif);
     
        //Try sur classe extends de fille(Perso), Monstre 
        Monstre m1=new Monstre();
        quelleRace=m1.dire();
        System.out.println(quelleRace);
        System.out.println("force ="+m1.force+"defence ="+m1.defence+"life ="+m1.lif);
     
     
     
        //Try boucle
     
        Event E=new Event();   
    char reponse= ' ', mode =' ';
    String pseudo=" ";  
    Scanner sc=new Scanner(System.in);
     
     
    do{//boucle principal du jeu
    	System.out.println("Bienvenue dans le jeu monstre/porte/trésor");
     
     
    	do{//boucle choix du pseudo
    		System.out.println("Veuillez entrer le nom de votre personnage :");
    		pseudo=sc.nextLine();
    		System.out.println("Vous avez choisit de vous appeler : "+pseudo);
    		do{//boucle sortie du choix pseudo
    		System.out.println("Voulez-vous garder ce nom ? (O/N)");
    		reponse = sc.nextLine().charAt(0);
    		if(reponse!='O' && reponse!='N')
    			System.out.println("Pas compris ...");
    		}while(reponse!='O' && reponse!='N');
    	}while(reponse!='O');
     
    System.out.println("Vous voilà partis en direction de l'aventure "+pseudo);	
     
    	do{//boucle choix porte 
    		System.out.println("Vous arrivez devant une porte "+pseudo+", plusieurs choix s'offrent à vous !");
    		System.out.println("1 - Essayer d'ouvrir la porte");
    		System.out.println("2 - Frapper à la porte c'est on jamais");
    		System.out.println("3 - Enfoncer la porte");
    		System.out.println("4 - Rentrer chez vous");
    		mode = sc.nextLine().charAt(0);
    				if(mode!='1' && mode!='2' && mode!='3' && mode!='4')
    					System.out.println("Ok on attends devant la porte, et après ?");
    				if(mode =='1'){
    					System.out.println("quelle chance incroyable, celle-ci s'ouvre avec un grincement effroyable !");
    				}
    				else if (mode =='2'){
    					System.out.println("Pourquoi pas.... Mais rien ne se passe.");
    				}
    				else if (mode=='3'){
    					System.out.println("Vous prenez de l'élan et foncez comme un orc enragé sur cette porte. Elle se fracasse en éclat !");
    				}
    				else if (mode =='4'){
    					System.out.println("Voilà comment certaines aventures finissent avant même d'avoir commencée, encore une histoire de lâche...");
    					E.endGame();
    				}
    	}while(mode!='1' && mode!='2' && mode!='3' && mode!='4');
     
     
    do{//choix combat ou attendre 
    	System.out.println("Que voulez-vous faire maintenant ?");
    	System.out.println("1 - Attendre");
    	System.out.println("2 - Combattre un monstre");
    	mode=sc.nextLine().charAt(0);
    		if(mode!='1' && mode!='2')
    			System.out.println("Pas compris");
    	if(mode=='1'){
    		System.out.println("rien ne se passe");
    	}
    	else if(mode=='2'){
    		E.rencontre(j2.forc, m1.force, j2.def, m1.defence, j2.lif, m1.lif, pseudo);
    	}
    }while( j2.lif>0 && m1.lif>0);	
     
    	do{//boucle quitter
    		System.out.println("Voulez-vous rejouer ? (O/N)");
    		reponse = sc.nextLine().charAt(0);
    		if(reponse!='O' && reponse!='N')
    			System.out.println("Pas compris ...");
    	}while(reponse!='O' && reponse!='N');
     
    }while(reponse=='O');//sortie boucle principale du jeu
    System.out.println("Merci et à bientôt");
    }
     
     
     
      }

    Code Event : 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
    package jeu;
     
    import java.util.Scanner;
     
    public class Event {
     
    	char rep=' ';
    	Scanner sc=new Scanner(System.in);
     
    public void endGame(){
    	System.out.println("Adieu !");
    	System.exit(0);
    }
     
    public void rencontre(int forJ, int forM, int defJ, int defM, int lifeJ, int lifeM, String pseudo){
    	do{//boucle rencontre
    		System.out.println("Défendez-vous "+pseudo+" un Monstre se jette sur vous !");
    		System.out.println("Que voulez-vous faire ?");
    		System.out.println("1 - Obtenir des informations sur vous");
    		System.out.println("2 - Obtenir des informations sur le monstre");
    		System.out.println("3 - Attaquer");
    		System.out.println("4 - fuir");
    		rep=sc.nextLine().charAt(0);
    			if(rep!='1' && rep!='2' && rep!='3' && rep!='4')
    				System.out.println("Je ne pense pas que ceci soit le meilleur choix à faire...");
    			if(rep=='1'){			
    				System.out.println("j'ai "+lifeJ+" de vie");
    			}
    			else if(rep=='2'){
    				System.out.println("j'ai "+lifeM+" de vie");
    			}
    			else if(rep=='3'){
    				combat(forJ, forM, defJ, defM, lifeJ, lifeM);
    			}
    			else if(rep=='4'){
    				endGame();
    			}
    	}while( lifeM>0 && lifeJ>0 && rep!=4);
    }
     
     
    public void combat(int forJ, int forM, int defJ, int defM, int lifeJ, int lifeM){
    do{//boucle combat
       			if(forJ > defM){
       				System.out.println("touché !");
       				lifeM =lifeM-1;
       				System.out.println("En plein dans le mille, ça vie diminue, plus que : "+lifeM+" points de vie");
       			}
       			else{
       				System.out.println("vous ratez l'attaque");
     
     
       			}
       			if(forM>defJ){
       				System.out.println("aie");
       				lifeJ =lifeJ-1;
       				System.out.println("En plein dans le mille, votre vie diminue, plus que : "+lifeJ+" points de vie");
       			}
       			else{
       				System.out.println("la chance, vous esquivez");
       			}
     
    			System.out.println("La vie du monstre est de "+lifeM);
    			System.out.println("Votre vie est de "+lifeJ);
    			do{
    				System.out.println("Un échange de fait, que faire maintenant :");
    				System.out.println("1 - Savoir la vie du monstre");
    				System.out.println("2 - Savoir votre vie");
    				System.out.println("3 - Attaquez encore !");
    				rep=sc.nextLine().charAt(0);
    		if(rep!='1' && rep!='2' && rep!='3')
    			System.out.println("Pas las bonne touche");
    		if(rep=='1'){
    			System.out.println("La vie du monstre est de "+lifeM);
    		}
    		else if(rep=='2'){
    			System.out.println("Votre vie est de "+lifeJ);
    		}
    		else if(rep=='3'){
    			System.out.println("Le combat continu !");
    		}
    			}while(lifeM>0 && lifeJ>0 && rep!='3');	
     
       		}while(lifeM>0 && lifeJ>0);
    	      		System.out.println("bravo");
     
     
     
     
    }
    }

    Code CaracBase : 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
    package jeu;
     
    public class CaracBase{
          //Variable d'instance = définiront les caractéristiques de l'objet
            int force;
            int defence;
            int level;
            int life;
           private String nom;
     
     
     
     
            //Constructeur avec parametre
           public void AttribStat (int forc, int def, int lvl ,int lif , String e ){//attibution des caratéristiques !
     
                   force=forc;
                   defence = def ;
                   level = lvl; 
                   life = lif ;
                   nom = e ;
     
    }
     
           public void LVLUP (int a, int b , int c , int d ){//amélioration des stats 
     
                   force = force + a ;
                   defence = defence + b ;
                   level = level + c ;
                   life = life + d ;
          }
     
     
     
     
     
     
     
     
     
     
            public void bonjour() {
              System.out.println("Bonjour, je ne suis qu'un simple personnage sans caractéristique pour le moment !");
            }
     
     
     
            public String dire(){
              String direRace = "Je ne sais pas quelle race je suis... ";
              return direRace; 
            }
          }

    Code Joueur : 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
    package jeu;
     
    public class Joueur extends CaracBase{
     
     
     
    public Joueur() {
     
    }
     
    static int forc = 10;
    static int def = 8;
    static int lif = 15;
    static int lvl = 1;
     
     
     
     
    public String dire() {//Surcharge
        String direRace = "Je suis de race : Humaine";
        return direRace; 
     
    }
     
     
     
    }

    Code Monstre : 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
    package jeu;
     
    public class Monstre extends CaracBase{
     
    public Monstre(){
     
    }
     
    int forc = 7;
    int def = 9;
    int lif = 10;
    int lvl = 1;
    private int life;
     
     
     
    public void hit(int hitpoint) {
        if ( hitpoint>0 ) {
           if (life<hitpoint) {
              life=0;
           }
           else {
              life-=hitpoint;
           }
        }
    }
    public boolean isAlive() {
         return life>0;
    }
     
     
    public String dire() {//surcharge
        String direRace = "Je suis de race : Orc";
        return direRace; 
    }
    }

  6. #6
    Membre actif
    Homme Profil pro
    Consultant BigData
    Inscrit en
    Juillet 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant BigData

    Informations forums :
    Inscription : Juillet 2009
    Messages : 129
    Points : 280
    Points
    280
    Par défaut
    Et que je veuille invoquer la variable "life" de Creature dans mon main. Dois-je faire comme suivant ?
    Non, ce n'est pas exactement comme ça
    Dans ta classe Creature, tu as déclaré une méthode "getLife()" de visibilité publique (donc visible depuis en dehors de la classe Creature) dans le but, justement, d'accéder (d'où le get en début et le nom getter) à la variable life. Tu dois donc écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public static void main(String[] args) {
      Creature orc = new Creature();
      System.out.println(orc.getLife());
    }
    Petite précision sur ton message :
    Je m'excuse d'avance, mais j'ai du mal avec les accesseurs (set) et les mutateurs (get)
    C'est le contraire. accesseur = get (pour accéder) et mutateur = set

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2014
    Messages : 17
    Points : 4
    Points
    4
    Par défaut
    olala ça commence bien si je me trompe quand j'écris....

    Merci de ta réponse, avec votre aide à tous j'y arrive petit à petit !

    Donc pour continuer sur le petit soucis d'accesseur (get) et de mutateur (set), voila ce que j'ai maintenant :

    Code Main : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static void main(String[] args) {
      Creature orc = new Creature();
      System.out.println(orc.getLife());
    }

    Code Creature : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class Creature {
       private int life;
       public Perso(int life) {  
           this.life=life;
       }
       public int getLife() {
            return life;
       }
     
    }

    Imaginons que je désire ajouter 5 à la valeur life depuis la classe Main.
    Je dois dans un premier temps ajouter un mutateur (set) dans la classe Creature, de la façon suivante ?

    Code Setteur : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void setLife(){
    	this.life=life;
    }

    Désolé si ma proposition est loufoque, mais je tire des choses d'un site et je teste des petits copie/colle à ma sauce....

    Si je continue dans ma logique, pour appeler et modifier dans la classe Main, je dois ajouter ceci à Main ?

    Code newMain : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public static void main(String[] args) {
      Creature orc = new Creature();
      System.out.println(orc.getLife());
      System.out.println(orc.setlife()+5);
    }

    D'un autre côté, j'ai recopié certaines choses que m'avait donné joel.drigo (merci beaucoup pour ton aide jusque là !), sans vraiment réfléchir et ça c'est pas bon ! Alors j'ai jeté un oeil dessus et j'ai vu quelque chose, qui après recherche parait simple de compréhension mais qui me laisse un gout de "je comprends pas tout".

    Voici le truc qui me pose problème :
    Code Monstre : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public Monstre(int life) {  
        this.life=life;
    }

    Selon mes recherches :
    This est une référence sur l'instance de la classe
    Cela veut-il dire que au final déclarer une variable private m’empêche de la modifier au sein même de la classe où elle est déclarée ?
    Ou alors cela sous entends que comme elle est protégée, je ""crée"" une variable this.life qui comme elle est égal à life, permet de modifier celle-ci ?

    Au final dans ma tête avec la définition, le dernier bout de code ressemble à ça :
    référence de la variable "life" = variable life
    Autant dire que mon cerveau ne suit plus la logique qui devrait exister ici.

    Je pense que passer mes journées sur des leçons et sur l'écran me fatigue et que le soir n'est pas bon pour moi !

    En tout cas je tiens encore à remercier les personnes qui donnent de leur temps pour m'aider à avance, merci mille fois !

  8. #8
    Membre actif
    Homme Profil pro
    Consultant BigData
    Inscrit en
    Juillet 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant BigData

    Informations forums :
    Inscription : Juillet 2009
    Messages : 129
    Points : 280
    Points
    280
    Par défaut
    Re-Bonsoir,

    Je vais tenter d'apporter quelques réponses

    1 - Tout d'abord, ton code de la classe "Creature" n'est pas bon et ne doit pas compiler
    Lorsque tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public Perso(int life) {  
      this.life=life;
    }
    Tu ne donnes pas de type de retour. Tu déclares donc un constructeur à ta classe. Le constructeur doit porter le nom de la classe, donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public Creature(int life) {  
      this.life=life;
    }
    De plus, tu as déclaré ton constructeur avec un paramètre, tu dois donc l'appeler avec un paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Creature orc = new Creature(); // Ne compilera pas car pas de paramètre
    Creature elf = new Creature(100); // Créé une créature avec une vie initialisée à 100
    2 -
    Cela veut-il dire que au final déclarer une variable private m’empêche de la modifier au sein même de la classe où elle est déclarée ?
    Non, déclarer une variable "private" signifie que tu ne pourras pas l'appeler directement en dehors de la classe (depuis ta class Main par exemple).
    Tu peux très bien récupérer ou modifier cette variable en interne de ta classe, c'est d'ailleurs ce qu'il faudra faire.

    3 - Le code du setter que tu as écris n'est pas ce que l'on entend par setter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public void setLife(int newLife){
    	this.life=newLife;
    }
    Ici, tu vas passer en paramètre la nouvelle valeur à affecter en paramètre de ton setter. D'un premier abbord, quand on voit ça, cela peut paraître déroutant car, quitte à donner un getter et un setter écris comme ça, autant mettre la variable publique me diras-tu Mais le but de cela est en fait de pouvoir faire des contrôles, notamment lors du setter. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public void setLife(int newLife){
      if(newLife >=0) {
    	this.life=newLife;
      } else {
            this.life = 0;
      }
    }
    Cela permettrait de t'assurer que personne ne donne jamais de valeur négative à la vie du joueur et que fournir une valeur négative représente la mort (valeur 0) de la créature Libre à toi d'ajouter des règles supplémentaires sur tes champs
    Du coup, pour appeler ton setter, ce que tu dois te rappeler, c'est :
    • son nom
    • sa visibilité (savoir si oui ou non, tu peux l'appeler - car oui, tu pourrais réduire la visibilité, mais tu verras surement cela plus tard dans des cours Java, ce n'est pas le plus important pour commencer)
    • son paramètre (dans le cas de setLife, il s'agit d'un entier.

    Et tu peux l'appeler ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public static void main(String[] args) {
      Creature orc = new Creature(100);
      System.out.println(orc.getLife()); //Affiche la vie de la créature juste après être passé dans ton constructeur
      int life = orc.getLife();
      int newLife = life + 5;
      orc.setLife(newLife);
      System.out.println(orc.getLife()); //Affiche la vie de la créature après modification
    }
    J'ai volontairement détaillé le code en plusieurs lignes, mais cela peut être contracté de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public static void main(String[] args) {
      Creature orc = new Creature(100);
      System.out.println(orc.getLife()); //Affiche la vie de la créature juste après être passé dans ton constructeur
      orc.setLife(orc.getLife() + 5);
      System.out.println(orc.getLife()); //Affiche la vie de la créature après modification
    }
    4 - Un setter te permet sur le principe (au niveau sémantique) de remplacer le contenu d'une variable par une nouvelle valeur.
    Mais rien ne t'empèche de créer d'autres méthodes dans ta classe qui modifieront le stock de vie, par exemple, dans ta classe Créature :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public void looseLife(int amount) {
      if(amount > 0) { // Vérification qu'il s'agit bien d'une perte
        setLife(getLife() - amount);
      }
    }
    public void gainLife(int amount) {
      if(amount > 0) { // Vérification qu'il s'agit bien d'un gain
       setLife(getLife() + amount);
      }
    }
    Deux remarques sur cette méthode :
    - Je n'accède pas directement à la valeur pour la modifier mais je passe pas le mutateur pour profiter du contrôle sur la valeur que j'ai déjà codé
    - Le code du main devient maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public static void main(String[] args) {
      Creature orc = new Creature(100);
      System.out.println(orc.getLife()); //Affiche la vie de la créature juste après être passé dans ton constructeur
      orc.gainLife(5); //Plus lisible que la première version :)
      System.out.println(orc.getLife()); //Affiche la vie de la créature après modification
    }

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2014
    Messages : 17
    Points : 4
    Points
    4
    Par défaut
    Bonjour;

    Merci à toi une fois de plus de prendre du temps ainsi pour moi ! Ca rentre dans ma tête oui oui ça rentre doucement !

    Alors j'ai refait ton exemple afin de bien le comprendre, et il fonctionne (normal tu me diras !). Après j'ai essayé d'adapter l'exemple avec une classe CaracBAse et une extends de celle-ci nommée Player, jusque là parfait !
    J'ai donc voulu ajouter une nouvelle variable telle que "force", rien de bien sorcier il me semble mais la petit soucis.

    Voici le code :

    Code CaracBase : 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
    public class CaracBase {
    private int life;
    private int force;
     
    public CaracBase(int life,int force) {  
        this.life=life;
        this.force=force;
    }
    public int getLife() {
        return life;
    }
     
    public void setLife(int newLife){
       if(newLife >=0) {
     	this.life=newLife;
       } else {
             this.life = 0;
       }
    }	   
     
    public int getForce() {
    	return force;
    }
    public void setForce(int newForce) {
    	this.force = newForce;
    }	 
     
    public void looseLife(int amount) {
    if(amount > 0) { // Vérification qu'il s'agit bien d'une perte
     setLife(getLife() - amount);
    	   }
    	 }
    public void gainLife(int amount) {
    	   if(amount > 0) { // Vérification qu'il s'agit bien d'un gain
    	    setLife(getLife() + amount);
    	   }
    	 }
    }

    Code Player : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Player extends CaracBase{
     
    	public Player(int life, int force) {
    		super(life);
    		super(force);
    		}
    }

    Mais voilà qu'on me dit erreur sur "super force" :
    Constructor call must be the first statement in a constructor
    et aussi :
    The constructor CaracBase(int) is undefined
    La je me dis zut, pourquoi ? J'ai beau réfléchir et je comprends pas. Car même si il y a un ordre pour déclarer les variables je le respecte.
    Donc le problème ne doit pas venir de ce côté là. Peut-être dois-je déclarer que une par une les variables pour public Joueur ?

  10. #10
    Membre actif
    Homme Profil pro
    Consultant BigData
    Inscrit en
    Juillet 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant BigData

    Informations forums :
    Inscription : Juillet 2009
    Messages : 129
    Points : 280
    Points
    280
    Par défaut
    Il y a plusieurs points à comprendre pour savoir pourquoi ton code ne marche pas.

    1. Le principe d'héritage.
    L'héritage, en plus d'apporter tout un tas d'avantages (et d'inconvénients aussi) technique, c'est avant tout une notion sémantique (de sens pour faire simple). Tu pourras dire que A étend B si et seulement si tu peux dire la phrase "A est un B" et que ça a du sens .
    En l’occurrence, "Joueur est une caractéristique de base", ça n'a pas de sens, donc ce n'est probablement pas l'héritage que tu dois utiliser ici. Par contre, dire que "Joueur possède une caractéristique de base", là, ça a du sens. Il s'agit donc de composition, et pas d'héritage.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class Joueur{
       private CaracBase caracBase;
     
      public Joueur(int life, int force, int defence) {
        this.caracBase = new CaracBase(life, force, defence); // Tu devras du coup définir un constructeur prenant ces 3 arguments dans la classe CaracBase :)
      }
    }
    2. Si par contre, c'est juste le nom que j'avais pas compris, et que CaracBase représente une entité lambda qui possède des caractéristiques de bases (il faudrait du coup choisir un meilleur nom pour cette classe, mais là j'en ai pas sous la main ), alors en effet tu peux utiliser l'héritage. Je vais continuer mon exemple avec A extends B pour génériser mon explication.
    Si j'ai quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public class A extends B {
      //some code
    }
    alors un objet de type A possède les mêmes attributs et fonctions (public et protected seulement, pas les private) que B. Mon constructeur de A aura donc 2 objectifs :
    • Initialiser les éléments propres à A (ceux qui n'ont rien à voir avec B)
    • Initialiser les éléments de B

    Du point de vue du découpage des responsabilités, on peut facilement comprendre que c'est du ressort de B d'initialiser les éléments propres à B ! C'est là qu'entre le mot-clé "super". Si j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public A() { //Constructeur sans argument pour A
      super(); //appel du constructeur sans argument de la classe mère (B) pour initialiser le contenu qui lui est propre.
      //initialisation du contenu propre à A.
    }
    Donc, quand tu écrivais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    super(...);
    super(...);
    super(...);
    Tu essayais d'initialiser 3 fois de suite la classe mère. Cela n'a pas de sens, et c'est pour ça que le mot-clé super ne peut être utilisé qu'une seule fois par constructeur. De plus, il doit être placé au début du constructeur . Donc les 2 "super" supplémentaires te généraient des erreurs.

    Si tu veux initialiser N variables de ta classe parente, alors tu créés un constructeur prenant les bons arguments et initialisant ces variables dans la classe parente, et tu appel super avec le bon nombre d'arguments dans ton constructeur de la classe enfant.

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2014
    Messages : 17
    Points : 4
    Points
    4
    Par défaut
    Merci une fois de plus ! Problème résolu encore une fois ^^

    Pour faire simple je ne savais pas que quand j'utilisais "super" je ne devais le faire qu'une seule et unique fois et tout déclarer dedans !

    Mon new code est maintenant le suivant :

    Code Main : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class Main {
    	public static void main(String[] args) {
    		  Creature orc = new Creature(100,12);
    		  System.out.println(orc.getLife()); //Affiche la vie de la créature juste après être passé dans ton constructeur
    		  orc.gainLife(5); //Plus lisible que la première version :)
    		  System.out.println("Ma vie est de :" + orc.getLife()); //Affiche la vie de la créature après modification
    		  System.out.println("Ma force est de :" + orc.getForce());
    		  Player j1 = new Player(200,54);
    		  System.out.println(j1.getLife()); //Affiche la vie de la créature juste après être passé dans ton constructeur
    		  j1.gainLife(5); //Plus lisible que la première version :)
    		  System.out.println("Ma vie est de :" +j1.getLife()); //Affiche la vie de la créature après modification
    		  System.out.println("Ma force est de :" + j1.getForce());
    		}
    }

    Code CaracBase : 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
    public class CaracBase {
    private int life;
    private int force;
     
    public CaracBase(int life,int force) {  
        this.life=life;
        this.force=force;
    }
    public int getLife() {
        return life;
    }
     
    public void setLife(int newLife){
       if(newLife >=0) {
     	this.life=newLife;
       } else {
             this.life = 0;
       }
    }	   
     
    public int getForce() {
    	return force;
    }
    public void setForce(int newForce) {
    	this.force = newForce;
    }
    }

    Code Player : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class Player extends CaracBase{
     
    	public Player(int life, int force) {
    		super(life,force);
    	}
    }

    Code Monstre : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class Creature extends CaracBase{
     
    	public Creature(int life, int force) {
    		super(life,force);
    	}
    }

    J'ai donc une nouvelle question par rapport à ce que tu m'as dit en ce qui concerne :
    Il s'agit donc de composition, et pas d'héritage.
    Dans mon jeu pour neuneu, je ne pense pas que "CaracBase" soit un jour invoqué pour être un personne à part entière, donc mon utilisation de l'héritage ne semble pas avoir ça place ici. Pour autant ma façon de faire est-elle fausse ? Cela est-il problématique d'utiliser l'héritage alors qu'il n'est pas vraiment nécessaire ?


    EDIT : une autre question est apparue pendant mes essais.
    Autant j'ai le droit de faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     m1.setLife(m1.getLife()+5);
    System.out.println(m1.getLife());
    Par contre je ne peux pas contracter de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(m1.setLife(m1.getLife() +5);
    Existe t'il un moyen de faire ce que je désire ou alors cela doit-il toujours ce faire en 2 lignes ?

  12. #12
    Membre actif
    Homme Profil pro
    Consultant BigData
    Inscrit en
    Juillet 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant BigData

    Informations forums :
    Inscription : Juillet 2009
    Messages : 129
    Points : 280
    Points
    280
    Par défaut
    Cela est-il problématique d'utiliser l'héritage alors qu'il n'est pas vraiment nécessaire ?
    Oui, il y a un inconvénient à faire cela. Java ne supportant pas l'héritage multiple, tu ne peux étendre qu'une seule classe.
    Donc, si tu souhaite par la suite faire hériter Joueur d'une autre classe, tu ne pourras plus puisque tu as déjà fait hériter de CaracBase

    Par contre je ne peux pas contracter de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(m1.setLife(m1.getLife() +5);
    1. Il manque une parenthèse fermante à la fin de la ligne juste avant le ;

    2. Pour comprendre le problème, il faut pour cela que tu regardes le stéréotype (la ligne où tu déclares) de la méthode setLife.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public void setLife(int newLife){
      //some code
    }
    Le type de retour de la méthode est "void", cela signifie que ta méthode ne renvoie rien. Puisqu'elle ne renvoie rien, il n'y a rien à afficher sur la sortie standard, cqfd
    Il existerait bien un moyen de faire ce que tu veux faire en une ligne en modifiant le type de retour du setter, mais il faut souvent privilégier la lisibilité du code pour qu'il soit maintenable. Je pense qu'il vaut donc mieux l'écrire sur 2 lignes

  13. #13
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2014
    Messages : 17
    Points : 4
    Points
    4
    Par défaut
    D'accord, laissons le code assez clair pour que tout le monde comprenne !

    Si je récapitule bien il est impossible en java de faire :
    Caracbase -> joueur extends Caracbase -> joueur rouge extends joueur
    Car ca reviendrait à dire en fait :
    Caracbase -> jooueur extends Caracbase -> joueur rouge extends joueur extends Caracbase
    Double extends donc impossible, it's right ?

    Imaginons maintenant que je souhaite invoquer un nouveau joueur de type "rouge". Et que je désire ajouter à ce joueur rouge une caractéristique "boule de feu".

    Dois-je insérer une nouvelle variable de type "public void bouleDeFeu()" dans joueur ? Ou alors vaut-il mieux tout changer afin de ne plus utiliser l'héritage, mais seulement de la composition?

    J'aurais eu tendance à penser qu'il vaudrait mieux oublier l'héritage, et faire une page de caractéristique pure avec la variable "public void bouleDeFeu()" dedans, puis créer des personnages avec/sans certaines caracs. Mais je ne suis pas sur que cela soit la meilleur idée, d'où ma question.

    Je suis assez content car grâce à vous je commence à me poser de moins en moins de question de type codage pur, mais de plus en plus de question sur le raisonnement d'un bon code (ensemble de classe) ! Encore merci, avoir de bons profs c'est tellement plus facile que de nager dans un tuto sans aide !

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2012
    Messages
    3 020
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3 020
    Points : 16 092
    Points
    16 092
    Par défaut
    Salut,

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public Class JoueurRouge extends Joueur {
     
    ... 
     
    }

    suffit à faire hériter JoueurRouge de CaracBase puisque Joueur hérite déjà de cette classe.

    Une classe ne peut hériter que d'une classe en Java, mais rien n'empeche la classe parente d'hériter elle même d'une autre classe.


    Dois-je insérer une nouvelle variable de type "public void bouleDeFeu()" dans joueur ?
    C'est une méthode, et non pas une variable.

    Pour répondre à la question, oui, tu peux, si tu souhaites que tous les joueurs, les rouges, mais aussi les jaunes, bleu, vert, ou arcenciel qui héritent de la classe Joueur aient cette compétence.

    Maintenant, est-ce vraiment utile d'avoir une classe JoueurRouge? Est-ce que la couleur ne devrait pas simplement être un attribut de ta classe Joueur? Charge à toi de définir la couleur du joueur à l'instanciation de l'objet.

    Ensuite, attention à ne pas confondre l'affichage avec ton modèle de classes. Ce n'est pas parce que tu affiches des données sur une même page qu'elles viennent forcément de la même classe... Elles peuvent, mais rien n'y oblige.

    N'oublies pas aussi qu'une classe peut implémenter plusieurs interfaces.

  15. #15
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2014
    Messages : 17
    Points : 4
    Points
    4
    Par défaut
    Merci de me corriger ! C'est important aussi car si on ne sait pas s'exprimer, on ne peut pas demander d'aide.
    Le pire est que je sais déjà ça, mais j'ai pas du faire attention, ça m'apprendra !

    Ensuite, attention à ne pas confondre l'affichage avec ton modèle de classes. Ce n'est pas parce que tu affiches des données sur une même page qu'elles viennent forcément de la même classe... Elles peuvent, mais rien n'y oblige.

    N'oublies pas aussi qu'une classe peut implémenter plusieurs interfaces.
    Je vais essayer de me renseigner sur certains termes car j'ai du mal à te comprendre, tu ne t'exprimes pas mal ! C'est juste moi qui manque de level en JAVA je pense.

    Différence affichage et modèle de classe ?
    une classe peut implémenter plusieurs interface ?

    Selon internet "implémenter" :
    un objet qui implémente une interface peut être caster dans une référence de l'interface de manière implicite.
    Bon ok je comprends un petit peu, mais j'ai du mal à en voir l'utilité (malgré un exemple sur la page que j'ai consulté).

  16. #16
    Membre actif
    Homme Profil pro
    Consultant BigData
    Inscrit en
    Juillet 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant BigData

    Informations forums :
    Inscription : Juillet 2009
    Messages : 129
    Points : 280
    Points
    280
    Par défaut
    Différence affichage et modèle de classe ?
    Carhiboux indiquait qu'il faut faire attention à bien distinguer (au moins) deux couches de ton application:
    - La vue : interaction entre ton application et l'utilisateur
    - Le modèle : les données qui sont dans ton application et les opérations que l'on peut faire dessus.

    Donc, quand tu dis :
    J'aurais eu tendance à penser qu'il vaudrait mieux oublier l'héritage, et faire une page de caractéristique pure avec la méthode"public void bouleDeFeu()" dedans, puis créer des personnages avec/sans certaines caracs.
    L'héritage, la composition, l'implémentation sont des concepts de ton modèle de données. Est-ce qu'un joueur doit posséder une action "bouleDeFeu", ou pas ? Est-ce que cela doit être porté par une autre classe, etc. Il s'agit là de la conception du modèle.
    Ensuite, quand tu définis une page de caractéristiques, il s'agit d'une représentation possible de ton modèle, de l'affichage donc.

    Donc, lorsque tu défini "créer des personnages", il faut savoir de ton côté si tu parles de l'interface avec l'utilisateur (menu, choix saisis par l'utilisateur) ou bien de la création de l'instance de ta classe du modèle.


    Pour ce qui est des interfaces/abstraction, il s'agit d'un concept de programmation orientée objet plus que de Java.
    J'avais trouvé il y a quelques temps une explication sympa sur ce poste. Je la garde de côté depuis tellement je trouve l'exemple parlant.

  17. #17
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2014
    Messages : 17
    Points : 4
    Points
    4
    Par défaut
    Merci, voila qui me parle beaucoup !

    Pour répondre à ta question, qui n'en est pas une en fait, quand je parle de "créer un personnage" je parle de la création de l'instance de la classe du modèle(pour reprendre tes dires). En effet dans mon jeu pour neuneu, le seul point libre que je laisse au joueur c'est le choix du pseudo point fin. Tout le reste (life, defense, force, level) est définis de base.

    Merci pour le lien il va falloir que je le décortique (ça va prendre un peu de temps ).

    Je me permets de switcher sur un autre soucis du programme, sur lequel on a déjà essayé de m'aider,on a résolu pas mal de problème, mais il m'en reste un que je ne m'explique pas ....

    Le code entier :
    Code Main : 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
    public class Main {
     
    public static void main(String[] args) {
        Event E=new Event();   
    char reponse= ' ', mode =' ';
    String pseudo=" ";  
    Scanner sc=new Scanner(System.in);
    Joueur j2=new Joueur(15,8,7);
    Monstre m1=new Monstre(12,6,5);
     
     
    do{//boucle principal du jeu
    	System.out.println("Bienvenue dans le jeu monstre/porte/trésor");
     
     
    	do{//boucle choix du pseudo
    		System.out.println("Veuillez entrer le nom de votre personnage :");
    		pseudo=sc.nextLine();
    		System.out.println("Vous avez choisit de vous appeler : "+pseudo);
    		do{//boucle sortie du choix pseudo
    		System.out.println("Voulez-vous garder ce nom ? (O/N)");
    		reponse = sc.nextLine().charAt(0);
    		if(reponse!='O' && reponse!='N')
    			System.out.println("Pas compris ...");
    		}while(reponse!='O' && reponse!='N');
    	}while(reponse!='O');
     
    System.out.println("Vous voilà partis en direction de l'aventure "+pseudo);	
     
    	do{//boucle choix porte 
    		System.out.println("Vous arrivez devant une porte "+pseudo+", plusieurs choix s'offrent à vous !");
    		System.out.println("1 - Essayer d'ouvrir la porte");
    		System.out.println("2 - Frapper à la porte c'est on jamais");
    		System.out.println("3 - Enfoncer la porte");
    		System.out.println("4 - Rentrer chez vous");
    		mode = sc.nextLine().charAt(0);
    				if(mode!='1' && mode!='2' && mode!='3' && mode!='4')
    					System.out.println("Ok on attends devant la porte, et après ?");
    				if(mode =='1'){
    					System.out.println("quelle chance incroyable, celle-ci s'ouvre avec un grincement effroyable !");
    				}
    				else if (mode =='2'){
    					System.out.println("Pourquoi pas.... Mais rien ne se passe.");
    				}
    				else if (mode=='3'){
    					System.out.println("Vous prenez de l'élan et foncez comme un orc enragé sur cette porte. Elle se fracasse en éclat !");
    				}
    				else if (mode =='4'){
    					System.out.println("Voilà comment certaines aventures finissent avant même d'avoir commencée, encore une histoire de lâche...");
    					E.endGame();
    				}
    	}while(mode!='1' && mode!='2' && mode!='3' && mode!='4');
     
     
    do{//choix combat ou attendre 
    	System.out.println("Que voulez-vous faire maintenant ?");
    	System.out.println("1 - Attendre");
    	System.out.println("2 - Combattre un monstre");
    	mode=sc.nextLine().charAt(0);
    		if(mode!='1' && mode!='2')
    			System.out.println("Pas compris");
    	if(mode=='1'){
    		System.out.println("rien ne se passe");
    	}
    	else if(mode=='2'){
    		E.rencontre(j2.getForce(), m1.getForce(), j2.getDefence(), m1.getDefence(), j2.getLife(), m1.getLife(), pseudo);
    	}
    }while( j2.getLife()>0 && m1.getLife()>0);	
     
    	do{//boucle quitter
    		System.out.println("Voulez-vous rejouer ? (O/N)");
    		reponse = sc.nextLine().charAt(0);
    		if(reponse!='O' && reponse!='N')
    			System.out.println("Pas compris ...");
    	}while(reponse!='O' && reponse!='N');
     
    }while(reponse=='O');//sortie boucle principale du jeu
    System.out.println("Merci et à bientôt");
    }
    }

    Code Event : 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
    import java.util.Scanner;
     
    public class Event {
     
    	char rep=' ';
    	Scanner sc=new Scanner(System.in);
     
    public void endGame(){
    	System.out.println("Adieu !");
    	System.exit(0);
    }
     
    public void rencontre(int forJ, int forM, int defJ, int defM, int lifeJ, int lifeM, String pseudo){
    	do{//boucle rencontre
    		System.out.println("Défendez-vous "+pseudo+" un Monstre se jette sur vous !");
    		System.out.println("Que voulez-vous faire ?");
    		System.out.println("1 - Obtenir des informations sur vous");
    		System.out.println("2 - Obtenir des informations sur le monstre");
    		System.out.println("3 - Attaquer");
    		System.out.println("4 - fuir");
    		rep=sc.nextLine().charAt(0);
    			if(rep!='1' && rep!='2' && rep!='3' && rep!='4')
    				System.out.println("Je ne pense pas que ceci soit le meilleur choix à faire...");
    			if(rep=='1'){			
    				System.out.println("j'ai "+lifeJ+" de vie");
    			}
    			else if(rep=='2'){
    				System.out.println("j'ai "+lifeM+" de vie");
    			}
    			else if(rep=='3'){
    				combat(forJ, forM, defJ, defM, lifeJ, lifeM);
    			}
    			else if(rep=='4'){
    				endGame();
    			}
    	}while( lifeM!=0 && lifeJ!=0 && rep!=4);
    }
     
     
    public void combat(int forJ, int forM, int defJ, int defM, int lifeJ, int lifeM){
    do{//boucle combat
       			if(forJ > defM){
       				System.out.println("touché !");
       				lifeM =lifeM-1;
       				System.out.println("En plein dans le mille, ça vie diminue, plus que : "+lifeM+" points de vie");
       			}
       			else{
       				System.out.println("vous ratez l'attaque");
     
     
       			}
       			if(forM>defJ){
       				System.out.println("aie");
       				lifeJ =lifeJ-1;
       				System.out.println("En plein dans le mille, votre vie diminue, plus que : "+lifeJ+" points de vie");
       			}
       			else{
       				System.out.println("la chance, vous esquivez");
       			}
     
    			System.out.println("La vie du monstre est de "+lifeM);
    			System.out.println("Votre vie est de "+lifeJ);
    			do{
    				System.out.println("Un échange de fait, que faire maintenant :");
    				System.out.println("1 - Savoir la vie du monstre");
    				System.out.println("2 - Savoir votre vie");
    				System.out.println("3 - Attaquez encore !");
    				rep=sc.nextLine().charAt(0);
    		if(rep!='1' && rep!='2' && rep!='3')
    			System.out.println("Pas las bonne touche");
    		if(rep=='1'){
    			System.out.println("La vie du monstre est de "+lifeM);
    		}
    		else if(rep=='2'){
    			System.out.println("Votre vie est de "+lifeJ);
    		}
    		else if(rep=='3'){
    			System.out.println("Le combat continu !");
    		}
    			}while(lifeM>0 && lifeJ>0 && rep!='3');	
     
       		}while(lifeM>0 && lifeJ>0);
    	      		System.out.println("bravo");
    }
    }

    Code CaracBase : 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
    public class CaracBase{
    	private int life;
    	private int force;
    	private int defence;
     
     
    	public int getForce() {
    		return force;
    	}
    	public void setForce(int newForce) {
    		this.force = newForce;
    	}
    	public int getDefence() {
    		return defence;
    	}
    	public void setDefence(int newDefence) {
    		this.defence = newDefence;
    	}
    	public CaracBase(int life, int force, int defence) {  
    	    this.life=life;
    	    this.force=force;
    	    this.defence=defence;
    	}
    	public int getLife() {
    	    return life;
    	}
     
    	public void setLife(int newLife){
    	   if(newLife >=0) {
    	 	this.life=newLife;
    	   } else {
    	         this.life = 0;
    	   }
    	}	   
     
    	public void looseLife(int amount) {
    	if(amount > 0) { // Vérification qu'il s'agit bien d'une perte
    	 setLife(getLife() - amount);
    		   }
    		 }
    	public void gainLife(int amount) {
    		   if(amount > 0) { // Vérification qu'il s'agit bien d'un gain
    		    setLife(getLife() + amount);
    		   }
    		 }	
    }

    Code Joueur : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Joueur extends CaracBase{
     
     
    public Joueur(int life, int force, int defence) {
    super (life, force, defence);
     
    }

    Code Monstre : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class Monstre extends CaracBase{
     
    	public Monstre(int life, int force, int defence) {
    		super (life, force, defence);
     
    		}
    (Attention j'ai pas encore relié tous les choix pour la boucle "choix porte" mais c'est pas important pour le moment)
    Le soucis est le suivant :
    Le joueur rentre un pseudo.
    Il le valide.
    Il choisit quoi faire devant la porte (si 1,2,3 -> histoire s’enchaîne; si 4 -> fin du jeu)
    Dans la pièce il choisit quoi faire (1 -> rien boucle se relance; si 2 ->invocation de la fonction rencontre)
    il a choisit 2, on rentre dans la boucle "rencontre"(1 -> info perso; 2 -> info monstre; 3 -> invocation fonction combat; 4-> fin du jeu)
    Il a choisit 4, on rentre dans la boucle combat(1 -> savoir vie monstre; 2 -> savoir vie joueur; 3-> attaquer)
    le joueur attaque encore et encore jusqu'à ce le problème arrive !
    Quand monstre.vie=0 la boucle continu, mais quand monstre.vie=-1 boucle se ferme (premier problème).
    Quand la boucle combat se ferme j'aurais aimé retomber dans la boucle pièce, mais je retombe sur la boucle rencontre, pourtant je pense avoir bien coder le while de fin de la boucle rencontre.




    Petite question technique en aparté, quand je demande au joueur "garder ce pseudo ?(O/N)"
    je code ceci :
    while(reponse!='O' && reponse!='N')
    J'ai vu certains tutos annoncer ceci :
    while(reponse!='O' && reponse !='o' && reponse!='N' && reponse!='n' );
    Existe-t-il un autre façon moins "longue" de pour faire la même chose ?

  18. #18
    Expert éminent sénior
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2012
    Messages
    3 020
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3 020
    Points : 16 092
    Points
    16 092
    Par défaut
    re salut,

    Ton code compile? Oo

    Où sont déclarés les variables j2 et m1?

    La seule façons moins longue pour tester les retours clavier, ca serait une expression régulière. Mais en fait, c'est même pas dit que ce soit moins long.

    Ca serait quelque chose du genre :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while(!Pattern.matches("[oOnN]", reponse))

  19. #19
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2014
    Messages : 17
    Points : 4
    Points
    4
    Par défaut
    Hum vous n'avez rien vu, rien entendu... Petit problème de copier coller, il manque un bout je corrige aussitôt dans le post concerné !

    Effectivement je ne sais pas si ça serait plus court.
    Petite question con il pas possible de faire genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    }while(reponse!='O','N','o','n'
    Faire une contraction un peu dans ce style plutôt que de taper "reponse!=" à chaque fois.

  20. #20
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par minimorphee Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    }while(reponse!='O','N','o','n'
    Faire une contraction un peu dans ce style plutôt que de taper "reponse!=" à chaque fois.
    Non, pas de possibilité syntaxique de faire ça, mais tu peux écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    } while( "ONon".indexOf(reponse)==-1 )
    parce que cette méthode (indexOf) donne la position du caractère dans la chaîne et -1 si il ne s'y trouve pas.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Problème de boucle qui ne se répète pas!
    Par Invité dans le forum Langage
    Réponses: 4
    Dernier message: 05/07/2015, 16h47
  2. Problème de boucle qui ne s'exécute pas
    Par bikine dans le forum Général Java
    Réponses: 1
    Dernier message: 01/04/2015, 08h28
  3. Problème de boucle (je ne comprend pas)
    Par Glorfindel555 dans le forum VB.NET
    Réponses: 5
    Dernier message: 16/01/2012, 21h14
  4. Encore problème avec ma boucle (2 pas )
    Par Medoou dans le forum MATLAB
    Réponses: 6
    Dernier message: 12/07/2009, 23h21
  5. MC ne s'affiche pas, problème de boucle?
    Par jfrsm dans le forum Flash
    Réponses: 1
    Dernier message: 12/02/2007, 09h50

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