Gültigkeitsbereiche von Objektvariablen

Status
Nicht offen für weitere Antworten.
C

c4lzone

Gast
Das ganze ist etwas komplizierter bei mir . aus meinem JavaBUch wurde ich leider nicht schlau

Ich habe eine Klasse als Instanzvorlage :

class Spieler {}

Aus der erschaffe ich in der Klasse class Spielbrett{} zwei Instanzen

class Spielbrett{}
hier habe ich mehere verschachtlete MEthoden die jeweils die nächste aufrufen

meth1
hier werden die zwei Spielerinstanzen in einen Vektor verschoben vector spielerverzeichnis

wird aus meth1 aufgerufen :meth2
in einer if verzweigung werden in abhängigkeit anderer Variablen die obigen zwei Instanzen mit anderen vertauscht d.h. selbst heist jetzt spieler oder bank , und die andere ebenso

weiter unten wird in meth2 eine weitere meth3 aus einer anderen Klasse aufgerufen und in dieser meth3 wird auf die
spieler objektvariable zugegriffen- was nicht funktioniert sondern mit einer Fehlermeldung bestraft wird , symbol not found

Kann mir jmd . sagen warum?
 
B

Beni

Gast
Vielleicht wars nur ein Schreibfehler... Ich verstehe leider überhaupt nicht wie das funktioniert, poste doch den Quellcode; das ist einfacher :wink:

P.S. und kürze ihn soweit zusammen, dass nur das Wichtige ersichtlich ist.
 
G

Guest

Gast
:) oki dok , glaub zwar nicht das das ne gute Idee ist aber gut

das ist mein erstes längeres Programm, deswegen bitte ich um Noobnachsicht

also ich krieg nach dem ich die erste Fehlerwelle abgeschmettert hatte ( waren grad mal 20) , jetzt 100
12 hab ich schon weg , bei dem Fehler in Zeile 524 krieg ich Probleme weil ich nicht weis wieso der die Spielervariable nicht finden kann

Code:
import java.util.*;


class Spielkarte{
	char farbe;
	char ziffer;

	Spielkarte(char farbe,char ziffer){
	this.farbe = farbe;
	this.ziffer = ziffer;
	}
	
	Spielkarte(){}
	
	
}

class siebuvier{
	
	
	
	public static void main(String[] args){
		
		Spielbrett.neuesSpiel();

		
		
	}
}

class Spielbrett{
	static int grundeinsatz; 
	static boolean neuesspiel = false;
	Spieler selbst = new Spieler();
	Spieler pc = new Spieler();
	static Vector<Spieler> spielerverzeichnis = new Vector<Spieler>();
	Spieler bank = new Spieler();
	Spieler spieler = new Spieler();

	static int pot; 
		

	static Stack <Spielkarte> ziehstapel = new Stack <Spielkarte>();
	




	static void neuesSpiel(){
		spielerverzeichnis.addElement(selbst);
		spielerverzeichnis.addElement(pc);
		neuesspiel= true;
		selbst.geld= selbst.anfangsgeld;
		pc.geld = pc.anfangsgeld;
		neuesBuch();
			
	}		


	static void neuesBuch(){
			
			Kartenstapel.erschaffeNeuenZiehstapel();

			if (!neuesspiel){
				if (bank == pc) {
					spielerverzeichnis(selbst).nimmtGeldAusPot(pot);
					spieler = pc;
					bank = selbst;
				}
				else {
					spieler.nimmtGeldAusPot();
					bank = pc;
					spieler = selbst;
				}
			}	
			else{
				boolean antwort = DosMenue.werMachtBank();
				if (antwort){
					bank = selbst;
					spieler = pc;
				}
				else{
					bank = pc;
					spieler = selbst;
				}
				
			}

			DosMenue.frageHoeheGrundEinsatz();
			ziehstapel.erschaffeNeuenZiehStapel();
			
			for (int i = 0; i < spielerverzeichnis.size();i++){
				spielerverzeichnis.get(i).gibAlleKartenZurueck();
			}
			neuesspiel =true;
			neueRunde();
	}
			
			
	static void neueRunde(){
		
		neuesspiel = false;
		spieler.gesamteinsatz = 0; 
		spieler.einsatz = 0; 
		for(int i = 0; i < spielerverzeichnis.size(); i++){
			spielerverzeichnis.get(i).gibAlleKartenZurueck();
		}
		bank.legtGeldInPot(grundeinsatz);
		bank.ziehtKarte();
		spieler.legtGeldInPot(grundeinsatz);
		if(DosMenue.frageEinsatzErhoehen()){
			spieler.legtGeldInPot(einsatz);
			spieler.gesamteinsatz =+einsatz;
		}
		spieler.ziehtKarte();
		
			while(DosMenue.frageWeitereKarte()){
				spielerErhaeltWeitereKarte();
			}
		bank.ziehtKarte();
		if(bank.festellenGewonnen())
			neueRunde();
		while(DosMenue.frageWeitereKarte()){
			bankErhaeltWeitereKarte();
		}
	}
			
					
				


