Shell

http://pp.info.uni-karlsruhe.de/lehre/W ... rn/b04.pdf
Blurio
Beiträge: 56
Registriert: Do 20. Nov 2008, 21:39

Shell

Beitrag von Blurio »

Ich sitz grad aufm Schlauch. Man soll ja ne Shell Klasse anlegen, die die Ausgabe macht. Also kommt da auch meine Main Methode rein, ne?
Ich weiß nicht so recht was ich der Shell als Attribute geben soll? Ein Board-Element?
Was soll die für Methoden kriegen? Nur ne Methode, die dem x y whatever den entsprechenden Board Werten zuordnet, oder? Wie mach ich aus x, y das Array? Kann ich Terminal.AskInt für alle Werte auf einmal benutzen?
|silent
Moderator
Beiträge: 88
Registriert: Di 28. Okt 2008, 13:15
Kontaktdaten:

Re: Shell

Beitrag von |silent »

Blurio hat geschrieben:Ich sitz grad aufm Schlauch. Man soll ja ne Shell Klasse anlegen, die die Ausgabe macht. Also kommt da auch meine Main Methode rein, ne?
Ich weiß nicht so recht was ich der Shell als Attribute geben soll? Ein Board-Element?
Was soll die für Methoden kriegen? Nur ne Methode, die dem x y whatever den entsprechenden Board Werten zuordnet, oder? Wie mach ich aus x, y das Array? Kann ich Terminal.AskInt für alle Werte auf einmal benutzen?
Moin Blurio,

also die Main-Methode kommt da rein, richtig. Du brauchst der Klasse eigtl. nur das geben was du deiner Meinung nach brauchst. Ich habs so gelöst, dass ich der Klasse als Attribut ein Board-Array gegeben habe, da ich ja 2 Spielfelder brauche. Dementsprechend ist das Array also 1-Dimensional mit 2 Speicherplätzen. Innerhalb der Main-Methode machst du z.B. sowas:

Code: Alles auswählen

String command = Terminal.ask("Schiffe> ");
Damit wird ja die komplette Zeile, die der Anwender eintippt eingelesen. Aber das bringt dir ja reichlich wenig, wenn da steht "new 10 10 1 2 4 0", was ein 10x10 großes Feld anlegt mit den ang. Schiffen. Um das nutzbar zu verwenden nimmst du einen der String-Funktionen die dir Java zur Verfügung stellt

Code: Alles auswählen

String[] parameter = command.split(" ");
und erhälst die einzelnen Befehle in dem Array parameter und kannst jetz prüfen, ob "quit" eingegeben wurde mit

Code: Alles auswählen

if (parameter[0].equals("quit")) {
System.exit(-1);
}
Analog dazu kannst du genauso vorgehen, wenn es darum geht die Koordinaten der Spieler und Schiffe einzulesen, um nicht jedesmal eine Abfrage für X, Y und die Ausrichtung des Schiffs zu machen.
Bild
Benutzeravatar
salami
Beiträge: 179
Registriert: Mi 5. Nov 2008, 22:41
Wohnort: Karlsruhe

Re: Shell

Beitrag von salami »

|silent hat geschrieben:

Code: Alles auswählen

if (parameter[0].equals("quit")) {
System.exit(-1);
}
Pass auf, dass das der Herr Snelting nicht sieht. ;)

Ich hab das so gemacht:

Code: Alles auswählen

