Kleines Ratespiel

Status
Nicht offen für weitere Antworten.

r0m

Mitglied
Hallo zusammen,

seit knapp 3 Wochen behandeln wir nun Java in der Schule und es macht einen heiden Spass kleine Programme zu basteln. Leider komme ich bei meinem kleinen "Zahlen-Ratespiel" nicht weiter, da mir die Kompiliermeldung nichts aussagt. Vielleicht könnt ihr mir weiterhelfen.

Folgender Code:
Java:
//Import der Klassen
import java.util.Scanner;

public class Ratespiel {

	public static int einlesen()
	{
		//Instanziierung des Objektes "sc", der Klasse "Scanner"
		Scanner sc = new Scanner(System.in);
		
		//Übergabe des Eingabestroms auf die Variable "eingabe"
		int eingabe = sc.nextInt();
		
		//Rückgabe der Eingegebenen Zahl
		return eingabe;
	}
	
	
	
	public static void main(String[] args)
	{
		//Variablen
		int zufallszahl=5;
		
		//Eingabeaufforderung
		System.out.println("Bitte geben Sie eine Zahl von 0 bis 10 ein.\n");
		
		//Aufruf der Funktion "einlesen()" und Erhalt der Eingegebenen Zahl
		int input = einlesen();
	
		while(input!=zufallszahl){
			System.out.println("Leider falsch. Geben Sie bitte eine Andere ein.\n");
			int input = einlesen();
			
		}
		
		//Text
		System.out.println("Richtig! Spielende.");
		
		}
	}
}



Fehlermeldung beim Kompilieren:
Code:
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 

	at Ratespiel.main(Ratespiel.java:30)


Vielen Dank und Gruß,
Marc
 
Zuletzt bearbeitet:

KrokoDiehl

Top Contributor
Hehe, ist das Ratespiel "Suche den Fehler"? ;)

Die Meldung sagt, dass es einen Compilierfehler gibt, d.h. irgendwo im Code gibt es eine Stelle, die nicht der Java-Syntax entspricht oder ein unbekannter Bezeichner existiert.
Ich tippe auf den Code in der while()-Schleife :)
 

Geeeee

Bekanntes Mitglied
Ich wette wie KrokoDiehl auf die while schleife zeile 33 in kombination mit Zeile 29. Aber ist nur eine ganz vage Behauptung :D
Bzw. der Fehler fand schon vorher statt, da wahrscheinlich copy 'n paste verwendet wurde.
 

r0m

Mitglied
Also ich habe euere Andeutungen auf das "int" was zu viel war verstanden. Danke hierfür.
Werde noch ein paar Kleinigkeiten einbauen (des Lerneffekts wegen).

Viele Grüße,
Marc


Java:
         /**
	 * This little game was programmed and designed by
	 * Marc Gottschling in 2009.
	 * Feel free to play and edit this source. In order so fee my time of programming,
         * please dont remove the copyright-label. Thanks.
	 * 
	 * MG 2009 (c)
	 */

//Import der Klassen
import java.util.Scanner;

//**************************************************************

public class Ratespiel {

	public static int einlesen()
	{
		//Instanziierung des Objektes "sc", der Klasse "Scanner"
		Scanner sc = new Scanner(System.in);
		
		//Übergabe des Eingabestroms auf die Variable "eingabe"
		int eingabe = sc.nextInt();
		
		//Rückgabe der Eingegebenen Zahl
		return eingabe;
	}
	
//**************************************************************

    public static int zufallsZahlFkt(int pMaximum) {
        return  (int) ((Math.random()*pMaximum)+1);
    }
	
//**************************************************************	
	
	public static void main(String[] args)
	{
		//Variablen
		int zufallszahl = zufallsZahlFkt(10);
		int versuche=0;
		
		//Eingabeaufforderung
		System.out.println("Bitte geben Sie eine Zahl von 0 bis 10 ein.\n");
		
		//Aufruf der Funktion "einlesen()" und Erhalt der Eingegebenen Zahl
		int input = einlesen();
	
		while(input!=zufallszahl)
		{
			//Text
			System.out.println("Leider falsch. Geben Sie bitte eine Andere ein.");
			
			//nächste Zahl einlesen
			input = einlesen();
			
			//Versuchszähler
			versuche++;
		}
		
		//Text
		System.out.println("Richtig! Sie haben: " + versuche + " Versuche gebraucht. Spielende.");
		
		//Abbruch des Programms
		System.exit(0);
	}
}

//**************************************************************
 

max40

Bekanntes Mitglied
Nach dem ersten einlesen in Zeile 47 muss
Code:
versuche
hochgezählt werden! Desweitern wird niemals die zahl 0 vorkommen!
 

hdi

Top Contributor
Was du hier besser verwenden solltest ist eine do-while Schleife:

Java:
do{
  input = einlesen();
  versuche++;
} while (input != zufallszahl);

do-while heißt: Es wird auf jeden Fall mindestens 1 mal der do-Bereich ausgefhrt. Erst nach dem ersten Ausführen wird die while-Bedingung getestet, und dann evtl wieder ausgeführt.
 

r0m

Mitglied
@hdi: irgendwie ist da aber ein Fehler in der Do-While schleife beim ausführen! Das erste Mal wenn man ratet, dann checkt er gar nicht ob es die Gesuchte ist oder nicht und er zählt den Zähler nicht hoch. Vielleicht doch eine While-Schleife?

Ansonsten, soweit bin ich jetzt. Was haltet ihr davon, was könnte man noch des Lerneffekts halber reinbauen?

Danke und Gruß



Java:
/**
* MG 2009 (c)
*/

//Import der Klassen
import java.util.Scanner;

public class Ratespiel {

	//EINGABE
	public static int einlesen()
	{
		Scanner sc = new Scanner(System.in);
		int eingabe = sc.nextInt();
		return eingabe;
	}

//**************************************************************		
	
	//ZUFALLSZAHL
    public static int zufallsZahlFkt(int pMax) {
        return  (int) ((Math.random()*pMax)+1);
    }
	
//**************************************************************	
    
    //EINFACHER SCHWIERIGKEITSGRAD
    public static void einfach(){

		int zufallszahl = zufallsZahlFkt(10);
		int versuche=0;
		
		System.out.println("Bitte geben Sie eine Zahl von 1 bis 10 ein.\n");
		int input = einlesen();
		
		do{
			input = einlesen();
			versuche++;
			System.out.println("Leider falsch. Geben Sie bitte eine Andere ein.");
		} while (input != zufallszahl);

		System.out.println("Richtig! Sie haben: " + versuche + " Versuche gebraucht. Spielende.");

		System.exit(0);
    	
    }
    
//**************************************************************
    
    //MITTLERER SCHWIERIGKEITSGRAD
    public static void mittel(){

		int zufallszahl = zufallsZahlFkt(50);
		int versuche=0;
		
		System.out.println("Bitte geben Sie eine Zahl von 1 bis 50 ein.\n");
		int input = einlesen();
		
		do{
			input = einlesen();
			versuche++;
			System.out.println("Leider falsch. Geben Sie bitte eine Andere ein.");
		} while (input != zufallszahl);

		System.out.println("Richtig! Sie haben: " + versuche + " Versuche gebraucht. Spielende.");

		System.exit(0);
    	
    }
    
//**************************************************************
    
    //SCHWERER SCHWIERIGKEITSGRAD
    public static void schwer(){

		int zufallszahl = zufallsZahlFkt(500);
		int versuche=0;
		
		System.out.println("Bitte geben Sie eine Zahl von 1 bis 500 ein.\n");
		int input = einlesen();
		
		do{
			input = einlesen();
			versuche++;
			System.out.println("Leider falsch. Geben Sie bitte eine Andere ein.");
		} while (input != zufallszahl);

		System.out.println("Richtig! Sie haben: " + versuche + " Versuche gebraucht. Spielende.");

		System.exit(0);
    	
    }
    
//**************************************************************
	
	public static void main(String[] args)
	{
		System.out.println("Welche Schwierigkeitsstufe möchten Sie spielen?\n");
		System.out.println("Geben Sie bitte ein:...\n");
		System.out.println("Einfach: 0\nMittel: 1\nSchwer: 2\n");
		int auswahl = einlesen();
		
		switch(auswahl){
			case 0: einfach();
			case 1: mittel();
			case 2: schwer();
			default:
				System.out.println("Falsche eingabe!\n");
				//Ratespiel.main();
		}
	}
}

//**************************************************************
 

hdi

Top Contributor
@hdi: irgendwie ist da aber ein Fehler in der Do-While schleife beim ausführen! Das erste Mal wenn man ratet, dann checkt er gar nicht ob es die Gesuchte ist oder nicht und er zählt den Zähler nicht hoch.
Ja, weil du beim ersten mal 2x einliest. (Du rufst einlesen() schon vor dem do-Block auf, und dann halt nochmal im do-Block) Es sollte so aussehen:

Java:
int zufallszahl = ...;
int input;
int versuch = 0;
System.out.println("Der Computer hat sich eine Zahl ausgedacht. Versuchen Sie, die Zahl zu erraten:");
do{
    if(versuch > 0){
        System.out.println("Leider falsch. Versuchen Sie es noch einmal:");
    }
    input = einlesen(); 
    versuch++;
}
while(input != zufallszahl);
System.out.println("Richtig!");

was könnte man noch des Lerneffekts halber reinbauen?
Eine unnötige Sache ist zB dass du beim Aufruf von einlesen() jedes mal einen neuen Scanner für die Eingabe erzeugst. Initialisiere den nur einmal in der main(), und rufe dann in der einlesen() lediglich ein nextInt() darauf auf.
 

r0m

Mitglied
@hdi: Danke erstmal für den Tipp und die Hilfe.

Bekomme es einfach nicht hin mit dem Scanner. Das hier akzeptiert er nicht:
Java:
public static int einlesen()
	{
		int eingabe = 0;
		[B]int eingabe = sc.nextInt();[/B]
		return eingabe;
	}


Folgender Fehler kommt dann immer:
Code:
Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
	Duplicate local variable eingabe
	sc cannot be resolved

	at Ratespiel.einlesen(Ratespiel.java:9)
	at Ratespiel.main(Ratespiel.java:83)




Und hier nochmal der gesamte Code:
Java:
import java.util.Scanner;

public class Ratespiel
{

	public static int einlesen()
	{
		int eingabe = 0;
		int eingabe = sc.nextInt();
		return eingabe;
	}

    public static int zufallsZahlFkt(int pMax) {
        return  (int) ((Math.random()*pMax)+1);
    }

    public static void einfach(){

		int zufallszahl = zufallsZahlFkt(10);
		int versuche=0;
		int input=0;
		
		do{
			input = einlesen();
			versuche++;
			System.out.println("Leider falsch. Geben Sie bitte eine Andere Zahl ein.");
		} while (input != zufallszahl);

		System.out.println("Richtig! Sie haben: " + versuche + " Versuche gebraucht. Spielende.");

		System.exit(0);
    	
    }
    
    public static void mittel(){

		int zufallszahl = zufallsZahlFkt(50);
		int versuche=0;
		int input=0;
		
		do{
			input = einlesen();
			versuche++;
			System.out.println("Leider falsch. Geben Sie bitte eine Andere Zahl ein.");
		} while (input != zufallszahl);

		System.out.println("Richtig! Sie haben: " + versuche + " Versuche gebraucht. Spielende.");

		System.exit(0);
    	
    }
    
    public static void schwer(){

		int zufallszahl = zufallsZahlFkt(500);
		int versuche=0;
		int input=0;
			
		do{
			input = einlesen();
			versuche++;
			System.out.println("Leider falsch. Geben Sie bitte eine Andere Zahl ein.");
		} while (input != zufallszahl);

		System.out.println("Richtig! Sie haben: " + versuche + " Versuche gebraucht. Spielende.");

		System.exit(0);
    	
    }
	
	public static void main(String[] args)
	{
		/*
		* MG(r0m) - 2009 (c)
		*/
		System.out.println("Der Computer hat sich eine zufällige Zahl ausgedacht.");
		System.out.println("Raten Sie welche in dem Sie eine Zahl von 1 bis 10 eingeben.");
		System.out.println("Welche Schwierigkeitsstufe möchten Sie spielen?");
		System.out.println("Geben Sie bitte ein: Einfach: 0; Mittel: 1; Schwer: 2");
		
		Scanner sc = new Scanner(System.in);
		
		int auswahl = einlesen();
		
		switch(auswahl){
			case 0: einfach();
					System.out.println("\n\nFangen Sie jetzt an zu raten...");
			case 1: mittel();
					System.out.println("\n\nFangen Sie jetzt an zu raten...");
			case 2: schwer();
					System.out.println("\n\nFangen Sie jetzt an zu raten...");			
			default:
				System.out.println("Falsche eingabe!\n");
				
		}
	}

}


Danke und Gruß
 

hdi

Top Contributor
Kannst du ein wenig Englisch? Die Fehlermeldungen sind eigentlich immer recht gut formuliert. Du hast in diesem Falle zwei Compile-Fehler:

