Shell
Shell
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?
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?
Re: Shell
Moin Blurio,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?
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> ");
Code: Alles auswählen
String[] parameter = command.split(" ");
Code: Alles auswählen
if (parameter[0].equals("quit")) {
System.exit(-1);
}
Re: Shell
Pass auf, dass das der Herr Snelting nicht sieht.|silent hat geschrieben:Code: Alles auswählen
if (parameter[0].equals("quit")) { System.exit(-1); }
Ich hab das so gemacht:
Code: Alles auswählen
String eingabe = "";
while (!eingabe.equals("quit") {
eingabe = Terminal.askString("Schiffe> ");
String [] parameter = eingabe.split(" ");
// ...
}
Re: Shell
Ja da hast du natürlich recht, gute Einwand! Werd' ich gleich mal berücksichtigen
Snelting zuliebe!
Snelting zuliebe!
Re: Shell
Was spricht da laut Snelting dagegen? Is das wieder Haarspalterei oder is das driftig?
Cheers André
Re: Shell
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.
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.
Re: Shell
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?
"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?
Re: Shell
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.
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.
Re: Shell
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.
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();
}
}
Re: Shell
Hallo Blurio,
habe deine Code nur überflogen, aber einige Fehler gefunden:
Strings vergleicht man nicht mit ==, sondern so:
Sonst vergleichst du die Referenz vom String mit einem anderen String.
Kein syntaktischer Fehler, aber.. passt ein 3 Felder langes Schiff auf eine 2*2-Feld?
Das musst du == schreiben. oder besser noch so:
hier solltest dus so machen:
Zur Frage, wie du Fehler einbauen kannst:
Du fügst die Schiffe so hinzu:
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:
isOk ist true, wenns geklappt hat, sonst false.
habe deine Code nur überflogen, aber einige Fehler gefunden:
Code: Alles auswählen
shipsAdd[2]== "NORTH"
Code: Alles auswählen
shipsAdd[2].equals("NORTH")
Code: Alles auswählen
if (shipsLength > (tokensInt[0] * tokensInt[1])){
Code: Alles auswählen
while ((sunk1 = false) && (sunk2 = false)){
Code: Alles auswählen
while (!sunk1 && !sunk2){
Code: Alles auswählen
if (sunk1 == true){
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 );
Code: Alles auswählen
boolean isOk = spielerEins.addShip(shipType, pos, direction );
Zuletzt geändert von salami am Fr 9. Jan 2009, 01:35, insgesamt 1-mal geändert.