edouard333
Messages postés62Date d'inscriptionsamedi 23 décembre 2000StatutMembreDernière intervention18 décembre 2011
-
23 mai 2010 à 00:10
edouard333
Messages postés62Date d'inscriptionsamedi 23 décembre 2000StatutMembreDernière intervention18 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());
//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 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();
//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+"'";
//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();
//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;
}
}
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+"'";
cs_Kysic
Messages postés332Date d'inscriptionmardi 12 juillet 2005StatutMembreDernière intervention17 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.
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 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
edouard333
Messages postés62Date d'inscriptionsamedi 23 décembre 2000StatutMembreDernière intervention18 décembre 20111 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?
cs_Kysic
Messages postés332Date d'inscriptionmardi 12 juillet 2005StatutMembreDernière intervention17 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);
}
}
Vous n’avez pas trouvé la réponse que vous recherchez ?
edouard333
Messages postés62Date d'inscriptionsamedi 23 décembre 2000StatutMembreDernière intervention18 décembre 20111 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.