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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 : 55
    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
    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
    Membre averti
    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
    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 : 55
    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
    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
    Membre averti
    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
    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 expérimenté
    Homme Profil pro
    Consultant BigData
    Inscrit en
    Juillet 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant BigData

    Informations forums :
    Inscription : Juillet 2009
    Messages : 129
    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

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