# Minesweeper



## Kadi (20. Nov 2010)

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.


```
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 (21. Nov 2010)

So auf die schnelle würde mir etwas in dieser Richtung einfallen:

```
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


----------



## Kadi (21. Nov 2010)

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 (22. Nov 2010)

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...


----------



## SlaterB (22. Nov 2010)

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 (22. Nov 2010)

```
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


----------



## SlaterB (22. Nov 2010)

> 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 (22. Nov 2010)

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 (22. Nov 2010)

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.

```
// 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.


```
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:


----------



## SlaterB (22. Nov 2010)

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


----------