Duplicate local variable eingabe
sc cannot be resolved

Übersetzung:

Variable eingabe kommt mehrmals als lokale Variable vor
Variable sc ist nicht bekannt

Außerdem werden dir noch die exakten Zeilen in der Meldung angegeben, die das Problem verursachen.
Ich denke den ersten Fehler solltest du wirklich allein lösen können.
Zum zweiten: Variablen, die lokal sind, d.h. die in einer Methode oder einem
Konstruktor deklariert (erstellt) wurden, sind auch nur in dieser Methode/Konstruktor sichtbar.
Wenn du willst dass Variablen in verschiedenen Methoden sichtbar sind, musst du sie für die gesamte Klasse deklarieren. D.h. nicht innerhalb einer Methode/Konstruktor, sondern einfach im Klassen-Rumpf:

Java:
public class Test{

   int globaleVariable; // in allen Methoden der Klasse sichtbar

   public void eineMethode(){
        int lokaleVariable; // nur innerhalb dieser Methode sichtbar
   }
}

Mit "sichtbar" ist sogar mehr als nur das gemeint: Lokale Variablen werden nach Ausführung des Blocks, in dem sie deklariert wurden, zerstört. D.h. nicht nur, dass dein Scanner in der Methode nicht sichtbar ist, sondern: Den gibt es schon lang nicht mehr!
 

r0m

Mitglied
Stimmt du hsat vollkommen recht. Die Kompilermeldung hätte ich mir auch erschließen können. Habe nun eine "globale" Variable eingebaut und erst kamen noch Fehlermeldungen, bis ich mir dann erschlossen habe, dass die Variable "static" sein muss - laut Kompiler.

Trotzdem taucht noch ein letzter Fehler auf, den ich zwar vom Übersetzen her verstehe, aber nicht vom Sinn.

Code:
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	Cannot invoke next() on the primitive type int



Gesamter Code:
Java:
import java.util.Scanner;

public class Ratespiel
{

	static int sc = 0;
	
	public static int einlesen()
	{
		int eingabe = 0;
		eingabe = sc.nextInt();
		return eingabe;
	}

    public static int zufallsZahlFkt(int pMax) {
        return  (int) ((Math.random()*pMax)+1);
    }

    public static void einfach(){

		int zufallszahl = zufallsZahlFkt(10);
		int versuche=0;
		int input=0;
		
		do{
			input = einlesen();
			versuche++;
			System.out.println("Leider falsch. Geben Sie bitte eine Andere Zahl ein.");
		} while (input != zufallszahl);

		System.out.println("Richtig! Sie haben: " + versuche + " Versuche gebraucht. Spielende.");

		System.exit(0);
    	
    }
    
    public static void mittel(){

		int zufallszahl = zufallsZahlFkt(50);
		int versuche=0;
		int input=0;
		
		do{
			input = einlesen();
			versuche++;
			System.out.println("Leider falsch. Geben Sie bitte eine Andere Zahl ein.");
		} while (input != zufallszahl);

		System.out.println("Richtig! Sie haben: " + versuche + " Versuche gebraucht. Spielende.");

		System.exit(0);
    	
    }
    
    public static void schwer(){

		int zufallszahl = zufallsZahlFkt(500);
		int versuche=0;
		int input=0;
			
		do{
			input = einlesen();
			versuche++;
			System.out.println("Leider falsch. Geben Sie bitte eine Andere Zahl ein.");
		} while (input != zufallszahl);

		System.out.println("Richtig! Sie haben: " + versuche + " Versuche gebraucht. Spielende.");

		System.exit(0);
    	
    }
	
	public static void main(String[] args)
	{
		/*
		* MG(r0m) - 2009 (c)
		*/
		System.out.println("Der Computer hat sich eine zufällige Zahl ausgedacht.");
		System.out.println("Raten Sie welche in dem Sie eine Zahl von 1 bis 10 eingeben.");
		System.out.println("Welche Schwierigkeitsstufe möchten Sie spielen?");
		System.out.println("Geben Sie bitte ein: Einfach: 0; Mittel: 1; Schwer: 2");
		
		Scanner sc = new Scanner(System.in);
		
		int auswahl = 0;
		auswahl = einlesen();
		
		switch(auswahl){
			case 0: einfach();
					System.out.println("\n\nFangen Sie jetzt an zu raten...");
			case 1: mittel();
					System.out.println("\n\nFangen Sie jetzt an zu raten...");
			case 2: schwer();
					System.out.println("\n\nFangen Sie jetzt an zu raten...");			
			default:
				System.out.println("Falsche eingabe!\n");
				
		}
	}

}
 

hdi

Top Contributor
Naja wieso hast du denn jetzt einen int deklariert? Ich dachte es wäre doch der Scanner, auf den du in deiner Methode zugreifen willst? Also:

Java:
//static int sc = 0; <-falsch
static Scanner sc; // <-richtig

Und in deiner main-Methode machst du einen weiteren Fehler. Du weist nicht der gerade deklarierten globalen Variable einen Wert zu, sondern erstellst (deklarierst) eine neue, lokale Variable. Die hat nur zufällig den selben Namen, und überschattet die globale Variable. Gar nicht gut. Also:

Java:
// Scanner sc = new Scanner(System.in); <- falsch
sc = new Scanner(System.in); // <- richtig

und static muss das deswegen sein, weil dein komplettes Programm static ist. Schon aufgefallen? Kuck dir mal deine Methoden an. Man kann statische und nicht-statische Dinge nicht mischen.
Im Übrigen sollte man generell nicht-statisch programmieren, denn das ist der Sinn von OOP-Sprachen wie Java es eine ist.
 

Schumi

Bekanntes Mitglied
Vielleicht sollte man den TE mal auf den Unterschied zwischen Deklaration und Wertzuweisung hinweisen. Mir scheints, auf dem Gebiet liegen noch Unklarheiten vor.

Durch eine Typangabe wie
Java:
 int x = 5;
wird die Variable x als int deklariert, was lokal sowieso nur einmal geht. Willst Du einer schon deklarierten Variablen nur einen (ggf. neuen) Wert zuweisen, musst Du auf die Typangabe verzichten
Java:
 x = 5;
 

r0m

Mitglied
@hdi: Habe den Sinn deiner Antwort verstanden. Danke nochmals für die Hilfestellungen. Werde das "Mini-Projekt" Ratespiel jetzt abschließen und ein Neues anfangen.

@Schmui: Auch dir danke nochmals für die Widerholung. Sitzt noch nicht alles zu 100% bei mir, dafür übe ich ja.


VG
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M kleines KI Programm Idee Allgemeine Java-Themen 7
S Unerwarteter Output (kleines Raetsel) Allgemeine Java-Themen 6
G Kleines Projekt Allgemeine Java-Themen 2
I Methoden Schnelle Hilfe benötigt - Kleines Video/Slideshow aus mehreren Bildern erstellen Allgemeine Java-Themen 3
N Kleines GUI/Sortier Projekt für die Uni Allgemeine Java-Themen 11
V Kleines Regex-Problem Allgemeine Java-Themen 3
I kleines Wochenlohn-Programm schreiben Allgemeine Java-Themen 5
F Kleines Problem mit exec Allgemeine Java-Themen 14
C Architekturvorschläge für kleines Projekt Allgemeine Java-Themen 2
S wiedermal ein kleines Problem mit BigDecimal Allgemeine Java-Themen 5
N Kleines nicht java Problem Allgemeine Java-Themen 7
F kleines regexp Problem. Allgemeine Java-Themen 3
_SeiA_ Hilfe Kleines Java Programm schreiben. Summen. Allgemeine Java-Themen 3
G von großem Panel auf ein kleines Panel mappen Allgemeine Java-Themen 6
S kleines File problem Allgemeine Java-Themen 13
M kleines prob mit JInternalFrame Allgemeine Java-Themen 5
J Kleines Tool in Java erstellen? Allgemeine Java-Themen 20
B Lizenz und kleines Programm. Allgemeine Java-Themen 3
B kleines modales transparents Fenster ohne rahmen und buttons Allgemeine Java-Themen 15
P Hab ein kleines Problem mit fehlenden Pointern. Allgemeine Java-Themen 4
S Kleines Eclipse Problem, große Wirkung Allgemeine Java-Themen 7
P Habe ein kleines Problem Allgemeine Java-Themen 2
G mit Pattern strings filtern ein kleines problemchen ;) Allgemeine Java-Themen 2
W Kleines Applet in Standard Java Applikation umwandeln Allgemeine Java-Themen 3
S kleines Konstruktorproblem Allgemeine Java-Themen 3
S kleines Spielchen proggen Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben