Problem bei Javaprogrammierung (anfänger)

javabeginnerxxl

Neuling
Thread Starter
Mitglied seit
10.08.2010
Beiträge
3
Hi leute ich hab mir vor kurzem das Buch "Java von Kopf bis Fuss" gekauft. Ich bin jetzt bei Kapitel 2 angelangt wo es darum geht OO zu benutzen. dann gab es noch ein Beispiel einer Anwendung die ich eins zu eins abgeschrieben habe. Es gibt in dieser Anwendung 3 Klassen und vor denen muss man immer schreiben "public" (so stehts zumindest im Buch") wenn ich aber dann kompilieren will steht dass ich 2 Fehler habe. ven ich die Wörter "public" bei den zwei nicht main klassen lösche, dann lässt es sich kompilieren aber dann steht in der ausgabe iwie nichts :-/
könnt ihr mir helfen? danke schon im foraus. Hier ist der Code:

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 0 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();

}

}
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Quellcode bitte mit (Code)(/Code) hier reinkopieren. Dann geht die Tabstopformatierung nicht verloren.

So nun zu deinem eigentlichen Problem. Gib mal den anderen beiden Klassen ebenfalls eine Main Methode mit einer sysout. Es ist gut möglich, dass deine Entwicklungsumgebung sich einfach zu blöd anstellt und garnicht mit der von dir gewünschten Main Methode beginnt.
 
ok, heisst das ich muss immer nach der Klasse noch
public static void main (String[] args) {
...
}
nach der klasse schreiben?
das hab ich jetzt mal gemacht doch jetzt zeigt er mir hier Fehler:
public void starteSpiel()
^ ^ ^
und bei public void raten an den selben Stellen (oberhalb der pfeile)
 
Ich hab mir deinen Code nur kurz angeschaut weil es wirklich etwas zu anstrengend ist den ohne code bereich zu lesen.
Ich bin selbst noch eher Programmierneuling und progge mehr in C und C++ aber einige Sachen an deinem Code sind mir aufgefallen..
Soweit mir bekannt ist verwendet man für jede Klasse eine eigene Datei, die immer den Klassennamen trägt zb public class Spieler {...} sollte in der Datei Spieler.java stehen. Fals der Dateinamen vom Klassennamen unterschiedlich ist, lässt sich das Programm sowieso nicht kompilieren.
Nochmal zur Erklärung was public bedeutet, das scheint dir nicht ganz klar zu sein:
Es gibt 3 Schlüsselwörter für Sichtbarkeit bzw Zugriffsrecht
public -> überall sichtbar, man kann von jeder Klasse aus zugreifen
private - > nur innerhalb der Klasse sichtbar
protected - > veränderbar innerhalb der Klasse und in abgeleiteten Klassen

Ich hab den Code mal schnell selber geschrieben. Das Progamm soll ja ein Spiel starten das eine Random Zahl auswählt und sofern einer von 3 Spieler auf die selbe Zahl kommt die Win Ausgabe ausgeben und sonst die Loss Ausgabe oder?

3 Datein, solltest du einach mit javac Main.java kompilieren können wenn sie sich im selben Ordner befinden. Hab dir in die Comments paar Sachen dazu geschrieben die mir aufgefallen sind.

Main.java
Code:
public class Main {
	public static void main(String argv[]) {
	
		Game g1 = new Game();
		g1.StartGame();
		
	}
}

Player.java
Code:
// Math Klasse importieren
import java.lang.*;

public class Player {
	
	
	public Player() {
		
	}
	
	public double raten() {
		double number;
		double intnumber;
		// Math.random liefert Kommazahl zw. 0 und 1
		// Daher nicht sehr klug hier gleich auf int zu casten
		number = Math.random() * 10;
		// Extravariable intnumber um das Ergennis von Math.random() *10 auf int zu casten
		// in Game.java dasselbe
		intnumber = (int) number;
		return intnumber;
	}
	
	
	
}

Game.java
Code:
// Math Klasse importieren
import java.lang.*;

public class Game {
	
	public Game() {
	
	}
	
	public void StartGame() {
		// 3 Objekte der Klasse Player erstellen (3 Spieler)
		Player p1 = new Player();
		Player p2 = new Player();
		Player p3 = new Player();
		// Boolean sind hier relaliv unnötig, da eine normale 
		// if-Abfrage dasselbe tun würde (if goal == p1n) win..
		boolean p1right = false;
		boolean p2right = false;
		boolean p3right = false;
		
		double goal;
		double intgoal;
		goal = Math.random() * 10;
		
		intgoal = (int) goal;
		System.out.println("Die zu erratende Zahl ist " + intgoal);
	//While hier unnötig
		double p1n = (int) p1.raten() ;
		double p2n = (int) p2.raten() ;
		double p3n = (int) p3.raten() ;
		
		if(p1n == intgoal) p1right=true;
		if(p2n == intgoal) p2right=true;
		if(p3n == intgoal) p3right=true;
	/*
	Dein Orginal Code Ausschnitt
	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;	
	Du hättest hier einen Boolean Wert ausgeben wollen!	
	*/	
		if(p1right || p2right || p3right){
			System.out.println("Wir haben einen Gewinner!");
			System.out.println("Spieler eins hat richtig geraten? " + p1n);
			System.out.println("Spieler zwei hat richtig geraten? " + p2n);
			System.out.println("Spieler drei hat richtig geraten? " + p3n);
			System.out.println("Das Spiel ist aus.");
		} else  System.out.println("Die Spieler muessen es erneut versuchen.");
		
	}
	
	
	
}
 
achso ist das... das gibt sogat sinn denn im Buch sind die einzelnen teile etwas voneinander getrennt, ich wohl was falsch überlegt -.-
vielen vielen Dank ;D
 
Ich ging davon aus, dass das 3 verschiedene Datein sind :d

Nagut dann hast du ja den Fehler gefunden. Ich verwende übrings Eclipse. Da kann man dann jede der 3 Klassen anklicken und jede nochmals unterschiedlich starten. Wird dann recht schnell unübersichtlich.

Kannst die überflüssigen Main Funktionen natürlich wieder rauslöschen.
 
@Paxi
Das mit je Klasse eine Quelldatei stimmt nicht. Hier mal ein Beispiel: Inner Class Example (The Java™ Tutorials > Learning the Java Language > Classes and Objects)
Weiter gibt es 4 Zugriffsmöglichkeiten. Die drei die du aufgezählt hast und zusätzlich die package sichtbarkeit ("Ohne alles").
Zum Beispiel:
Code:
package hwluxx;
class Clazz{
}

Code:
package hwluxx;
class SubClazz extends Clazz {
} // OK!


Code:
package hwl;
class SubClazz extends Clazz {
} // Nicht OK! Nicht im gleichen package.

SubClazz aus hwluxx kann Clazz beerben da im gleichen package. SubClazz aus hwl kann Clazz nicht beerben da nicht im gleichen package.
 
Zuletzt bearbeitet:
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh