CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[Java]Demande d'aide sur les Getter/Setter

dsman2009
dsman2009
Niveau 35
18 août 2020 à 16:15:30

Bonjour , voila j'ai quelques problèmes a comprendre comme fonctionne les getters/setters, je debute en programmation et je voulais faire un truc simple pour comprendre.

Se que je veux faire :
-On a un guss nommé michel, il possède une force d'attaque de 18, je veux utiliser la fonction Loot_épée de ma class "Classe" pour qu'il loot l'épée qui donne +20 et s'additionne a sa force. En suite je veux utiliser cette nouvelle valeur qui devrait être 38 dans mon main. Le fait est que pour le moment ça me donne juste 18 donc j'ai bien merdé et j'ai besoins d'aide.

Le main : https://image.noelshack.com/fichiers/2020/34/2/1597760070-main.png
La classe : https://image.noelshack.com/fichiers/2020/34/2/1597760110-classe.png

cybevil
cybevil
Niveau 27
18 août 2020 à 16:30:13

Je ne comprends pas bien pourquoi tu utilises des méthodes static ?
Tu as déjà fait de l'orienté objet ?

package jeu;

public class Personnage {
	
	private String nom;
	private int atk;
	
	Personnage(String nom, int atk) {
		this.nom = nom;
		this.atk = atk;
	}
	
	public void lootEpee() {
		this.atk += 20;
	}

	public int getAtk() {
		return atk;
	}

}
package jeu;

public class Main {

	public static void main(String[] args) {
		Personnage michelle = new Personnage("Michelle", 18);

		michelle.lootEpee();

		System.out.println("Attaque de michelle : " + michelle.getAtk());
	}

}
Message édité le 18 août 2020 à 16:32:19 par cybevil
cybevil
cybevil
Niveau 27
18 août 2020 à 16:34:44

En fait les getters et setter c'est pour modifier tes attributs définit en privé dans ta classe à partir d'une autre classe.

Dans mon exemple je ne peux pas modifier ni le nom ni l'atk depuis ma classe main, donc je fais un getter pour y accéder et j'aurais pu faire un setter pour le modifier depuis mon main.

Dans tes screens tu n'as aucun attribut donc les getters et setters ne serviraient à rien.

Message édité le 18 août 2020 à 16:36:25 par cybevil
dsman2009
dsman2009
Niveau 35
18 août 2020 à 16:53:06

J'te remercie c'est se que je cherchais a faire, le static je sais pas ça ne compilait pas sans .

cybevil
cybevil
Niveau 27
18 août 2020 à 16:59:38

Pas de soucis, essaie peut-être un cours sur l'orienté objet, j'ai l'impression que tu programmes en Java comme en C.

infireman
infireman
Niveau 9
19 août 2020 à 09:08:32

Au lieu de mettre des attributs privés + getters/setters, met directement les attributs public

cybevil
cybevil
Niveau 27
19 août 2020 à 10:36:12

Le 19 août 2020 à 09:08:32 infireman a écrit :
Au lieu de mettre des attributs privés + getters/setters, met directement les attributs public

Quelle bonne idée, oublions le principe d'encapsulation et donnons déjà de mauvaise habitude au débutant...

infireman
infireman
Niveau 9
19 août 2020 à 13:51:28

Le 19 août 2020 à 10:36:12 cybevil a écrit :

Le 19 août 2020 à 09:08:32 infireman a écrit :
Au lieu de mettre des attributs privés + getters/setters, met directement les attributs public

Quelle bonne idée, oublions le principe d'encapsulation et donnons déjà de mauvaise habitude au débutant...

Autant ne pas les lobotomiser avec des idées de merde qui sont la cause de pourquoi nos ordis sont des machines incroyablement puissantes et pourtant mon Chrome met de plus en plus de temps à démarrer et Windows met le même temps pour démarrer depuis des décennies, avec des processeurs des MILLIONS de fois plus rapides.

La programmation orientée abjecte c'est inventé par des mecs qui n'ont rien de mieux à faire que de trouver des solutions à des problèmes inexistants

