Minesweeper

Kadi

Mitglied
Hallo zusammen

ich habe eine kleine Frage, und zwar geht es um ein Minesweeper in Java. Ich habe ein Problem beim auslesen von Fehleingaben. Der Benutzer gibt Zeile und Spalt mit Nummern ein. Nun muss ich noch Strings abfangen und die Länge der eingabe. Das grösste Feld ist 10 * 10. Das heisst alles über 10 soll abgefangen werden wie auch String und leerzeichen. Kann mir da jemand helfen.

Java:
Spielfeld spiel1 = new Spielfeld();

			System.out
					.print("Um den Schwierigkeits - Grad zu wählen, verwenden Sie bitte die Zahlen von 0 bis 5: ");
			Scanner scan1 = new Scanner(System.in);
			this.niveau = scan1.nextInt();
			int index = 0;
			while (index < 1) {
				if (this.niveau < 0 || this.niveau > 5) {
					System.out.println(" ");
					System.out.println("Eingabe Ungültig!");
					System.out.println(" ");
					System.out
							.println("Bitte geben Sie eine Zahl zwischen 0 und 5 ein um das Level zu wählen: ");
					this.niveau = scan1.nextInt();
				} else {
					index++;
				}

			}

Zeile 10 habe ich die Abfrage, das er nicht eine grössere Zahl als das Niveau eingibt. Ich habe 6 Stufen.

Ich wäre um Eure hilfe sehr erfreut.

Grüsse Kadi
 

Mizar

Aktives Mitglied
So auf die schnelle würde mir etwas in dieser Richtung einfallen:
Java:
Scanner scan1 = new Scanner(System.in);
System.out.print("Um den Schwierigkeits - Grad zu wählen, verwenden Sie bitte die Zahlen von 0 bis 5: ");
do {
	try {
		niveau = scan1.nextInt();
	}catch(InputMismatchException e) {
		scan1.nextLine(); // von nextInt() ungelesene Eingabe holen und verwerfen
		niveau = -1;      // niveau auf ungültigen Wert setzen, um Eingabe zu wiederholen
	}
	if(niveau < 0 || niveau > 5) {
		System.out.print("\nEingabe Ungueltig!\n\nBitte geben Sie eine Zahl zwischen 0 und 5 ein um das Level zu wählen: ");
	}
}while(niveau < 0 || niveau > 5);
scan1.close();
Vielleicht hilft dir das ja schon weiter :)
 
Zuletzt bearbeitet:

Kadi

Mitglied
Hallo Mizar

vielen dank für die Antwort. werde es versuchen, ob es so funktioniert.

Vielen Dank


und einen schönen Sonntag abend

Kadi
 

Kadi

Mitglied
Leider funktioniert dein Vorschlag nicht so wie ich mir erhofft hatte.

In der Konsolenausgabe erscheint immer ein fehler:

Um den Schwierigkeits - Grad zu wählen, verwenden Sie bitte die Zahlen von 0 bis 5: 0

Wählen Sie nun die Anzahl Minen auf dem Spielfeld: Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at Ausgabe.<init>(Ausgabe.java:88)
at Hauptklasse.main(Hauptklasse.java:10)

Kann mir das jemand erklären, wo mein Fehler ist? Eigentlich will ich nach dieser Eingabe noch die Anzahl Minen bestimmen...
 
S

SlaterB

Gast
die Exception hat anscheinend mit 'Wählen Sie nun die Anzahl Minen auf dem Spielfeld:' zu tun,
welches außerhalb der bisheren geposteten Code-Abschnitte liegt?

poste mehr davon und was genau tippst du alles ein?
es bietet sich übrigens ein, nur genau einmal im Programm einen Scanner auf System.in zu eröffnen, z.B. in einer statischen Variable,
nicht für jede Eingabe neu
 

Kadi

Mitglied
Java:
			Spielfeld spiel1 = new Spielfeld();

			Scanner scan1 = new Scanner(System.in);
			System.out.print("Um den Schwierigkeits - Grad zu wählen, verwenden Sie bitte die Zahlen von 0 bis 5: ");
			do {
			    try {
			        niveau = scan1.nextInt();
			    }catch(InputMismatchException e) {
			        scan1.nextLine(); // von nextInt() ungelesene Eingabe holen und verwerfen
			        niveau = -1;      // niveau auf ungültigen Wert setzen, um Eingabe zu wiederholen
			    }
			    if(niveau < 0 || niveau > 5) {
			        System.out.print("\nEingabe Ungueltig!\n\nBitte geben Sie eine Zahl zwischen 0 und 5 ein um das Level zu wählen: ");
			    }
			}while(niveau < 0 || niveau > 5);
			scan1.close();

			System.out.println(" ");

			// Fordert den Benutzer die Eingabe der Minen Anzahl pro Spielfeld.
			System.out
					.print("Wählen Sie nun die Anzahl Minen auf dem Spielfeld:");
			System.out.print(" ");
			Scanner scan3 = new Scanner(System.in);
			anzahlMinen = scan3.nextInt();
			System.out.println(" ");

			spiel1.ausgabeSpielfeld(niveau, anzahlMinen);

das ist der Nachfolgende Text. Muss später auch hier noch die Strings abfangen. Zuerst aber bei der Eingabe des Niveaus.

@ SlaterB ich werde das mit dem Scanner versuchen. Vielen Dank
 
S

SlaterB

Gast
> scan1.close();

ist natürlich ganz übel, da könnte man meinen dass ein neuer Scanner hilft, aber auch System.in wird geschlossen,
für den Rest des Programs ist keine Eingabe mehr möglich,

nur ein Scanner und den dann nicht schließen, das dürfte soweit genügen
 

Kadi

Mitglied
Man sollte meinen, dass es genügt.
Habe da noch ein wenig Verständnis probleme.

Werde es versuchen

Vielen Dank für die Unterstüzung

Kadi
 

Kadi

Mitglied
So, habe das einigermasen hin bekommen.

Nun habe ich ein weiteres Problem beim eingeben der Minen anzahl. Die Überprüfung findet in einer anderen Klasse statt.
Java:
// Fordert den Benutzer auf die Anzahl der Minen Anzahl Spielfeld
			// einzugeben.
			System.out
					.print("Wählen Sie nun die Anzahl Minen auf dem Spielfeld:");
			System.out.print(" ");
			anzahlMinen = scan1.nextInt();
			System.out.println(" ");

			spiel1.ausgabeSpielfeld(niveau, anzahlMinen);

und dann wechselt er in die Zweite Klasse um dort die Eingabe zu prüfen.

Java:
public void ausgabeSpielfeld(int level, int anzahlMinen) {
		feldgroesse = 0;
		maxMine = 0;

		if (level == 1) {
			this.feldgroesse = 5;
			this.maxMine = 8;
		} else if (level == 2) {
			this.feldgroesse = 6;
			this.maxMine = 12;
		} else if (level == 3) {
			this.feldgroesse = 7;
			this.maxMine = 20;
		} else if (level == 4) {
			this.feldgroesse = 8;
			this.maxMine = 28;
		} else if (level == 5) {
			this.feldgroesse = 9;
			this.maxMine = 35;
		} else if (level == 6) {
			this.feldgroesse = 10;
			this.maxMine = 50;
		}

		/**
		 * Falls eine Fehleingabe gemacht wurde, wird der Benutzer nochmal
		 * aufgeforder die Eingabe zu wiederholen.
		 */

		do {
			try {
				anzahlMinen = scan1.nextInt();
			} catch (InputMismatchException e) {
				scan1.nextLine(); // von nextInt() ungelesene Eingabe holen
									// und verwerfen
				anzahlMinen = -1; // niveau auf ungültigen Wert setzen, um
									// Eingabe zu wiederholen
			}
			if (anzahlMinen < 0 || anzahlMinen > this.maxMine) {
				System.out.print("Für diese Spielfeldgrösse sind maximal "
						+ maxMine() + " Minen zulässig!");
			}
		} while (anzahlMinen < 0 || anzahlMinen > this.maxMine);

nun kommt wieder ein Fehler, ich nehme an, weil ich in der einen Klasse bereits einen Scanner benutze, und in der Zweiten zur Korrektur nochmals einen. Kann man das umgehen?

Sorry, habe es rausgefunden. Ich brauche in der ersten Klasse keine Abfrage, erledigt ja mein neues Super Ding, was mir String ausliest und als Fehler meldet.

Einen Grossen :applaus: an die super Antowrten um mein Problem zu lösen.

Ich danke euch viel Mal. :toll:
 
Zuletzt bearbeitet:
S

SlaterB

Gast
dein Superding von 14 cm äh Zeilen solltest du jetzt aber nicht überall hinkopieren sondern soweit möglich in eine statische Methode auslagern, als Paramter den Fehlertext übergeben

und immer noch reicht ein statischer Scanner, ja, so wie System.in überall gefunden wird müsste es mit eigenen statischen Variablen genauso klappen
 

Ähnliche Java Themen

Neue Themen


Oben