"illegal start of type" eindimensionales Schiffe versenken

Hey, hab mal wieder ein paar Probleme mit meienr Hausaufgabe. Meine Hausaufgabe ist es ein eindimensionales Schiffe versenken zu erstellen.
Das Spiel besteht aus einer Linie oder einem Feld von 25 Einheiten. jedes Feld wird dabei als ein Punkt gezeigt (.........................). Auf diesem Feld sollen dann 2 Schiffe sein, eins in der größe von 5 einheiten und das andere mit einer größe von 3 einheiten.
Bei einem unbekannten Feld soll ein Punkt gezeigt werden
Bei einem Fehlschuss ein Minus Zeichen
Bei einem Treffer ein X.

Und nach jedem Zug soll den Spielern das aktuelle Feld und der Stand angezeigt werden.
Java:
// Eindimensionales "Schiffe versenken"-Spiel
// Name: 

import java.util.Random;
import java.util.Scanner;

public class Schiffe {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		Random rgen = new Random();
		// Random rgen = new Random(0);

		// Spielfeld: 25 Kaestchen
		final int groesse = 25;
		int feld[] = new int[groesse];
			// Bedeutung der Werte im Spielfeld:
			// 0: Wasser - noch nicht beschossen
			// 1: Schiff - noch nicht beschossen
			// 2: Wasser - Spieler weiss, das leer
			// 3: Schiff - schon getroffen

		// Position des Schlachtschiffes (5 Kaestchen breit):
		int schlachtschiff = rgen.nextInt(groesse - 4);
			// Startposition bei 0 bis 20
		feld[schlachtschiff+0] = 1;
		feld[schlachtschiff+1] = 1;
		feld[schlachtschiff+2] = 1;
		feld[schlachtschiff+3] = 1;
		feld[schlachtschiff+4] = 1;

		// Position des Zerstoerers (3 Kaestchen breit)
		int min = 0;
		int max = groesse - 3;
		if(schlachtschiff <= 3)
			min = schlachtschiff + 6;
			// Passt nicht mehr davor
		else if(schlachtschiff >= groesse - 8)
			// Passt nicht mehr dahinter
			max = schlachtschiff - 4;
		else if(rgen.nextInt(2) == 0)
			// Zufallsentscheidung davor/dahinter
			min = schlachtschiff + 6;
		else
			max = schlachtschiff - 4;
		int zerstoerer = min + rgen.nextInt(max - min + 1);
		feld[zerstoerer+0] = 1;
		feld[zerstoerer+1] = 1;
		feld[zerstoerer+2] = 1;

		// Ab hier Ihr Programm:
		// Die Testausgabe koennen Sie loeschen:

		}

		int zuege =0;
		int treffer=0;
		while (zuege < feld.length) {
			System.out.print("Bitte Zahl von 0 bis 24 eingeben ");
			int n = scan.nextInt();
			if (n>=feld.length||n<0)) {
				System.out.println ("Fehler");
			} 
			else {
				if (feld[n]==0) {
					feld[n]=2;
				}
				else if (feld[n]==1) {
					feld[n]=3;
					treffer++;
				}				
				else {
				System.out.println("ueberflüssig");
				}
			}
			for (int i=0;i<feld.length;i++) {
				if (feld[i]==0||feld[i]==1) {
					System.out.print(".");
				}
				else if (feld[i]==2) {
					System.out.print("-");
				}
				else if (feld[i]==3) {
				System.out.print("X");
				}
			}
		
			zuege++;
			if (treffer ==8) {
				System.out.println();
				System.out.println ("Gewonnen in " + zuege + " Zuegen.");
			}
			System.out.println();
		}
		System.out.println();
	}
}

Meines erachtens nach sollte bis Zeile 48 alles richtig sein, da dass schon vorgegeben war.
Wenn ich das jetzt so compiliere, dann kommen allerdings so um die 40 Fehlermeldungen, wobei ich die wenisten verstehe (z.B. Schiffe.java:57: error: illegal start of type
while (zuege < feld.length) { )

Hoffe mir kann hier jemand aushelfen?
 
Wenn ich das auf einen schnellen Blick richtig sehe, hast du deinen Code hinter die schließende, geschweifte Klammer der main-Methode (Zeile 54) gesetzt, sodass der Code außerhalb einer Methode steht, was illegal ist.

Edit: Vermutlich stand da vorher noch eine Schleife oder so ("Testausgabe") und davon hast du die schließende Klammer nicht gelöscht. Davon gehe ich aus, weil weiter unten noch die tatsächliche Klammer schließt, die zu main gehört - die Klammer in Zeile 54 beendet main also unabsichtlich.
 
Zuletzt bearbeitet:
okay so weit so gut, das Grobe läuft erstmal 🙂 Allerdings habe ich noch 2 probleme bei denen ich nicht ganz weiter weiß. Wenn das Programm mir sagt dass ich eine zahl von 1-24 wählen soll und ich 1 drücke, dann "schießt" er auf Feld 2, wahrscheinlich weil die 1 bei dem Programm bei 0 anfängt. Mir fehlt allerdings die idee wie ich dem Programm jetzt verständlich mache das mit 1 auch 1 gemeint ist und nicht 0 😀

Und das zweite ist, Sobald alle Schiffe versenkt sind sollte mir das Programm sagenmit wie vielen zügen ich gewonnen habe. das Programm endet aber grundsätzlich erst, wenn alle Felder beschossen wurden. In der while Schleife steht es ja drinnen, also wüsste ich jetzt nicht wo der fehler liegt.

Java:
// Eindimensionales "Schiffe versenken"-Spiel
// Name: 

import java.util.Random;
import java.util.Scanner;

public class Schiffe {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		Random rgen = new Random(0);
		// Random rgen = new Random(0);

		// Spielfeld: 25 Kaestchen
		final int groesse = 25;
		int feld[] = new int[groesse];
			// Bedeutung der Werte im Spielfeld:
			// 0: Wasser - noch nicht beschossen
			// 1: Schiff - noch nicht beschossen
			// 2: Wasser - Spieler weiss, das leer
			// 3: Schiff - schon getroffen

		// Position des Schlachtschiffes (5 Kaestchen breit):
		int schlachtschiff = rgen.nextInt(groesse - 4);
			// Startposition bei 0 bis 20
		feld[schlachtschiff+0] = 1;
		feld[schlachtschiff+1] = 1;
		feld[schlachtschiff+2] = 1;
		feld[schlachtschiff+3] = 1;
		feld[schlachtschiff+4] = 1;

		// Position des Zerstoerers (3 Kaestchen breit)
		int min = 0;
		int max = groesse - 3;
		if(schlachtschiff <= 3)
			min = schlachtschiff + 6;
			// Passt nicht mehr davor
		else if(schlachtschiff >= groesse - 8)
			// Passt nicht mehr dahinter
			max = schlachtschiff - 4;
		else if(rgen.nextInt(2) == 0)
			// Zufallsentscheidung davor/dahinter
			min = schlachtschiff + 6;
		else
			max = schlachtschiff - 4;
		int zerstoerer = min + rgen.nextInt(max - min + 1);
		feld[zerstoerer+0] = 1;
		feld[zerstoerer+1] = 1;
		feld[zerstoerer+2] = 1;

		// Ab hier Ihr Programm:
		// Die Testausgabe koennen Sie loeschen:

		

		int zuege =0;
		int treffer=0;
		while (zuege < feld.length) {
			System.out.print("Bitte Zahl von 0 bis 24 eingeben ");
			int n = scan.nextInt();
			if (n>=feld.length||n<0) {
				System.out.println ("Fehler");
			} 
			else {
				if (feld[n]==0) {
					feld[n]=2;
				}
				else if (feld[n]==1) {
					feld[n]=3;
					treffer++;
				}				
				else {
				System.out.println("ueberflüssig");
				}
			}
			for (int i=0;i<feld.length;i++) {
				if (feld[i]==0||feld[i]==1) {
					System.out.print(".");
				}
				else if (feld[i]==2) {
					System.out.print("-");
				}
				else if (feld[i]==3) {
				System.out.print("X");
				}
			}
		
			zuege++;
			if (treffer ==8) {
				System.out.println();
				System.out.println ("Gewonnen in " + zuege + " Zuegen.");
			}
			System.out.println();
		}
		System.out.println();
	}
}
 
Zuletzt bearbeitet:
Zu Problem 2: Du könntest die Bedingung der while-Schleife ja erweitern, dass sie so lange läuft, wie es noch freie Felder gibt oder noch nicht 8 Treffer gibt. Dann könntest du die Auswertung, ob gewonnen oder verloren wurde, nach der Schleife machen, indem du prüfst, ob es 8 Treffer gab.

Problem 1 habe ich nicht genau verstanden. Das Programm fordert auf, eine Zahl zwischen 0 und 24 einzugeben; du erwähnst aber, dass er zwischen 1 und 24 wählen soll? Momentan müsste es so sein, dass die Eingabe "1" Feld Nummer 2 beschießt, richtig? Das liegt daran, dass Feld 1 den Index 0 hat. Du könntest ja nun von der Eingabe den Wert 1 abziehen, um diese Differenz auszugleichen. Dann sollte der Benutzer aber nicht mehr aufgefordert werden, eine Zahl zwischen 0 und 24 sondern zwischen 1 und 25 einzugeben 😉
 
Moin,

wahrscheinlich weil die 1 bei dem Programm bei 0 anfängt.
Na, DAS ist doch mal 'ne Aussage :lol:

Was Du wahrscheinlich meinst, ist, dass Dein Array-Index von "0 - (Länge-1)" läuft.
Wenn also '1' eingibst (bei Dir auf 'n') und dann auf "feld[n]" ansprichst, ist dies also der zweite Wert im Array!!
Also ziehst Du entweder von eingegeben Wert '1' ab (was ich aber wegen der Übersichtlichkeit nicht empfehlen würde) oder Du greifst halt auf "feld[n-1]" zu .....

zu (2): habe es jetzt auf die Schnelle nicht nachvollziehen können, aber Dein Vergleich "if (treffer ==8)" wird fehlschlagen. Gibt doch vorher in jedem Durchlauf den Wert in der Konsole aus !

Gruß
Klaus
 

Zurück
Oben