cybevil
cybevil
Niveau 27
19 août 2020 à 17:41:19

Le 19 août 2020 à 13:51:28 infireman a écrit :

Le 19 août 2020 à 10:36:12 cybevil a écrit :

Le 19 août 2020 à 09:08:32 infireman a écrit :
Au lieu de mettre des attributs privés + getters/setters, met directement les attributs public

Quelle bonne idée, oublions le principe d'encapsulation et donnons déjà de mauvaise habitude au débutant...

Autant ne pas les lobotomiser avec des idées de merde qui sont la cause de pourquoi nos ordis sont des machines incroyablement puissantes et pourtant mon Chrome met de plus en plus de temps à démarrer et Windows met le même temps pour démarrer depuis des décennies, avec des processeurs des MILLIONS de fois plus rapides.

La programmation orientée abjecte c'est inventé par des mecs qui n'ont rien de mieux à faire que de trouver des solutions à des problèmes inexistants

Honnêtement ça ne m’intéresse pas beaucoup de défendre l’orienté objet bec et ongles. Puis t'as l'air de le prendre tellement à cœur que je doute qu'on puisse avoir un échange intéressant autre que se jeter la balle.

Mais rien que pour l'accessibilité et la maintenabilité du code, l’orienté objet est intéressant et justifie qu'il soit autant utilisé pour de gros projets en acceptant une perte de performance. Chaque paradigme a ses qualités et ses défauts et j'aime aussi faire du procédural.

D’ailleurs, si on suit ton point de vue, ça aurait été plus logique de lui conseiller de changer de langage plutôt que de lui donnée de mauvais conseil dans un langage orienté objet.

TheRealMarco
TheRealMarco
Niveau 13
19 août 2020 à 18:22:07

Le 19 août 2020 à 13:51:28 infireman a écrit :

Le 19 août 2020 à 10:36:12 cybevil a écrit :

Le 19 août 2020 à 09:08:32 infireman a écrit :
Au lieu de mettre des attributs privés + getters/setters, met directement les attributs public

Quelle bonne idée, oublions le principe d'encapsulation et donnons déjà de mauvaise habitude au débutant...

Autant ne pas les lobotomiser avec des idées de merde qui sont la cause de pourquoi nos ordis sont des machines incroyablement puissantes et pourtant mon Chrome met de plus en plus de temps à démarrer et Windows met le même temps pour démarrer depuis des décennies, avec des processeurs des MILLIONS de fois plus rapides.

La programmation orientée abjecte c'est inventé par des mecs qui n'ont rien de mieux à faire que de trouver des solutions à des problèmes inexistants

J'ai d'abord était estomaqué par ton commentaire. Puis je me suis rappelais que pendant mes études, je ne comprenais pas l'intérêt du typage, même après des cours sur le sujet, je trouvais toujours que c'était trop de contrainte et une perte de temps. :noel:

PS: L'argument de vitesse ne tient plus, un appel de fonction ou un accès direct c'est une différence tellement faible avec nos processeurs actuels.
La réponse de la lenteur est autre part. De quoi était capable Windows et Google avant, et de quoi sont-ils capable maintenant ? Et puis toutes les petites animations, ça coûte pas mal en puissance de calcul.

Message édité le 19 août 2020 à 18:23:56 par TheRealMarco
dsman2009
dsman2009
Niveau 35
26 août 2020 à 01:16:46

Bonjour voila j'ai un autre soucis. J'ai crée un ennemi avec personnage ( appelé squelette) et donc j'ai proposé plusieurs choix le premier est lancer une boule de feu et l'autre frapper. Le problème est dans ma class de boule de feu , les degats se calcul mais ne s'applique pas j'suis sur que c'est presque rien voila la classe en question :

Je prends ici les pv actuel de l'ennemi ( ici c'est squelette.barre_de_vie qui est donné), les points de mana du joueurs, sa stats de magie et le nom de l'ennemi

void Boule_de_feu( int pv_ennemi, int mp,int magie, String ennemi)
{
mp=mp-3; // points de mana
int degats=6+magie;
pv_ennemi=pv_ennemi-degats;

System.out.println(" Vous Infligez "+degats+" au "+ennemi);

}

cybevil
cybevil
Niveau 27
26 août 2020 à 02:07:18

Tu veux dire quoi par ne s'applique pas ? mets ta classe en entier, là t'as juste mis une méthode.
Utilise aussi les balises code pour l'indentation plz en vérifiant l'aperçu <code></code>



Message édité le 26 août 2020 à 02:07:34 par cybevil
dsman2009
dsman2009
Niveau 35
26 août 2020 à 03:38:47
 void Combat_Ennemie_debut ()
 {
   
     
     int drop_1=ran.nextInt(1);  // Génère un nombre qui servira à déterminer l'ennemi 1 le squelette , 2 le troll etc pour le moment juste le squelette
     
      switch(drop_1)
       {
           case 0:
               Personnage squelette = new Personnage(5, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0);
             nom_ennemi="Squelette";
           System.out.println("Un Squelette apparait");
           
         
           
           //Combat
           
           
           
          while(squelette.barre_pv>0 && barre_pv>0 ) // tant que la vie du squelette n'est pas a zero ou celle du joueur
               
           {
              
               int tour_fini=0;
               while(tour_fini==0) // tant que le tourdu joueur n'est pas fini
               {
                clear.clrscr();
               System.out.println("    HP Squelette : "+squelette.barre_pv);
               System.out.println("          Vos HP : "+barre_pv+"\n");
               System.out.println("    Que voulez vous faire ? 1 Attaquer, 2 Utiliser un sort ,3 Utiliser un Objet ");
               int entrée= scan.nextInt();
               
               if(entrée!=1 && entrée != 2 && entrée !=3)
                   
               {System.out.println("    Erreur de Saisie");}
               
               if(entrée==1) // attaque au Cac 
                   
               {
                   squelette.barre_pv=squelette.barre_pv-atk;
                   System.out.println("    Vous infligez une attaque au Squellette de "+atk);
                   
                       }
 
                       
                       
                       
                   }
                   tour_fini=1; // Sert a savoir si le tour de la personne est fini 
                   
               }
               
               
               
               
               
               if(entrée==2) // attaque avec un sort la boule de Feu 
                   
               {
                   if(Sort1=="aucun" && Sort2=="aucun" && Sort3=="aucun" && Sort4=="aucun" && Sort5=="aucun") 
// Les Sort sont loot par le joueur de façon aléatoire il peut en avoir ou non , les sorts sont placés dans sort1 , sort 2 etc pour le moment juste le 1er contient Boule de feu 
                       
                   {
                    System.out.println("    Vous n'avez pas de sort");
                   }
                   if(mp<=0)
                   {
                    System.out.println("    Vous n'avez pas de mana");
                   }
                   if(mp>0)
                       
                   {
                  if(Sort1=="Boule De Feu")
                      
                  {
                      Personnage.Boule_de_feu(squelette.barre_pv, mp, magie, "Squelette");  
// class qui marche pas voir 2eme code

                      tour_fini=1;
                      
                      
                     
    
                             
                           
    }
                      
                      
                      
                  }
                              
                   }   
                       
                       
                       
                      }
                   }
                   
               
               
              //Une fois que le joueur a fait son tour  
          
          if(tour_fini==1)
          {
          System.out.println("    Le Squelette vous inflige "+squelette.atk+" de dégats");
          barre_pv=barre_pv-squelette.atk;
          }
               
           }
           
           
          if(squelette.barre_pv<=0)
              
          {
           System.out.println("    Félicitation vous avez tué le Squelette");
       
          }
          
           
           break; 

la class :

 void Boule_de_feu( int pv_ennemi, int mp,int magie, String ennemi)
{
mp=mp-3; // points de mana
int degats=6+magie;
pv_ennemi=pv_ennemi-degats;

System.out.println(" Vous Infligez "+degats+" au "+ennemi);

}  
Message édité le 26 août 2020 à 03:42:21 par dsman2009
dsman2009
dsman2009
Niveau 35
26 août 2020 à 03:49:14

Ce que je veux dire par ne s'applique pas c'est qu'en gros , j'arrive a faire le calcul des degats ça me fait 8 sauf qu'il ne sont pas infligés , la barre d'hp du squelette reste a 20 ( les autres stats / chiffres sont les l'attaque a 5 , les pv actuel a 20 et les pv maximum a 20 , le reste c'est les resistances )

Message édité le 26 août 2020 à 03:50:45 par dsman2009
cybevil
cybevil
Niveau 27
26 août 2020 à 04:10:50

Si il ne sont pas infligés, c'est surement parce que tu modifies juste les arguments de ta méthode et pas les attributs de ta classe.

Mais encore une fois tu ne programmes pas en orienté objet, et vu que java est un langage uniquement orienté objet, ça rend ton code incompréhensible.
Normalement chaque classe permet de créer des instances d'objets bien définis par des attributs et toutes les actions de l'objet doivent être gérées par des méthodes différentes de la classe.
Là on dirait une bouillie de ligne de code bricoler avec des rustines partout, on peut surement résoudre ton problème mais plus ton programme va évoluer et moins tu t'y retrouveras.

TheRealMarco
TheRealMarco
Niveau 13
26 août 2020 à 09:40:31

void Boule_de_feu( int pv_ennemi, int mp,int magie, String ennemi)
{
mp=mp-3; // points de mana
int degats=6+magie;
pv_ennemi=pv_ennemi-degats;

System.out.println(" Vous Infligez "+degats+" au "+ennemi);

}

Comme l'a dit mon voisin, tu modifies le paramètre pv_ennemi de la fonction.
Mais la valeur n'est jamais appliqué à ton ennemi.
La variable pv_ennemi indique le nombre de pv qu'à ton ennemi, mais ça ne permet en rien de modifier l'ennemi. Il n'y a pas de référence vers l'ennemi.

Si tu passes squelette en paramètre de boule de feu et que tu fais squelette.barre_pv = squelette.barre_pv - degats ça devrait corriger le problème.

Le mieux, serait que la fonction soit directement sur la classe de ton ennemi. Par exemple, sur ton squelette, il doit y avoir une fonction void Prendre_des_dommages(int dommage) { this.barre_pv = this.barre_pv - dommage; }

PS: On n'est pas obligé de faire de la POO en Java, d'autres paradigmes fonctionnent parfaitement.

lelouchvx
lelouchvx
Niveau 4
26 août 2020 à 14:31:07

Et je rajouterai en plus de mes collègue que tu devrais utiliser et exploiter encore plus la programmation orienté objet en l'exploitant un peu plus.

Exemple :


package jeu;

protected class Personnage {
    
    protected String nom;
    protected int pv;
    protected int atk;
    
    Personnage(String nom, int pv, int atk) {
        this.nom = nom;
        this.pv = pv;
        this.atk = atk;
    }

    public void attaquer(Personnage cible)
    {
        cible.prendreDesDegats(this.atk);
    }

    public void prendreDesDegats(int atk) {
       this.pv = this.pv - atk;
    }
  
    public int getAtk() {return this.atk;}
    public int getPv() { return this.pv; }
    public int getNom() { return this.nom; }
}

package jeu;

public class Michel extends Personnage {

    public Michel () {
       super();
    }

   public void ramasserEpee() {
       this.atk += 20;
   }
}

package jeu;

public class Troll extends Personnage {

    public Troll () {
       super();
       this.nom = Troll;
    }

}

package jeu;

public class Partie {

    private List<Personnage> listEnnemis;
    private Personnage heros;
 
    public Partie(List<Personnage> listEnnemis, Personnage heros)
    {
        this.listEnnemis = listEnnemis;
        this.heros = heros;
    }

   public void LancementDuJeu()
   {
       while(!listEnnemis.isEmpty())
       {
            // Décrire le déroulement d'une partie tant qu'il y a des monstres en vie
       }
   }

}

Voilà tu utilises toutes ces classes dans ton main, tu iras te renseigner sur l'héritage qui est super important lorsque l'on veut faire un jeu avec des personnages ayant une base commune. Tu peux même pousser le truc super loin en appliquant des patterns et qu'un personnage possède une liste de compétences que tu créer etc etc etc ...

Mais si tu veux partir sur un truc simple y a ce qu'on te propose à toi de pousser de plus en plus quand tu arriveras à comprendre comment fonctionne le POO. A mes débuts j'avais fait un jeu en statique sans aucune classe, j'ai pleurer du sang à chaque nouvelle feature que je voulais rajouter x)

TheRealMarco
TheRealMarco
Niveau 13
26 août 2020 à 19:12:34

Je pense que vous proposez des trucs bien trop compliqué par rapport à un problème de débutant assez simple. Revoir toute l'architecture et passer dans un code orienté objet n'est pas dans la question. Les réponses devraient être focalisées sur la question avec une petite proposition d'amélioration à la fin.

Date_a_science
Date_a_science
Niveau 8
28 août 2020 à 23:42:32

Le 19 août 2020 à 18:22:07 TheRealMarco a écrit :

Le 19 août 2020 à 13:51:28 infireman a écrit :

Le 19 août 2020 à 10:36:12 cybevil a écrit :

Le 19 août 2020 à 09:08:32 infireman a écrit :
Au lieu de mettre des attributs privés + getters/setters, met directement les attributs public

Quelle bonne idée, oublions le principe d'encapsulation et donnons déjà de mauvaise habitude au débutant...

Autant ne pas les lobotomiser avec des idées de merde qui sont la cause de pourquoi nos ordis sont des machines incroyablement puissantes et pourtant mon Chrome met de plus en plus de temps à démarrer et Windows met le même temps pour démarrer depuis des décennies, avec des processeurs des MILLIONS de fois plus rapides.

La programmation orientée abjecte c'est inventé par des mecs qui n'ont rien de mieux à faire que de trouver des solutions à des problèmes inexistants

J'ai d'abord était estomaqué par ton commentaire. Puis je me suis rappelais que pendant mes études, je ne comprenais pas l'intérêt du typage, même après des cours sur le sujet, je trouvais toujours que c'était trop de contrainte et une perte de temps. :noel:

PS: L'argument de vitesse ne tient plus, un appel de fonction ou un accès direct c'est une différence tellement faible avec nos processeurs actuels.
La réponse de la lenteur est autre part. De quoi était capable Windows et Google avant, et de quoi sont-ils capable maintenant ? Et puis toutes les petites animations, ça coûte pas mal en puissance de calcul.

Le typage a une réelle utilité, mais pas dans la programmation classique web/logiciel. Cela prend surtout son essor en algorithmie et Datascience, où on a besoin de performance et de sûreté.

Exemple : python est typé de manière dynamique, pourtant toutes les meilleurs bibliothèques sont écrites en cython (C/C++) qui a pour avantage de : typer les variables et permettre une meilleure performance + sécurité sur les variables (mais pas seulement).

Pour ce qui est de la lenteur, je te rejoins sur ton raisonnement. Le problème vient notamment de la complexification des systèmes mais aussi de l'ajout de fonctionnalités (Cortana :hap: ) et d'autres processus plus gourmands que les précédents.

lokilok
lokilok
Niveau 16
29 août 2020 à 11:18:56

Le typage a une réelle utilité, mais pas dans la programmation classique web/logiciel.

Le typage a une réelle utilité partout, le seul intérêt de ne pas en avoir à la limite c'est dans le prototypage, pour faire des trucs rapidement. Mais dès que tu veux mettre en production quelque chose, tu veux qu'il soit le plus stable / sécurisé possible, et le typage est un bon outil pour ça.

C'est pour ça qu'en python ils ont rajouté des annotations pour le typage, côté JS il y a d'autres langages genre TypeScript qui ont été créés pour ça. Puis un langage beaucoup moins populaire, le dart (un truc de Google) est aussi passé du typage dynamique au typage statique avec sa 2.0.

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Création de sites web
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment