# Java von Kopf bis Fuß: Ratespiel-Problem



## ilp (22. Nov 2011)

Hallo Forum,

ich habe den Code (Ratespiel, S. 38-40) aus dem Beispiel aus dem Buch Java von Kopf bis Fuß abgetippt.
Dafür nutze ich eclipse.

Leider komt statt der gewollten Ausgabe eine lange Fehlermeldeung. 
Außerdem stehen 7 Fehlermeldungen neben dem Code:

--------
The public type Ratespiel must be defined in its own file

zahl cannot be resolved or is not a field

The public type Spieler must be defined in its own file

zahl cannot be resolved to a variable
--------

Einige davon zwei oder drei mal.

In der Anleitung steht auch was von drei .class Dateien, die man wahrscheinlich anlegen muss. Wie bekomme ich das in eclipse geregelt?



Wäre für eure Hilfe sehr dankbar.

Vielen Dank im Vorraus

ilp


----------



## TKausL (22. Nov 2011)

Posten von Quelltext wäre hilfreich.


----------



## Noctarius (22. Nov 2011)

Ratespiel gehört in ein File namens Ratespiel.java (also in Eclipse eine Klasse namens Ratespiel), sagt auch die Fehlermeldung.


----------



## ilp (22. Nov 2011)

```
public class Ratespiel {
	
	Spieler s1;
	Spieler s2;
	Spieler s3;
	
	
	
	public void starteSpiel() {
		
		s1 = new Spieler();
		s2 = new Spieler();
		s3 = new Spieler();


		int tipp1 = 0;
		int tipp2 = 0;
		int tipp3 = 0;
		
		
		boolean s1hatRecht = false;
		boolean s2hatRecht = false;
		boolean s3hatRecht = false;
		
		
		int zielZahl = (int) (Math.random() * 10);
		System.out.println("Ich denke mir eine Zahl zwischen 1 und 9 aus ...");
		
		
		
		while(true) {
			
			System.out.println("Die zu ratende Zahl ist " + zielZahl);
			
			s1.raten();
			s2.raten();
			s3.raten();
			
			tipp1 = s1.zahl;
			System.out.println("Spieler eins tippte " + tipp1);
			
			tipp2 = s2.zahl;
			System.out.println("Spieler zwei tippte " + tipp2);
			
			tipp3 = s3.zahl;
			System.out.println("Spieler drei tippte " + tipp3);
			
			
			
			if(tipp1 == zielZahl) {
				s1hatRecht = true;	
			}
			
			if(tipp2 == zielZahl) {
				s2hatRecht = true;
			}
			
			if(tipp3 == zielZahl) {
				s3hatRecht = true;
			}
			
			
			
			
			if(s1hatRecht || s2hatRecht || s3hatRecht) {
				
				System.out.println("Wir haben einen Gewinner!");
				System.out.println("Spieler eins hat richtig geraten? " + s1hatRecht);
				System.out.println("Spieler zwei hat richtig geraten? " + s2hatRecht);
				System.out.println("Spieler drei hat richtig geraten? " + s3hatRecht);
				System.out.println("Das Spiel ist aus.");
				break;
				
				
			} else {
				
				System.out.println("Die Spieler müssen es erneut versuchen.");
				
			}
			
		}
			
	}	

}




public class Spieler {
	int Zahl = 0;


public void raten() {
	zahl = (int) (Math.random() * 10);
	System.out.println("Ich tippe auf die Zahl: "+ zahl);
	}

}


public class SpielStarter {

	public static void main(String[] args) {
		
		Ratespiel spiel = new Ratespiel();
		spiel.starteSpiel();

		
			}
		}
```

Das ist der Quelltext.


----------



## TKausL (22. Nov 2011)

Dann merk dir direkt mal,

class [X] {

}

gehört immer in [X].java
[X] ist hierbei ein platzhalter.

public class Ratespiel also in Ratespiel.java usw.


----------



## ilp (22. Nov 2011)

also muss ich "public class RateSpiel" und "public class Spieler" aus dem Code entfernen und jeweils als extra .java Datei abspeichern??


----------



## TKausL (22. Nov 2011)

Ja, aber nicht nur den Header "public class XXXX" sondern auch den Codeblock der dann folgt.


----------



## ilp (22. Nov 2011)

Vielen Dank nochmal, dachte erst funktioniert auch nicht, dann habe ich entdeckt, dass ich "int Zahl" geschrieben habe, diese Variable aber immer als "zahl" angesprochen :toll:


----------



## greg1982 (8. Dez 2013)

Hallo zusammen,

ich habe auch das Problem. Ich weiß einfach nicht was in welche Datei gehört und in dem Buch ist es auch nicht beschrieben.

Hat vielleicht jmd von euch dieses Ratespiel, so das es direkt funktioniert? Ich sitze seit 2 Stunden daran und komme nicht weiter und eine Hilfe im Buch gibt es auch nicht...so bringt mir das Ganze leider nichts.

Wäre super, wenn mir jemand mal dieses Code zur Verfügung stellen könnte bevor ich mich hier erschieße 

Danke

Greg


----------



## Tiding (8. Dez 2013)

Was meinst du jetzt?

Verschiedene Klassen mit den Namen X gehören in verschiedene Javadateinen mit den Namen X.Java, wie oben schonmal geschrieben wurde .


----------



## greg1982 (8. Dez 2013)

Wie sieht denn das ganze Projekt dann aus?


----------



## Phoenixz (8. Dez 2013)

Also hab selber das Buch hier liegen (aber habs schon durch ).
Falls du jetzt Eclipse verwendest mach bitte folgendes:
1. Du legst ein neues Projekt im Package Explorer (linke Spalte) an. Dafür gehst du oben auf File -> New -> Java Project. Dem gibts du z.B. den Namen "Ratespielprojekt".
2. Du legst in diesem Projekt im Unterordner "src" 3 neue Klassen an mit den Namen: "Spieler", "Ratespiel", "SpielStarter" (ohne die ").
3. In diese Klassen schreibst du dann den gewünschten Quelltext aus dem Buch hinein.
4. Jetzt noch alles compilieren und dann den Spielstarter ausführen bzw. Run drücken.

Jetzt sollte alles funktionieren. Beim Abtippen auf Tippfehler achten, ist mir auch ab und zu passiert.
Falls nicht, poste bitte deine Fehlermeldungen hier. Du brauchst keinen weiteren Quellcode außer den aus dem Buch!


----------



## ARadauer (8. Dez 2013)

Jede klasse gehört in eine eigene datei


----------



## greg1982 (9. Dez 2013)

Vielen lieben Dank an euch...natürlich ganz besonders dir Phoenixz.
Nun klappt alles  Kann mich nur bedanken....


----------



## Phoenixz (9. Dez 2013)

Kein Problem 
Ich bin froh wenn ich auch mal helfen kann und mir nicht immer geholfen werden muss :toll:


----------



## NgC (22. Sep 2014)

Servus allerseits !

Ich habe zu dem, auf Seite eins, geposteten Quellcode eine Verständnisfrage.

Weshalb wird die while Schleife auf true gesetzt? Ich denke mal, dass sich das true auf
s1hatRecht = false; bezieht. Es wird jedoch erst innerhalb der Schleife eine Mehtode zum generieren der zu eratenden Zahlen aufgerufen, nämlich s1.raten();, diese sorgt ja dafür, dass automatisch eine Zahl generiert wird welche der verlangten entsprechenkann. Für mein Verständnis müsste die Schleife also so lange außer acht gelassen werden bis die Bedingung true eintritt, was ja theoretisch erst durch die while Schleife geschieht, wie aber soll beim Programmablauf jemals die while Schleife durchloffen werden ???:L?

Würde mich über eine Antwort freuen, da ich mich für Java interessiere, aber irgendwie nicht so recht warm mit der Programmiersprache werde.

Falls dieser Post an falscher Stelle steht, möchte ich mich entschuldigen. Ich bin bis jetzt nicht allzu oft in Foren tätig gewesen, sondern war/bin eher ein stummer Leser...


----------



## Joose (22. Sep 2014)

"while(true)" sind unsaubere Endlosschleifen, die eigentlich nicht verwendet werden sollten (von irgendwelchen Dummy Tests mal absgehen). Es ist immer besser eine richtige Abbruchbedingung zu definieren.


----------



## NgC (22. Sep 2014)

Wow, das ging ja wirklich schnell !

Vielen Dank für deine Antwort, so lernt man dazu.

Jedoch frage ich mich noch immer, wieso die Schleife durchlaufen wird? Oder ist es tatsächlich so,
dass die Schleife immer durchlaufen wird weil halt die Bedingung auf "true" gesetzt wurde, und dies keine wirkliche Testbedingung darstellt?

Nochmals vielen Dank Joose!


----------



## Joose (22. Sep 2014)

NgC hat gesagt.:


> Jedoch frage ich mich noch immer, wieso die Schleife durchlaufen wird?



Die Schleife wird dann durchlaufen wenn die Bedingung der Schleife erfüllt ist (== true). Da aber direkt als "Bedingung" "true" gesetzt wird ist die Bedingung immer und ewig erfüllt. Somit wird die Schleife immer durchlaufen.


----------



## NgC (25. Sep 2014)

Merci ...


----------



## Ice (27. Sep 2014)

wenn deine Klasse Ratespiel heißt, dann muss die Datei Ratespiel.java heißen!


----------

