Probléme avec des objets

Résolu
edouard333 Messages postés 62 Date d'inscription samedi 23 décembre 2000 Statut Membre Dernière intervention 18 décembre 2011 - 23 mai 2010 à 00:10
edouard333 Messages postés 62 Date d'inscription samedi 23 décembre 2000 Statut Membre Dernière intervention 18 décembre 2011 - 30 mai 2010 à 11:37
Bonjour tout le monde,

Voila, j'ai un gros problème avec des objets, j'ai des objets "ressoucre" (c'est du bois, de la pierre, de l'eau, des dimants, du vin, ...) et des objets "batiment" (un entrepot, un musé, un hôtipal, ...). Donc a un moment je veu augmenter le niveau d'un batiment, dans ce cas s'y c'est une académie, et il faut donner une partie des ressources (ici, c'est du bois et de la pierre).
Mais le programme considère que: bois et pierre c'est la même chose! Donc si j'enlève 550 unité de bois, ça s'enlève cher la pierre!!!

Voila le programme:
import Ressources.*;
import Batiments.*;
import BDD.*;

import java.io.*;

public class T{

static Strings str= new Strings();
static Ressource bois= new Bois();
static Ressource pierre= new Pierre();

public static void main(String[] args) throws IOException{

Batiment academie= new Academie();
academie.Charger(new Academie());

bois.Charger(new Bois());
pierre.Charger(new Pierre());

bois.Valeur(1000);
pierre.Valeur(1000);

try{

System.out.println("Valeur de bois: "+bois.nb());
System.out.println("Valeur de pierre: "+pierre.nb());

System.out.println("");

academie.Modifier();

System.out.println(""+str.evenement);
System.out.println(""+str.evenement2);
System.out.println(""+str.evenement3);

System.out.println("");

System.out.println("Valeur de bois: "+bois.nb());
System.out.println("Valeur de pierre: "+pierre.nb());

}
catch(Exception e){
System.out.println("Erreur:\n"+e);
}

}
}

Voila le fichier Ressource:
package Ressources;

import BDD.*;