	static void bankErhaeltWeitereKarte(){
		bank.ziehtKarte();
		if(bank.feststellenGewonnen())
			neueRunde();
		if(bank.feststellenVerloren()){
			spieler.nimmtGeldAusPot(gesamteinsatz);
			neueRunde();}
	}





	static void spielerErhaeltWeitereKarte(){	
		if(DosMenue.frageEinsatzErhoehen()){
			spieler.legtGeldInPot(einsatz);
			spieler.gesamteinsatz =+ einsatz;}
		
						
		spieler.ziehtKarte();
		if(spieler.feststellenGewonnen()){
			spieler.nimmtGeldAusPot(spieler.gesamteinsatz);
			neueRunde();}
		if(spieler.feststellenVerloren()){
			neueRunde();
		}
	}
				
		
					
		
				
}
		
	





class Kartenstapel{


	static Random rand = new Random();
	static Vector<Spielkarte> vorlagestapel = new Vector<Spielkarte>();
	
	static Vector<Integer> zufallszahlspeicher = new Vector<Integer>();
	




	static void erschaffeNeuenZiehstapel(){
		
		Spielkarte kreuzass = new Spielkarte('x','a');
		Spielkarte kreuzkoenig = new Spielkarte ('x','k');
		Spielkarte kreuzdame = new Spielkarte ('x','d');
		Spielkarte kreuzbube = new Spielkarte ('x','b');
		Spielkarte kreuzzehn = new Spielkarte ('x','x');
		Spielkarte kreuzneun = new Spielkarte ('x','9');
		Spielkarte kreuzacht = new Spielkarte ('x','8');
		Spielkarte kreuzsieben = new Spielkarte ('x','7');


		Spielkarte pikass = new Spielkarte('p','a');
		Spielkarte pikkoenig = new Spielkarte ('p','k');
		Spielkarte pikdame = new Spielkarte ('p', 'd');
		Spielkarte pikbube = new Spielkarte ('p', 'b');
		Spielkarte pikzehn = new Spielkarte ('p','x');
		Spielkarte pikneun = new Spielkarte ('p','9');
		Spielkarte pikacht = new Spielkarte ('p','8');
		Spielkarte piksieben = new Spielkarte('p','7');
		
		Spielkarte herzass = new Spielkarte ('h','a');
		Spielkarte herzkoenig = new Spielkarte('h', 'k');
		Spielkarte herzdame = new Spielkarte ('h','d');
		Spielkarte herzbube = new Spielkarte ('h', 'b');
		Spielkarte herzzehn = new Spielkarte ('h','x');
		Spielkarte herzneun = new Spielkarte ('h','9');
		Spielkarte herzacht = new Spielkarte ('h','8');
		Spielkarte herzsieben = new Spielkarte ('h','7');

		Spielkarte karoass = new Spielkarte('k','a');
		Spielkarte karokoenig = new Spielkarte ('k', 'k');
		Spielkarte karodame = new Spielkarte ('k', 'd');
		Spielkarte karobube = new Spielkarte ('k', 'b');
		Spielkarte karozehn = new Spielkarte ('k', 'x');
		Spielkarte karoneun = new Spielkarte ('k','9');
		Spielkarte karoacht = new Spielkarte ('k','8');
		Spielkarte karosieben = new Spielkarte ('k', '7');

		vorlagestapel.add(kreuzass);
		vorlagestapel.add(kreuzkoenig);
		vorlagestapel.add(kreuzdame);
		vorlagestapel.add(kreuzbube);
		vorlagestapel.add(kreuzzehn);
		vorlagestapel.add(kreuzneun);
		vorlagestapel.add(kreuzacht);
		vorlagestapel.add(kreuzsieben);


		vorlagestapel.add(pikass);
		vorlagestapel.add(pikkoenig);
		vorlagestapel.add(pikdame);
		vorlagestapel.add(pikbube);
		vorlagestapel.add(pikzehn);
		vorlagestapel.add(pikneun);
		vorlagestapel.add(pikacht);
		vorlagestapel.add(piksieben);
		
		vorlagestapel.add(herzass);
		vorlagestapel.add(herzkoenig);
		vorlagestapel.add(herzdame);
		vorlagestapel.add(herzbube);
		vorlagestapel.add(herzzehn);
		vorlagestapel.add(herzneun);
		vorlagestapel.add(herzacht);
		vorlagestapel.add(herzsieben);
		
		vorlagestapel.add(karoass);
		vorlagestapel.add(karokoenig);
		vorlagestapel.add(karodame);
		vorlagestapel.add(karobube);
		vorlagestapel.add(karozehn);
		vorlagestapel.add(karoneun);
		vorlagestapel.add(karoacht);
		vorlagestapel.add(karosieben);

		int zufallszahl = 0;
		
		for (int i= 1 ; i <33;i++){
			zufallszahl = zufallsZahl0Bis31();
			if(Spielbrett.zufallszahlspeicher.contains(new Integer(zufallszahl))){
				while (Spielbrett.zufallszahlspeicher.contains(new Integer(zufallszahl))){
					zufallszahl= zufallsZahl0Bis31();
				}

			}
		
			ziehstapel.push(vorlagestapel.get(zufallszahl));
			Kartenstapel.zufallszahlspeicher.addElement(new Integer(zufallszahl));
		}	
		
	}


		static void gibKartenStapelAus(Vector<Spielkarte> v){
				for(int i=0; i<v.size();i++){
				System.out.println(v.get(i).farbe + " "+v.get(i).ziffer);
				}
		}



		static int zufallsZahl0Bis31(){
			int zahl = rand.nextInt((31-0+1)+0);
			//Spielbrett.intWertAusgeben(zahl);
			return zahl;	
		}



		static void intWertAusgeben(int zahl){
			System.out.println("Der Wert ist :" +  zahl);
		}


	
		static void vectorAusgeben(Vector<Spielkarte> v,int pos){
			System.out.println(" GIB Karte an Position "+pos +"an");
			System.out.println(v.get(pos).farbe +" "+ v.get(pos).ziffer);
		}	
		
		static void ziehStapelAusgeben(){
			Vector<Spielkarte> zwischenstapel = new Vector<Spielkarte>();
			
			for(int i = 0; i < 32;i++){
				zwischenstapel.add(ziehstapel.pop());
				System.out.println(zwischenstapel.get(i).farbe+" "+zwischenstapel.get(i).ziffer);
			}
			
			for (int i = 0 ; i < 32 ; i++){
				ziehstapel.push(zwischenstapel.get(i));
			}
		}


}
	
class Spieler{
	
	int einsatz;
	int gesamteinsatz;
	int geld;
	final int anfangsgeld = 500;
	Vector<Spielkarte> handkarten = new Vector<Spielkarte>();
	boolean bankbesitz = false;


	void ziehtKarte(){
		if (Spielbrett.ziehstapel == 1)
			Spielbrett.neuesBuch();

		handstapel.add(Spielbrett.ziehstapel.pop());	
	}
	
	void gibtAlleKartenZurueck(){
		handstapel.removeAllElements();
		handstapel.trimToSize();
	}
	
	void legtGeldInPot(int geld){
		pot =+ geld;
		this.geld =- geld;
	}
	
	void nimmtGeldAusPot(int geld){
		pot =- geld;
		this.geld =+ geld;
	}
	
	
	void errechneGrundEinsatzPc(){
		zufallszahl = Kartenstapel.rand.nextInt((1-5+1)+1);
		switch (zufallszahl){
			case 1:	Spielbrett.grundeinsatz = 10;
				break;
			case 2: Spielbrett.grundeinsatz = 25; 
				break;
			case 3: Spielbrett.grundeinsatz = 35; 
				break;
			case 4: Spielbrett.grundeinsatz = 40; 
				break; 
			case 5: Spielbrett.grundeinsatz = 50; 
				break;
		}
	}		



	void grundEinsatzFestlegenPc(){	
		errechneGrundEinsatzPc();
		for (int i= 0;i<spielerverzeichnis.size();i++){
			while (grundeinsatz > spielerverzeichnis.get(i).geld){
				errechneGrundEinsatzPc();
			}
		}
	
	}
	


	boolean feststellenGewonnen(){
		byte fuenfbilder = 0; 
		boolean zweiasse = false;
		int punkte = 0; 
		for(int i = 0; i < handkarten.size(); i++){			
			char tempziffer= ' ';
			tempziffer = handkarten.get(i).ziffer;
			switch(tempziffer){
				case 'a': punkte =+ 11;
				if (zweiasse == true )
					return true;
				if (i <3)
					zweiasse = true;
					break;
				case 'k': punkte =+ 4;
						fuenfbilder =+1;
						break;
				case 'd': punkte =+ 3;
						fuenfbilder =+1;
						break;
				case 'b': punkte =+ 2;
						fuenfbilder =+1;
						break;
				case 'x': punkte =+ 10;
						break;
				case '9': punkte =+9;
						break;
				case '8': punkte =+ 8;
						break;
				case '7': punkte =+ 7;
						break;
			}
			
		if (punkte == 21 ) 
			return true;

		else if(handkarten.size() == 5 && fuenfbilder == 5) 
			return true;
		else
			return false;
		}
	}
	

	boolean feststellenVerloren(){
		char tempziffer =' ';
		int punkte =0; 
		for(int i = 0; i < handkarten.size(); i++){
			 tempziffer = handkarten.get(i).ziffer;				
			switch(tempziffer){
				case 'a': punkte =+ 11;
					break;
				case 'k': punkte =+ 4;
						fuenfbilder =+1;
						break;
				case 'd': punkte =+ 3;
						fuenfbilder =+1;
						break;
				case 'b': punkte =+ 2;
						fuenfbilder =+1;
						break;
				case 'x': punkte =+ 10;
						break;
				case '9': punkte =+9;
						break;
				case '8': punkte =+ 8;
						break;
				case '7': punkte =+ 7;
						break;
			}
		}
		if(punkte > 21) 
			return true; 
		else 
			return false; 
	}
}


class DosMenue{
	static char auswahl;
	static String eingabe; 
	static BufferedReader buff = new BufferedReader(new InputStreamReader(System.in));
	



	static boolean werMachtBank(){
		System.out.println("Wollen sie als erstes die Bank machen ?....................................<j/n>"); 
		try{
		eingabe = buff.readLine();
		char temp = eingabe.charAt(0); 		
		switch (temp){
			case 'j':	return true;
			case 'n': 	return false;
		}
		}catch(Exception e){
			System.out.println("Sie muessen 'j' oder 'n' eingeben !");
			werMachtBank();
		}
		
	}

	
	static int frageHoeheGrundEinsatz(){
		if (bank == selbst){
			System.out.println ("Wie hoch soll der Grundeinsatz sein? (höchstens 50 sind erlaubt).........<5-50>");
			try{
			eingabe = buff.readLine();
			Spielbrett.grundeinsatz = Integer.parseInt(eingabe);
			}catch(Exception e){
				System.out.println("Sie muessen eine Zahl zwischen 5 und 50 eingeben !");
				frageHoheGrundEinsatz();
			}
			if(Spielbrett.grundeinsatz < 5 || Spielbrett.grundeinsatz > 50){
				System.out.println("Der Grundeinsatz muss zwischen 5 und 50 liegen !");
				frageHoeheGrundEinsatz();	
			}
		}
	
		else 
			pc.grundEinsatzFestlegenPc();
	}

	static boolean frageEinsatzErhoehen(){
		//selbst wird nach Hoehe des Einsatzes gefragt , Pc kann Einsatz nicht erhoehen 		

			
		if(spieler == selbst){
			System.out.println("Wollen Sie den Einsatz erhöhen ?...........................................<j/n>");
			try{
			eingabe = buff.readLine();
			auswahl = eingabe.charAt(0);
			}catch(Exception e){
				System.out.println("Sie muessen 'j' oder 'n' eingeben");
				frageEinsatzErhoehen();}
			switch(auswahl){
				case 'j': System.out.println("Um wieviel wollen sie ihren Einsatz erhoehen?............<summe>?");
					System.out.println("Sie können höchstens auf "+ Spielbrett.pot+"gehen.");
					eingabe = buff.readLine();
					spieler.einsatz = Integer.parseInt(eingabe);
					return true;
					break;
				case 'n': return false;
			}
		}
		else {
			return false;
		}
	}


	static boolean frageWeitereKarte(){
			System.out.println("Wollen Sie eine weitere Karte ? ...............<j/n>");
			try{
			eingabe = buff.readLine();
			auswahl =  eingabe.charAt(0);
			}catch(Exception e){
				System.out.println("Sie muessen 'j' oder 'n' eingeben !");
			}
			switch(auswahl){
				case 'j': return true;
						break;
				case 'n': return false;				
						break;
			}
	}
}
 
B

Beni

Gast
Ok, für zukünftige Programme: Quellcode schreiben, und wenn ein Fehler auftritt den Fehler gleich korrigieren, und nicht aufschieben bis in Sankt-Nimmerlein-Tag.

Ein ziemlich grosses Problem kommt von all deinen statics. Sie erzeugen die knapp 40 Fehler "Cannot make a static reference to the non-static field ...". Statische Variablen haben schon einen Sinn, aber versuch mal am Anfang ohne sie auszukommen. Erstell in der Main-Methode eine Instanz deines Spielbretts ("new Spielbrett()") und entferne all die statics in Spielbrett.

Arbeite mit Referenzen, ein kleiner Ausschnitt wie der Spieler aussehen könnte:
Code:
   Spielbrett brett;
   public Spieler( Spielbrett brett ){
       this.brett = brett;
   }

   void ziehtKarte(){
      if (brett.ziehstapel.isEmpty())
         brett.neuesBuch();

      handkarten.add(brett.ziehstapel.pop());   
   }
Erstellt wird ein Spieler dann mit
Code:
Spielbrett brett = ... // das wurde schon früher hergestellt
Spieler spieler = new Spieler( brett );
Ab jetzt kennt der Spieler sein Brett und kann irgendwelche Zugriffe machen.

Dann gibt es halt viele Fehler wenn du irgendwelche Variablen oder Methoden benutzt, welche niergends definiert wurden.

Die Methode aus Spieler schreit noch nach Erklärung:
Code:
   void legtGeldInPot(int geld){
      pot += geld;
      this.geld -= geld;
   }
Was ist "pot"? Spieler kennt keine Variable "pot", denn die wurde nie in Spieler definiert. "pot" ist in Spielbrett definiert, und so kennt auch nur das Spielbrett den "pot". Wer jedoch das Spielbrett kennt, kann "pot" abfragen.

Eine Lösung könnte so aussehen:
Code:
   void legtGeldInPot(int geld){
      brett.pot += geld;
      this.geld -= geld;
   }

(Achja: += meinst du, =+ hat eine andere Wirkung: "this.geld =+ geld" ist "this.geld = (+geld)" was "this.geld = geld" ist.)

Die Unterteilung in verschiedene Klassen ist dir gut gelungen, ich bin mir aber nicht sicher, ob du auf dem aktuellen Code weiterbauen solltest. Ich würde dir empfehlen, nocheinmal von vorne zu beginnen, aber jetzt kennst du die Fehler, und kannst sie umgehen (sogar Profis arbeiten so, nur nennen sie das erste Programm dann "Prototyp" :wink: ).
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben