Partage
  • Partager sur Facebook
  • Partager sur Twitter

Aide java classe Expérience

Compréhension programmation java

    21 octobre 2021 à 15:09:28

    Bonjour cela fait un mois que je suit beaucoup de tuto et j'apprend pas mal de choses j'ai réussi a faire des choses que j'aurais pas cru possible.

    Jusqu'à aujourd'hui j'ai fait des programmes grâce a des tuto mais je me lance (a moitie) en ajoutant des fonction a mon programme (qui est un jeux rpg en 2d très simplifier). Donc la je suis en train de créer une classe Expérience qui va me permettre de construire des niv de mon personnage et pour faire cela je me suis basé sur ma petite experience (de ma vie de programmeur) pour concevoir cette classe. Je ne sais pas encore si elle fonctionne je ne peux pas encore la tester et je dois encore apprendre deux ou trois choses avant de pouvoir l'inclure vraiment dans mon code.

    Bref....

    Je vous met mon code. Et j'aimerais savoir si c'est possible de me dire, si il y a des truc inutile dans mon code et si vous penser qu'il peut fonctionner.

    Merci d'avance a vous

    package fr.lawgame.main.combat;
    
    import fr.lawgame.main.entite.Perso;
    
    public class Experience {
    	/**L'expérience est gagner lors qu'on tue un ennemie
    	*elle va s'additionner dans un recopiant du joueurs qui pourra gagner des niv
    	*il va u avoir plusieurs niv a gagner                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
    	*/
    	public Perso p1;
    	private int xp;
    	public String levelup;
    	
    	public Experience() {
    		xp  = 0;
    	}
    	
    	public Experience(int x) {
    		xp = x;
    	}
    	
    	
    	public int getXp() {
    		return xp;
    	}
    	
    	public String getLevelup() {
    		return levelup;
    	}
    
    	public void setXp(int xp) {
    		this.xp = xp;
    	}
    
    	public void setLevelup(String levelup) {
    		this.levelup = levelup;
    	}
    
    
    	public void levelup() {
    		if(xp >= 10) {
    			p1.setVie(p1.getVie() + 5);
    			p1.setForce(p1.getForce() + 2);
    			p1.setNiveau(p1.getNiveau() + 1);
    		}
    		else {
    			return;
    				
    			}
    		}	
    	
    	public String toCaract() {
    //		return "Vie " + vie + " Force " + force + " xp " + xp;
    		return "xp " + xp;
    		
    	}
    	
    }


    PS : Si vous pensez qu'il faille l'améliorer je suis ouvert a tout.

    -
    Edité par law379 21 octobre 2021 à 15:12:06

    • Partager sur Facebook
    • Partager sur Twitter
      21 octobre 2021 à 15:31:37

      Salut,

      Pour commencer, d'un point de vue OO, c'est bizarre d'avoir le personnage dans Experience, ce serait plutôt l'inverse.

      2e point, l'xp, plutot que d'avoir des get set, un une valeur de depqrt dans le constructeur et un add seraient plus judicieux.

      3e point, qui rejoint le 1er, le level up est une responsabilité du personnage, pas de l'Experience 

      le else return ne sert a rien.

      4e point le to caract est une responsabilité de l'affichage, pas d'Experience.

      • Partager sur Facebook
      • Partager sur Twitter
        21 octobre 2021 à 15:43:27

        P.X.L a écrit:

        Salut,

        Pour commencer, d'un point de vue OO, c'est bizarre d'avoir le personnage dans Experience, ce serait plutôt l'inverse.

        2e point, l'xp, plutot que d'avoir des get set, un une valeur de depqrt dans le constructeur et un add seraient plus judicieux.

        3e point, qui rejoint le 1er, le level up est une responsabilité du personnage, pas de l'Experience 

        le else return ne sert a rien.

        4e point le to caract est une responsabilité de l'affichage, pas d'Experience.

        Merci a toi pour ton aide

        1er point et 3eme point
        J'ai mis le perso dans l'experience pour me permettre de créer ce qui se passe si j'ai assez d'exp pour lvlup je l'ai justement mis ici par ce que pour moi le lvlup relève de l'experience. Mais d'un point de vue purement logique vie réelle non pas d'un programmeur si tu pense que c'est vraiment important de mette ce code dans perso je le ferais  merci

        2eme point
        Je suis je peux le dire encore un noob dans la programmation et j'ai pas compris ce que tu m'explique or mi que le code que j'ai fait n'est pas conforme.

        4eme point
        Ce qu'il y a après // ca n'a rien a faire la si c'est ce dont tu parle un oublie de ma part mais merci je vais essayer de l'ajouter dans la classe perso et voir si ca fonctionne pour le reste faut que je regarde de plus près ^^ 

        -
        Edité par law379 21 octobre 2021 à 15:57:48

        • Partager sur Facebook
        • Partager sur Twitter
          21 octobre 2021 à 17:11:51

          Pour les 1 et 3, ce n'est pas tant le fait de devoir se rapprocher de la vie réelle, surtout qu'on parle d'un jeu, mais bien d'avoir un modèle conceptuel qui soit maintenable et évolutif, et pour ce faire, il faut bien faire attention aux responsabilité de chaque classe.

          Un bête exemple, tu veux que ton compagnon pnj monte aussi en niveau, avec ton système tu fais comment? Une mauvaise conception te ferme de facto de nombreuses portes et rendent les futures évolutions difficiles.

          Pour le point 2, le fait que je passe de QWERTY vers AZERTY et vice versa n'aide pas, désolé, une classe ne doit pas permettre aux autres de la modifier directement son contenu, c'est la porte ouverte aux effets de bord, par exemple permettre d'ajouter de l'xp négative ou une valeur absurde.

          • Partager sur Facebook
          • Partager sur Twitter
            21 octobre 2021 à 18:50:43

            Merci Je comprend mieux en effet j'essaie de rester dans une logique qui me permet de pouvoir évoluer c'est pour ca que je préfère quand c'est possible de faire des classe plus-tôt que des variable mais après en effet je suis encore novice et tes remarque vont bien m'aider en effet.
            Toujours pour le point 2 les get set sont la justement pour éviter ce que tu me dis, non ? Ou j'ai mal compris peut etre leur utilité. 
            A partir du moment ou j'ai mis "private int xp;" ma classe, ou du moins cet attribut est protéger. Et je créer justement les "get set" pour permettre d'utiliser la value xp sans pouvoir modifier la valeur de base du moins c'est ce que j'ai compris. si tu as deux min pour me dire sans forcement me donner de code mais me dire la ou tu le voie mieux. Je te donne une architecture de mon programme.

            - classe Main : Ou tout ce passe les paramètre de la grille ce qui se passe aux chois des touche pour bouger mon perso le positionnement du perso et des ennemies
            - classe Perso : Ou l'on trouve tout les param du perso sauf pour l'instant son xp avec le service attaquer
            - classe Ennemie : //
            - Classe Grille ou l'on trouve les param de la grille (plateau) et les param de chaque déplacement cardinal
            - Classe Combat : ou l'on trouve les param du combat ainsi que comment gagner de l'xp a la fin d'un combat
            - Classe Experience : Ou l'on trouve les param de l'experience et tout ce que tu voie dans mon code plus haut

            Voila merci d'avance
            • Partager sur Facebook
            • Partager sur Twitter
              21 octobre 2021 à 20:39:01

              le private permet de respecter l'encapsulation et ainsi de garder le contrôle de ta variable au sein de ta classe.

              Le get, c'est déjà moins bien, ca veut dire que d'autres objets ont besoin de connaitre le contenu de celui ci, c'est louche.

              Le set ca c'est a proscrire absolument, a quoi te servira tom private si n'importe quel objet peut modifier la variable?

              Ta découpe ne me semble pas trop mal pour débuter, mis a part le main qui ne devrait pas contenir les contrôles, idéalement dans un jeu, on utilise une  state machine qui permet de gérer, entre autre, les entrées(contrôles) afin d'avoir un comportement adhoc suivant qu'on soit dans le jeu, dans un menu, sur l'écran titre...

              • Partager sur Facebook
              • Partager sur Twitter
                21 octobre 2021 à 23:56:10

                Je te remercie a nouveau pour ces indications
                • Partager sur Facebook
                • Partager sur Twitter
                  22 octobre 2021 à 9:49:13

                  Bonjour,

                  Je ne vais pas discuter ici de la pertinence d'utiliser une classe pour l'expérience. Je voulais juste rajouter quelques explications concernant ce que t'a dit PXL.

                  Tout d'abord, tu utilises la composition, c'est-à-dire que tu utilises un personnage comme attribut de l'expérience. La composition représente une relation "a un". Par exemple, une personne a un nom et un prénom. Si on définit une classe Personne, qu'il serait logique de lui faire deux attributs nom et prénom. Ici, penses-tu qu'un personnage a de l'expérience ou que de l'expérience a un personnage ?

                  Ensuite, concernant le fait que xp soit un attribut privé ne le protège pas si tu mets un setter qui peut prendre n'importe quelle valeur. En gros, c'est comme si tu mettais ton attribut public. Dans beaucoup de tutoriels, on présente les objets comme des collections d'attributs avec des guetters et des setters mais c'est la plupart du temps une mauvaise pratique.

                  Les setters peuvent être utiles dans certains cas. Pour reprendre l'exemple d'une classe Personne, on peut choisir de faire un setter pour son adresse. Parce que c'est logique et courant qu'une personne puisse déménager. Par contre, ça n'a pas de sens d'en faire pour sa date de naissance. On n'en qu'une et elle n'est pas censée changer. Un intérêt des setters, c'est de vérifier si la nouvelle valeur que tu veux donner à ton attribut est valide. Mais ce n'est pas ça l'essence de la programmation objet. Donc, avant d'ajouter des setters à une classe, il faudrait vraiment se demander si cela a du sens. La plupart du temps, ça n'en a pas.

                  Dans le cas qui te concerne, tu ne fais aucun contrôle sur la nouvelle valeur qui est assignée à xp. On pourrait lui mettre 10, 1 000 000, 0 ou même -5. De plus, quand un personnage gagne de l'expérience, tu dois faire un truc du style

                  exp.setXp(exp.getXp() + someXp);

                  c'est très lourd et tu dois faire ça à chaque endroit où un personnage gagne de l'expérience. Ça fera beaucoup de code dupliqué et surtout, tu sors la logique d'augmentation d'expérience à l'extérieur de la classe.

                  Comme le disait PXL, ce serait plus pertinent de faire une méthode "add" qui ajouterait un certain montant d'expérience. Le calcul sera fait dans la classe Expérience à un seul endroit. Il faudrait juste vérifier dans la méthode que le paramètre est positif (sauf s'il est éventuellement possible de perdre de l'expérience).

                  C'est la même chose avec la classe Perso et la méthode levelUp. Tu as des setters pour tous les attributs de Perso, ce qui n'a pas de sens puisqu'il ne peuvent pas (et surtout ne doivent pas) être modifiés arbitrairement. Généralement, une classe ne devrait pas être autorisée à modifier les attributs d'une autre classe. D'un point de vue conceptuel, ce serait plutôt à la classe Perso de savoir comment modifier ses attributs en cas de nouveau niveau. Ce serait donc plus logique de mettre la méthode levelUp dans Perso.

                  Pour récapituler, au lieu de mettre des getters et des setters un peu partout, il faut plutôt se demander ce qu'est censée faire ta classe et ajouter des méthodes pour le faire. Ce seront ces méthodes qui se chargeront de modifier les attributs de manière cohérente.

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Aide java classe Expérience

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