abstract public class Ressource{

//Algoritme qui généralise quand il y a trop d'une ressource par rapport à l'entrepôt:
private long limitateur(long valeur, long max){
if(valeur > max){
base.experience-= valeur-max;
return (valeur-max);
}
else
return valeur;
}

//Les class avec des morceaux de la base de données:
Strings str= new Strings();
Base base= new Base();
Ressources res= new Ressources();
Batiments batim= new Batiments();

//Pour la ressource:
private static String nom;
private static String description;

private static long nb;

//Pour le bâtiment:
private static String nom_b;
private static long nv= 1;

private static long cout1;
private static String nom_cout1;
private static long cout2;
private static String nom_cout2;

//Pour les personnes:
private static String nom_p;
private static long personne;
private static long max_personne;

//Pour la production:
private static long production;

//Pour la ressource:
public String nom(){
return this.nom;
}
abstract public String setnom();

public String description(){
return this.description;
}
abstract public String setdescription();

public long nb(){
return this.nb;
}
abstract public long setnb();

//Pour le bâtiment:
public String nom_b(){
return this.nom_b;
}
abstract public String setnom_b();

public long nv(){
return nv;
}
public long cout1(){
return cout1;
}
abstract public long setcout1();

public String nom_cout1(){
return this.nom_cout1;
}
abstract public String setnom_cout1();

public void cout1_augmente(){
}
abstract public void setcout1_augmente();

public long cout2(){
return this.cout2;
}
abstract public long setcout2();

public String nom_cout2(){
return nom_cout2;
}
abstract public String setnom_cout2();

public void cout2_augmente(){
}
abstract public void setcout2_augmente();

//Pour les personnes:
public String nom_p(){
return nom_p;
}
abstract public String setnom_p();

public long personne(){
return personne;
}
abstract public long setpersonne();

public long max_personne(){
return max_personne;
}
abstract public long setmax_personne();

//Pour la production:
public long production(){
return production;
}
abstract public long setproduction();
//Ici, c'est ça nouvelle valeur.
public void production(long valeur){
this.production= valeur;
}

public void Charger(Ressource r){
//Pour la ressource:
nom= r.setnom();
description= r.setdescription();

nb= r.setnb();

//Pour le bâtiment:
nom_b= r.setnom_b();

cout1= r.setcout1();
nom_cout1= r.setnom_cout1();
cout2= r.setcout2();
nom_cout2= r.setnom_cout2();

//Pour les personnes:
nom_p= r.setnom_p();
personne= r.setpersonne();
max_personne= r.setmax_personne();

//Pour la production:
production= r.setproduction();
}

public void Valeur(){
}

private static Ressource bois= new Bois();
private static Ressource pierre= new Pierre();

public void Modifier(){
System.out.println("Pour augmenter le niveau de "+str.ta+" mine de pierre tap"+str.e+" '1' ou pour le nombre de travailleurs tap"+str.e+" '2'.");
String qq= Clavier.lireString();

if("1".equals(qq)){

if(cout1 > bois.nb){
str.evenement2= str.Tu+" a"+str.s+" essaye d'augmenter "+str.ta+" "+nom_b+", mais ca echoue:";
str.evenement2= str.Tu+" n'a"+str.s+" pas assez de bois pour augmenter la mine de pierre(il faut encore: '"+(cout1-bois.nb())+"')!";
}

if(cout2 > pierre.nb){
str.evenement2= str.Tu+" a"+str.s+" essaye d'augmenter "+str.ta+" "+nom_b+", mais ca echoue:";
str.evenement3= str.Tu+" n'a"+str.s+" pas assez de pierre pour augmenter la mine de pierre(il faut encore: '"+(cout2-pierre.nb())+"')!";
}

if(cout1 < bois.nb & cout2 < pierre.nb){

nv++;
str.evenement2= str.Tu+" a"+str.s+" augmente le niveau de "+str.ta+" "+nom_b+" au NV ""+nv+"".";
str.evenement2= nom_cout1+" en moins '"+cout1+"'";
str.evenement3= nom_cout2+" en moins '"+cout2+"'";

bois.Valeur(bois.nb()- cout1);
cout1+= (cout1/3);
pierre.Valeur(pierre.nb()- cout2);
cout2+= (cout2/3);
max_personne*= nv;
}
}

if("2".equals(qq)){
System.out.println(str.Tu+" a"+str.s+" '"+res.habitants+"' habitant(s) et "+str.tu+" a"+str.s+" '"+personne+"' "+nom_p+".");
long travailleur=Clavier.lireInt();
res.habitants-= travailleur;
personne+= travailleur;
}

}

public void Actualiser(){
nb+= (personne*production);
base.experience+= (personne*production)*2;
}

public void Limiter(){
nb= limitateur(nb, batim.capaciteentrepot);
}

public void Valeur(long valeur){
this.nb= valeur;
}
}

Voila le fichier Batiment:
package Batiments;

import BDD.*;
import Ressources.*;

abstract public class Batiment{

//Les class avec des morceaux de la base de données:
Strings str= new Strings();
Base base= new Base();

protected static Ressource bois= new Bois();
protected static Ressource pierre= new Pierre();
static Ressource vin= new Vin();
static Ressource fer= new Fer();
static Ressource ruby= new Ruby();
static Ressource nourriture= new Nourriture();
static Ressource cristal= new Cristal();
static Ressource acier= new Acier();

//Description:
protected static String nom;
protected static String article_singulier;
protected static String article_precis;
protected static String description;

protected static int nv= 0;

//Les coûts:
protected static int cout1;
protected static String nom_cout1;
protected static String article_cout1;

protected static int cout2;
protected static String nom_cout2;
protected static String article_cout2;

//Les service:
//Personne qui travaille ou service dans se bâtiment:
protected static int personne1= 0;
protected static int max_personne1;
protected static String nom_personne1;
protected static int cout_personne1;


protected static int personne2= 0;
protected static String nom_personne2;
protected static int max_personne2;
protected static int cout_personne2;

//Description:
public String nom(){
return this.nom;
}
public String article_singulier(){
return this.article_singulier;
}
public String article_precis(){
return this.article_precis;
}
public String description(){
return this.description;
}

public int nv(){
return this.nv;
}

//Les coûts:
public int cout1(){
return this.cout1;
}
public String nom_cout1(){
return this.nom_cout1;
}
public String article_cout1(){
return this.article_cout1;
}

public int cout2(){
return this.cout2;
}
public String nom_cout2(){
return this.nom_cout2;
}
public String article_cout2(){
return this.article_cout2;
}

//Les services:
public int personne1(){
return this.personne1;
}
public int max_personne1(){
return this.max_personne1;
}
public String nom_personne1(){
return this.nom_personne1;
}
public int cout_personne1(){
return this.cout_personne1;
}

public int personne2(){
return this.personne2;
}
public String nom_personne2(){
return this.nom_personne2;
}
public int max_personne2(){
return this.max_personne2;
}
public int cout_personne2(){
return this.cout_personne2;
}

//Pour mode commande (si on veut augmenter le nv du batiment):
abstract public void Afficher();
abstract public void Modifier();
abstract public void Modifier2();
abstract public void Modifier3();

//Description:
abstract public String setnom();
abstract public String setarticle_singulier();
abstract public String setarticle_precis();
abstract public String setdescription();

//Les coûts:
abstract public int setcout1();
abstract public String setnom_cout1();
abstract public String setarticle_cout1();

abstract public int setcout2();
abstract public String setnom_cout2();
abstract public String setarticle_cout2();

//Les services:
abstract public int setmax_personne1();
abstract public String setnom_personne1();
abstract public int setcout_personne1();

abstract public String setnom_personne2();
abstract public int setmax_personne2();
abstract public int setcout_personne2();


public void Charger(Batiment b){
//Description:
this.nom= b.setnom();
this.article_singulier= b.setarticle_singulier();
this.description= b.setdescription();

//Les coûts:
this.cout1= setcout1();
this.nom_cout1= b.setnom_cout1();
this.article_cout1= b.setarticle_cout1();

this.cout2= setcout2();
this.nom_cout2= b.setnom_cout2();
this.article_cout1= b.setarticle_cout2();

//Les services:
this.max_personne1= b.setmax_personne1();
this.nom_personne1= b.setnom_personne1();
this.cout_personne1= b.setcout_personne1();

this.nom_personne2= b.setnom_personne2();
this.max_personne2= b.setmax_personne2();
this.cout_personne2= b.setcout_personne2();
}

public void Valeur(){
System.out.println("Les valeurs:");
System.out.println(" Nom: "+nom);
System.out.println(" Description: "+description);

System.out.println("");

System.out.println(" Niveau: "+nv);

System.out.println("");

System.out.println(" Cout 1["+nom_cout1+"]: "+cout1);
System.out.println(" Cout 2["+nom_cout2+"]: "+cout2);

System.out.println("");

System.out.println(" Personne 1["+nom_personne1+"]: "+personne1+"/"+max_personne1+", coute: "+cout_personne1);
System.out.println(" Personne 2["+nom_personne2+"]: "+personne2+"/"+max_personne2+", coute: "+cout_personne2);
}

protected void Aff(int nb){
System.out.println("-Pour creer "+article_singulier+" "+nom+", tap"+str.e+" '"+nb+"'.");
System.out.println(" Cout: '"+cout1+"' "+article_cout1+" "+nom_cout1+" et '"+cout2+"' "+article_cout2+" "+nom_cout2+".");
}

}
Voila le fichier Academie:
package Batiments;

public class Academie extends Batiment{

//Description:
public String setnom(){
return "Academie";
}
public String setarticle_singulier(){
return "une";
}
public String setarticle_precis(){
return "l'";
}

public String setdescription(){
return "...";
}

//Les coûts:
public int setcout1(){
return 750;
}
public String setnom_cout1(){
return "Bois";
}
public String setarticle_cout1(){
return "de";
}

public int setcout2(){
return 500;
}
public String setnom_cout2(){
return "Pierre";
}
public String setarticle_cout2(){
return "de";
}

//Les services:
public int setmax_personne1(){
return 0;
}
public String setnom_personne1(){
return "";
}
public int setcout_personne1(){
return 0;
}

public String setnom_personne2(){
return "";
}
public int setmax_personne2(){
return 0;
}
public int setcout_personne2(){
return 0;
}

public void Afficher(){
if(base.habitants > 400 & nv == 0){
System.out.println("-Pour creer une "+nom+", tap"+str.e+" '10'.");
System.out.println(" Cout: '"+cout1+"' "+nom_cout1+" et '"+cout2+"' de "+nom_cout2+".");
base.experience+= 2;
}
if(nv > 0){
System.out.println(nom+"(niv: '"+nv+"'):");
System.out.println("-Pour augmenter le niveau de "+str.ton+" "+nom+" ('"+base.intelligence+"' personnes y vont), tap"+str.e+" '10'.");
System.out.println(" Cout: '"+cout1+"' "+nom_cout1+" et '"+cout2+"' de "+nom_cout2+".");
System.out.println(" Pour faire des recherche, tap"+str.e+" '10.5'.");
base.experience+= 2;
}
}

public void Modifier(){
if(nv > 1){
str.augmenter= "d'augmente";
str.augmenter2= "augmenter";
str.ton2= "ton";
}

else{
str.augmenter= "de construire";
str.augmenter2= "construire";
str.ton2= "une";
}

if(cout1 > bois.nb()){
str.evenement= str.Tu+" a"+str.s+" essaye "+str.augmenter+" "+str.ton2+" academie, mais ca echoue:";
str.evenement2= str.Tu+" n'a"+str.s+" pas assez de bois pour "+str.augmenter2+" "+str.ton2+" academie(il faut encore: '"+(cout1-bois.nb())+"')!";
}

if(cout2 > pierre.nb()){
str.evenement= str.Tu+" a"+str.s+" essaye "+str.augmenter+" "+str.ton2+" academie, mais ca echoue:";
str.evenement3= str.Tu+" n'a"+str.s+" pas assez de pierre pour "+str.augmenter2+" "+str.ton2+" academie(il faut encore: '"+(cout2-pierre.nb())+"')!";
}

if(cout1 < bois.nb() & cout2 < pierre.nb()){
nv++;
if(nv > 1){
str.evenement= str.Tu+" a"+str.s+" augmente le niveau de "+str.ton+" academie au NV ""+nv+"".";
}

else{
str.evenement= str.Tu+" a"+str.s+" cree une academie.";
}

str.evenement2= "Bois en moins '"+cout1+"'";
str.evenement3= "Pierre en moins '"+cout2+"'";

bois.Valeur(bois.nb()-cout1);
cout1+= (cout1/3);
pierre.Valeur(pierre.nb()-cout2);
cout2+= (cout2/3);
}

}

public void Modifier2(){
System.out.println("Il existe une/des recherche(s) possible(nt) a faire:");
}

public void Modifier3(){
}
}

et voila le fichier bois et pierre:
package Ressources;

public class Pierre extends Ressource{
//Pour la ressource:
public String setnom(){
return "Pierre";
}
public String setdescription(){
return "";
}

public long setnb(){
return 0;
}

//Pour le bâtiment:
public String setnom_b(){
return "";
}

public long setcout1(){
return 0;
}
public String setnom_cout1(){
return "";
}
public void setcout1_augmente(){
}

public long setcout2(){
return 0;
}
public String setnom_cout2(){
return "";
}
public void setcout2_augmente(){
}

//Pour les personnes:
public String setnom_p(){
return "";
}
public long setpersonne(){
return 0;
}
public long setmax_personne(){
return 0;
}

//Pour la production:
public long setproduction(){
return 0;
}
}
package Ressources;

import BDD.*;

public class Bois extends Ressource{
//Pour la ressource:
public String setnom(){
return "Bois";
}
public String setdescription(){
return "";
}

public long setnb(){
return 0;
}

//Pour le bâtiment:
public String setnom_b(){
return "";
}

public long setcout1(){
return 0;
}
public String setnom_cout1(){
return "";
}
public void setcout1_augmente(){
}

public long setcout2(){
return 0;
}
public String setnom_cout2(){
return "";
}
public void setcout2_augmente(){
}

//Pour les personnes:
public String setnom_p(){
return "";
}
public long setpersonne(){
return 0;
}
public long setmax_personne(){
return 0;
}

//Pour la production:
public long setproduction(){
return 0;
}
}

5 réponses

cs_Kysic Messages postés 332 Date d'inscription mardi 12 juillet 2005 Statut Membre Dernière intervention 17 juillet 2010
23 mai 2010 à 07:24
Salut,
Le problème vient du mot clef static qui apparaît partout alors qu'il devrait apparaître le moins possible si on veut réellement faire de l'objet (sur la méthode main, sur des constantes comme Math.PI, sur des méthodes travaillant uniquement sur leurs arguments sans lien avec un objet comme Math.floor par exemple, etc).
Lorsque tu utilise le mot clef statique, une variable ou une méthode n'est pas une variable d'instance mais une variable de classe.
C'est a dire qu'il n'y a qu'une seule variable pour tous les objets implémentant cette classe. Alors que sans ce mot, chaque que tu cree une nouvelle instance, cette instance possède sa propre variable indépendante.
3
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
23 mai 2010 à 08:11
Salut,

Oui le mot clé static n'est surtout pas à utiliser si tu peux t'en passer : sa durée de vie est celle du programme, et elle est partagée entre toutes les instances de classe ! Si tu la modifié dans une classe, c'est impacté dans toutes les classes.

Le mot clé static (sur une variable membre de classe) ne devrait être utilisé que dans des cas très précis, tel que des compteurs d'instance de classe par exemple, et ne devrait être manipulés qu'à l'intérieur même de la classe, et uniquement dans des fonctions elles-aussi statiques, sinon c'est le bordel...
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
3
edouard333 Messages postés 62 Date d'inscription samedi 23 décembre 2000 Statut Membre Dernière intervention 18 décembre 2011 1
27 mai 2010 à 22:30
Merci beaucoup, j'ai comprit le probléme, c'était bien l'histoire des "static".

Si je fais:
Fichier: nom 'Batiments' et j'y mais tout mes objets bâtiments avec "static" et "public" et qu'après j'appelle la class 'Batiments' en static, est-ce que c'est bon? Du sens, oui ça marche, mais est-ce qu'il y a moins que se soit plus simple/une alternative?
0
cs_Kysic Messages postés 332 Date d'inscription mardi 12 juillet 2005 Statut Membre Dernière intervention 17 juillet 2010
27 mai 2010 à 23:28
Je comprends pas bien mais il ne me semble pas que ce soit bon.
Pourquoi vouloir utiliser des objets statics ? Qui plus est dans une classe qui plus est dans une classe mère dont les attributs statics ne seront donc pas hérité.

Pourquoi vouloir faire cela, comme alternative à quoi ?

Si le problème d'accéder à une méthode non statique d'une classe depuis une autre classe il faut utiliser donner une classe en référence à l'autre.

exemple juste pour donner une idée de ce qui peut être fait, ce n'est pas forcement comme cela qu'il faut faire :

Terrain terrain = new Terrain();
Ressource bois = new Resource("bois");
Ressource pierre = new Resource("pierre");
Academie academie = new Accademie(terrain);
academie.construire(bois, pierre)

et dans la classe academie :
public class Academie {
private static final int COUT_BOIS = 100;
private static final int COUT_PIERRE = 150;
private Terrain terrain;
public Academie(Terrain terrain) {
this.terrain = terrain;
}
public constuire(Ressource bois, Ressource pierre) {
bois.enlever(COUT_BOIS);
pierre.enlever(COUT_PIERRE);
terrain.ajouter(this);
}
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
edouard333 Messages postés 62 Date d'inscription samedi 23 décembre 2000 Statut Membre Dernière intervention 18 décembre 2011 1
30 mai 2010 à 11:37
En fait, je fait un jeu et le fichier "T" n'est là que pour tester chaque fichier ressources et batiment. Donc normal s'il n'y a qu'un fichier. Mais je pense que je suis un peu tordu , juste un peu. Mais il faut dire que je connais java que depuis 2 ou 3 ans, plutot 2.
0
Rejoignez-nous