String eingabe = "";
while (!eingabe.equals("quit") {
  eingabe = Terminal.askString("Schiffe> ");
  String [] parameter = eingabe.split(" ");
   // ...
}
So läuft das Programm immer durch (kein Eingriff in den Programmfluss), so wie er es gerne hätte. :D
|silent
Moderator
Beiträge: 88
Registriert: Di 28. Okt 2008, 13:15
Kontaktdaten:

Re: Shell

Beitrag von |silent »

Ja da hast du natürlich recht, gute Einwand! Werd' ich gleich mal berücksichtigen ;)

Snelting zuliebe! :D
Bild
Dre
Beiträge: 139
Registriert: Do 23. Okt 2008, 21:35
Wohnort: Karlsruhe
Kontaktdaten:

Re: Shell

Beitrag von Dre »

Was spricht da laut Snelting dagegen? Is das wieder Haarspalterei oder is das driftig?
Cheers André
Benutzeravatar
salami
Beiträge: 179
Registriert: Mi 5. Nov 2008, 22:41
Wohnort: Karlsruhe

Re: Shell

Beitrag von salami »

Es soll für alles nur einen Anfang und ein Ende geben. Deshalb sind auch mehrere Programmenden nicht schön.
Wenn z.B. das Programm aus irgend einem Grund ungewollt beendet wird, dann weiß man wo man suchen muss und muss nicht erst herausfinden wo das Programm jetzt beendet wurde.

Und es könnte ja sein, dass man irgendwann noch eine Abfrage wie "Möchten Sie das Spiel wirklich beenden? [J/N]" hinzufügen will oder soll. Dann muss man nur eine Stelle verändern und nicht alle.
nik7887
Beiträge: 2
Registriert: So 28. Dez 2008, 23:41

Re: Shell

Beitrag von nik7887 »

Ich hab ein Problem bei "Aufgabe 7 - 3."

"Sehen Sie auch eine Moglichkeit vor, das Spiel durch
eine geeignete Eingabe abzubrechen und zu 1. zuruckzukehren."

Also ich hab wenig erfahrung würde dass wenn überhaupt irgendwie mit ziemlich vielen schleifen
lösen aber das kanns doch nicht sein oder :/ sähe irgendwie ziemlich kompliziert aus dann obwohls dass ja egl nciht ist..

wie habt ihr das gelöst?
Benutzeravatar
salami
Beiträge: 179
Registriert: Mi 5. Nov 2008, 22:41
Wohnort: Karlsruhe

Re: Shell

Beitrag von salami »

Punkt 1 ist ja das was schon weiter oben geschrieben wurde. Also die Schleife, die mit quit beendet wird.

Ich habe es so gemacht, dass in dieser Schleife eine andere Methode aufgerufen wird, die dann die Steuerung des Spiels durch Benutzereingaben übernimmt (wieder mit Schleife).
Wenn man dort den Abbrech-Befehl eingibt, wird die Schleife in der zweiten Funktion abgebrochen und dadurch in die ursprüngliche Schleife (Punkt 1) zurückgesprungen, weil mit dem Ende der zweiten Schleife auch die Methode endet.
Man könnte die zweite Schleife natürlich in die erste Schleife direkt reinschreiben, das wird aber unübersichtlich.
Blurio
Beiträge: 56
Registriert: Do 20. Nov 2008, 21:39

Re: Shell

Beitrag von Blurio »

Ok, dankeschön, ich bin schon ein ganzes Stück weiter. Jetzt hab ich allerdings wieder ein Problem, besser gesagt mehrere.
1. Mein Programm will die Bombenschmeiss Methode nich starten.
2. Wie bastle ich Errors für die Schiffssetzung da rein?
Bitte nicht beachten, dass ich superviel Code zum Schiffe setzen zweimal drin hab, für was anderes bin ich zu doof. Und ja, die Methode zum Spielfeldanzeigen und die zum mittendrin aufhören fehlt noch. Falls mir wer helfen möchte, hier der Quellcode.
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: auf Anzeigen klicken

Code: Alles auswählen


public class Shell {
static Board spielerEins;
static Board spielerZwei;

// splittet die Eingabe in eine String Array und wandelt dieses in ein Integer 
// Array um. Wenn quit eingegeben wird hört das Programm auf.
	private static int[] ships() {
		String eingabe = Terminal.askString("Schiffe>");
		String[] tokens = eingabe.split(" ");
		int[] tokensInt = new int[6];
		for (int i = 1; i < tokens.length; i++) {
			tokensInt[i - 1] = Integer.parseInt(tokens[i]);
		}	
		if (tokens[0] == "quit") {
			System.exit(-1);
		}
		return tokensInt;
	}
	// Rechnet den Platzbedarf aller Schiffe aus.
	private static int shipsLength (int[] tokensInt){
		int m = tokensInt[2] * Constants.MINESWEEPER;
		int k = tokensInt[3] * Constants.BATTLE_CRUISER;
		int s = tokensInt[4] * Constants.DREADNOUGHT;
		int f = tokensInt[5] * Constants.FLATTOP;
		int shipsLength = m + k + s + f;
		return shipsLength;
	}
	// Prüft ob Schiffe alle ins Feld passen, wenn nicht fängt es wieder von 
	// vorne an.
	private static boolean shipsFit(int[] tokensInt, int shipsLength){
		boolean shipsFit = true;
		if (shipsLength > (tokensInt[0] * tokensInt[1])){
			shipsFit = false;
			Terminal.println("Error: Feld zu klein für die Schiffsanzahl!");
			ships();
		}
		return shipsFit;
	}
	private static boolean shipsExist(int shipsLength){
		boolean shipsExist = true;
		if (shipsLength == 0){
			shipsExist = false;
			Terminal.println("Error: Keine Schiffe vorhanden!");
			ships();
		}
		return shipsExist;
	}
	public static void spielerEinsAddShip(int[] tokensInt){																

		int f = tokensInt[5];
		int s = tokensInt[4];
		int k = tokensInt[3];
		int m = tokensInt[2];
		
		while (f > 0){
			Terminal.println("Koordinaten für einen Flugzeugträger");	
			Terminal.println("Bitte geben sie die Koordinaten " +
				"für die Schiffe folgendermaßen ein: " +
				"Position(x, y), Ausrichtung(NORTH, EAST, SOUTH, WEST");
			Terminal.println("z.B. >>2,3,EAST<<");
			String addShip = Terminal.askString("Coords>");			
		String[] shipsAdd = addShip.split(",");
		int x = Integer.parseInt(shipsAdd[0]);
		int y = Integer.parseInt(shipsAdd[1]);
			int shipType = Constants.FLATTOP;
			Position pos = new Position(x, y); 
			if(shipsAdd[2]== "NORTH"){
				int direction = Constants.NORTH;
				spielerEins.addShip(shipType, pos, direction );
			}
			if(shipsAdd[2] == "SOUTH"){
				int direction = Constants.SOUTH;
				spielerEins.addShip(shipType, pos, direction );
			}
			if(shipsAdd[2] == "EAST"){
				int direction = Constants.EAST;
				spielerEins.addShip(shipType, pos, direction );
			}
			if(shipsAdd[2] == "WEST"){
				int direction = Constants.WEST;
				spielerEins.addShip(shipType, pos, direction );
			}
			f--;
		}
		while (s > 0){
			Terminal.println("Koordinaten für ein Schlachtschiff");	
			Terminal.println("Bitte geben sie die Koordinaten " +
				"für die Schiffe folgendermaßen ein: " +
				"Position(x, y), Ausrichtung(NORTH, EAST, SOUTH, WEST");
			Terminal.println("z.B. >>2,3,EAST<<");
			String addShip = Terminal.askString("Coords>");			
		String[] shipsAdd = addShip.split(",");
		int x = Integer.parseInt(shipsAdd[0]);
		int y = Integer.parseInt(shipsAdd[1]);
			int shipType = Constants.DREADNOUGHT;
			Position pos = new Position(x, y); 
			if(shipsAdd[2]== "NORTH"){
				int direction = Constants.NORTH;
				spielerEins.addShip(shipType, pos, direction );
			}
			if(shipsAdd[2] == "SOUTH"){
				int direction = Constants.SOUTH;
				spielerEins.addShip(shipType, pos, direction );
			}
			if(shipsAdd[2] == "EAST"){
				int direction = Constants.EAST;
				spielerEins.addShip(shipType, pos, direction );
			}
			if(shipsAdd[2] == "WEST"){
				int direction = Constants.WEST;
				spielerEins.addShip(shipType, pos, direction );
			}
			s--;
		}
		while (k > 0){
			Terminal.println("Koordinaten für einen Kreuzer");	
			Terminal.println("Bitte geben sie die Koordinaten " +
				"für die Schiffe folgendermaßen ein: " +
				"Position(x, y), Ausrichtung(NORTH, EAST, SOUTH, WEST");
			Terminal.println("z.B. >>2,3,EAST<<");
			String addShip = Terminal.askString("Coords>");			
		String[] shipsAdd = addShip.split(",");
		int x = Integer.parseInt(shipsAdd[0]);
		int y = Integer.parseInt(shipsAdd[1]);
			int shipType = Constants.BATTLE_CRUISER;
			Position pos = new Position(x, y); 
			if(shipsAdd[2]== "NORTH"){
				int direction = Constants.NORTH;
				spielerEins.addShip(shipType, pos, direction );
			}
			if(shipsAdd[2] == "SOUTH"){
				int direction = Constants.SOUTH;
				spielerEins.addShip(shipType, pos, direction );
			}
			if(shipsAdd[2] == "EAST"){
				int direction = Constants.EAST;
				spielerEins.addShip(shipType, pos, direction );
			}
			if(shipsAdd[2] == "WEST"){
				int direction = Constants.WEST;
				spielerEins.addShip(shipType, pos, direction );
			}
			k--;
		}
		while (m > 0){
			Terminal.println("Koordinaten für einen Minensucher");	
			Terminal.println("Bitte geben sie die Koordinaten " +
				"für die Schiffe folgendermaßen ein: " +
				"Position(x, y), Ausrichtung(NORTH, EAST, SOUTH, WEST");
			Terminal.println("z.B. >>2,3,EAST<<");
			String addShip = Terminal.askString("Coords>");			
		String[] shipsAdd = addShip.split(",");
		int x = Integer.parseInt(shipsAdd[0]);
		int y = Integer.parseInt(shipsAdd[1]);
			int shipType = Constants.MINESWEEPER;
			Position pos = new Position(x, y); 
			if(shipsAdd[2]== "NORTH"){
				int direction = Constants.NORTH;
				spielerEins.addShip(shipType, pos, direction );
			}
			if(shipsAdd[2] == "SOUTH"){
				int direction = Constants.SOUTH;
				spielerEins.addShip(shipType, pos, direction );
			}
			if(shipsAdd[2] == "EAST"){
				int direction = Constants.EAST;
				spielerEins.addShip(shipType, pos, direction );
			}
			if(shipsAdd[2] == "WEST"){
				int direction = Constants.WEST;
				spielerEins.addShip(shipType, pos, direction );
			}
			m--;
		}	
		Terminal.println("Spieler Zwei ist an der Reihe!");
	}
	public static void spielerZweiAddShip(int[] tokensInt){																

		int f = tokensInt[5];
		int s = tokensInt[4];
		int k = tokensInt[3];
		int m = tokensInt[2];
		
		while (f > 0){
			Terminal.println("Koordinaten für einen Flugzeugträger");	
			Terminal.println("Bitte geben sie die Koordinaten " +
				"für die Schiffe folgendermaßen ein: " +
				"Position(x, y), Ausrichtung(NORTH, EAST, SOUTH, WEST");
			Terminal.println("z.B. >>2,3,EAST<<");
			String addShip = Terminal.askString("Coords>");			
		String[] shipsAdd = addShip.split(",");
		int x = Integer.parseInt(shipsAdd[0]);
		int y = Integer.parseInt(shipsAdd[1]);
			int shipType = Constants.FLATTOP;
			Position pos = new Position(x, y); 
			if(shipsAdd[2]== "NORTH"){
				int direction = Constants.NORTH;
				spielerZwei.addShip(shipType, pos, direction );
			}
			if(shipsAdd[2] == "SOUTH"){
				int direction = Constants.SOUTH;
				spielerZwei.addShip(shipType, pos, direction );
			}
			if(shipsAdd[2] == "EAST"){
				int direction = Constants.EAST;
				spielerZwei.addShip(shipType, pos, direction );
			}
			if(shipsAdd[2] == "WEST"){
				int direction = Constants.WEST;
				spielerZwei.addShip(shipType, pos, direction );
			}
			f--;
		}
		while (s > 0){
			Terminal.println("Koordinaten für ein Schlachtschiff");	
			Terminal.println("Bitte geben sie die Koordinaten " +
				"für die Schiffe folgendermaßen ein: " +
				"Position(x, y), Ausrichtung(NORTH, EAST, SOUTH, WEST");
			Terminal.println("z.B. >>2,3,EAST<<");
			String addShip = Terminal.askString("Coords>");			
		String[] shipsAdd = addShip.split(",");
		int x = Integer.parseInt(shipsAdd[0]);
		int y = Integer.parseInt(shipsAdd[1]);
			int shipType = Constants.DREADNOUGHT;
			Position pos = new Position(x, y); 
			if(shipsAdd[2]== "NORTH"){
				int direction = Constants.NORTH;
				spielerZwei.addShip(shipType, pos, direction );
			}
			if(shipsAdd[2] == "SOUTH"){
				int direction = Constants.SOUTH;
				spielerZwei.addShip(shipType, pos, direction );
			}
			if(shipsAdd[2] == "EAST"){
				int direction = Constants.EAST;
				spielerZwei.addShip(shipType, pos, direction );
			}
			if(shipsAdd[2] == "WEST"){
				int direction = Constants.WEST;
				spielerZwei.addShip(shipType, pos, direction );
			}
			s--;
		}
		while (k > 0){
			Terminal.println("Koordinaten für einen Kreuzer");	
			Terminal.println("Bitte geben sie die Koordinaten " +
				"für die Schiffe folgendermaßen ein: " +
				"Position(x, y), Ausrichtung(NORTH, EAST, SOUTH, WEST");
			Terminal.println("z.B. >>2,3,EAST<<");
			String addShip = Terminal.askString("Coords>");			
		String[] shipsAdd = addShip.split(",");
		int x = Integer.parseInt(shipsAdd[0]);
		int y = Integer.parseInt(shipsAdd[1]);
			int shipType = Constants.BATTLE_CRUISER;
			Position pos = new Position(x, y); 
			if(shipsAdd[2]== "NORTH"){
				int direction = Constants.NORTH;
				spielerZwei.addShip(shipType, pos, direction );
			}
			if(shipsAdd[2] == "SOUTH"){
				int direction = Constants.SOUTH;
				spielerZwei.addShip(shipType, pos, direction );
			}
			if(shipsAdd[2] == "EAST"){
				int direction = Constants.EAST;
				spielerZwei.addShip(shipType, pos, direction );
			}
			if(shipsAdd[2] == "WEST"){
				int direction = Constants.WEST;
				spielerZwei.addShip(shipType, pos, direction );
			}
			k--;
		}
		while (m > 0){
			Terminal.println("Koordinaten für einen Minensucher");	
			Terminal.println("Bitte geben sie die Koordinaten " +
				"für die Schiffe folgendermaßen ein: " +
				"Position(x, y), Ausrichtung(NORTH, EAST, SOUTH, WEST");
			Terminal.println("z.B. >>2,3,EAST<<");
			String addShip = Terminal.askString("Coords>");			
		String[] shipsAdd = addShip.split(",");
		int x = Integer.parseInt(shipsAdd[0]);
		int y = Integer.parseInt(shipsAdd[1]);
			int shipType = Constants.MINESWEEPER;
			Position pos = new Position(x, y); 
			if(shipsAdd[2]== "NORTH"){
				int direction = Constants.NORTH;
				spielerZwei.addShip(shipType, pos, direction );
			}
			if(shipsAdd[2] == "SOUTH"){
				int direction = Constants.SOUTH;
				spielerZwei.addShip(shipType, pos, direction );
			}
			if(shipsAdd[2] == "EAST"){
				int direction = Constants.EAST;
				spielerZwei.addShip(shipType, pos, direction );
			}
			if(shipsAdd[2] == "WEST"){
				int direction = Constants.WEST;
				spielerZwei.addShip(shipType, pos, direction );
			}
			m--;
		}
		Terminal.println("Das Spiel beginnt!");
	}
	public static void bombingPlayerOne(){
		boolean bombsHit = true;
		while (bombsHit = true){
			Terminal.println("Spieler Eins, bitte geben sie die zu " +
					"bombadierenden Koordinaten folgendermaßen ein:" +
					"x,y");
			Terminal.println("z.b. >>3,2<<");
			String bombs1 = Terminal.askString("Bombs>");
			String[] bombing1 = bombs1.split(",");
			int bombX = Integer.parseInt(bombing1[0]);
			int bombY = Integer.parseInt(bombing1[1]);
			Position pos = new Position(bombX, bombY);
			spielerZwei.dropBomb(pos);	
			bombsHit = spielerEins.dropBomb(pos);
		}
	}
	public static void bombingPlayerTwo(){
		boolean bombsHit = true;
		while (bombsHit = true){
			Terminal.println("Spieler Zwei, bitte geben sie die zu " +
					"bombadierenden Koordinaten folgendermaßen ein:" +
					"(x,y)");
			Terminal.println("z.b. >>3,2<<");
			String bombs2 = Terminal.askString("Bombs>");
			String[] bombing2 = bombs2.split(",");
			int bombX = Integer.parseInt(bombing2[0]);
			int bombY = Integer.parseInt(bombing2[1]);
			Position pos = new Position(bombX, bombY);
			spielerEins.dropBomb(pos);
			bombsHit = spielerZwei.dropBomb(pos);
		}
	}
	public static void bombingSession(){
		boolean sunk1 = false;
		boolean sunk2 = false;
		while ((sunk1 = false) && (sunk2 = false)){
				bombingPlayerOne();
				bombingPlayerTwo();
				sunk1 = spielerEins.allShipsSunk();
				sunk2 = spielerZwei.allShipsSunk();
		}
		if (sunk1 == true){
			Terminal.println("Spieler Eins hat verloren!");
		} else {
			if (sunk2 == true){
				Terminal.println("Spieler Zwei hat verloren!");
			}
		}
	}
	public static void main (String[] args){
		int[] tokensInt = ships();
		int shipsLength = shipsLength(tokensInt);
		int maxships = tokensInt[2] + tokensInt[3] + tokensInt[4] 
		                                                       + tokensInt[5];
		boolean shipsFit = shipsFit(tokensInt, shipsLength);
		boolean shipsExist = shipsExist(shipsLength);
		Board spielereins = new Board(tokensInt[0], tokensInt[1], maxships);
		Board spielerzwei = new Board(tokensInt[0], tokensInt[1], maxships);
		spielerEinsAddShip(tokensInt);	
		spielerZweiAddShip(tokensInt);
		bombingSession();
	}
}
Benutzeravatar
salami
Beiträge: 179
Registriert: Mi 5. Nov 2008, 22:41
Wohnort: Karlsruhe

Re: Shell

Beitrag von salami »

Hallo Blurio,
habe deine Code nur überflogen, aber einige Fehler gefunden:

Code: Alles auswählen

shipsAdd[2]== "NORTH"
Strings vergleicht man nicht mit ==, sondern so:

Code: Alles auswählen

shipsAdd[2].equals("NORTH")
Sonst vergleichst du die Referenz vom String mit einem anderen String.

Code: Alles auswählen

if (shipsLength > (tokensInt[0] * tokensInt[1])){
Kein syntaktischer Fehler, aber.. passt ein 3 Felder langes Schiff auf eine 2*2-Feld? ;)

Code: Alles auswählen

while ((sunk1 = false) && (sunk2 = false)){
Das musst du == schreiben. oder besser noch so:

Code: Alles auswählen

while (!sunk1 && !sunk2){

Code: Alles auswählen

 if (sunk1 == true){
hier solltest dus so machen:

Code: Alles auswählen

 if (sunk1){

Zur Frage, wie du Fehler einbauen kannst:
Du fügst die Schiffe so hinzu:

Code: Alles auswählen

spielerEins.addShip(shipType, pos, direction );
Diese addShip-Funktion gibt zurpck, ob das Schiff gesetzt werden konnte. Also mach es so, und du kannst prüfen, ob es hinzugefügt wurde:

Code: Alles auswählen

boolean isOk = spielerEins.addShip(shipType, pos, direction );
isOk ist true, wenns geklappt hat, sonst false.
Zuletzt geändert von salami am Fr 9. Jan 2009, 01:35, insgesamt 1-mal geändert.
Antworten

Zurück zu „Blatt 4 - Abgabe 09.01.09“