Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.Scanner;
- import java.util.InputMismatchException;
- /**
- * Schiffe Versenken für zwei Spieler
- *
- * @author Timo Suikat 4707963 Gruppe 9a
- * @author Lars Thörner 4710277 Gruppe 9a
- */
- public class Battleship {
- /**
- * Erstes Spielbrett, hier sind eigene Schiffe und gegnerische Schüsse eingetragen
- *
- * Bedeutung der Symbole:
- * . | Wasser
- * # | Eigenes Schiff
- * X | Gegnerischer Treffer
- * O | Schuss ins Wasser
- *
- * Folgende Schiffe müssen platziert werden:
- * 1 Schlachtschiff (Länge 5)
- * 2 Kreuzer (Länge 4)
- * 3 Zerstörer (Länge 3)
- * 4 U-Boote (Länge 2)
- */
- private static char[][] ships = {
- {'.', '#', '#', '#', '#', '.', '.', '.', '.', '.'},
- {'.', '.', '.', '.', '.', '#', '#', '#', '#', '.'},
- {'.', '.', '.', '#', '.', '.', '.', '.', '#', '.'},
- {'.', '.', '.', '#', '.', '.', '.', '.', '#', '.'},
- {'#', '.', '.', '#', '.', '.', '.', '.', '#', '.'},
- {'#', '.', '.', '.', '.', '.', '.', '.', '#', '#'},
- {'.', '.', '#', '#', '#', '#', '.', '.', '.', '#'},
- {'.', '.', '.', '.', '.', '.', '#', '.', '.', '#'},
- {'.', '.', '.', '.', '.', '.', '#', '.', '.', '.'},
- {'.', '#', '#', '.', '.', '.', '.', '#', '#', '.'}
- };
- /**
- * Zweites Spielbrett, hier sind eigene Schüsse makiert
- *
- * Bedeutung der Symbole:
- * . | Wasser
- * X | Eigener Treffer
- * O | Schuss ins Wasser
- */
- private static char[][] shots = {
- {'.', '.', '.', '.', '.', '.', '.', '.', '.', '.'},
- {'.', '.', '.', '.', '.', '.', '.', '.', '.', '.'},
- {'.', '.', '.', '.', '.', '.', '.', '.', '.', '.'},
- {'.', '.', '.', '.', '.', '.', '.', '.', '.', '.'},
- {'.', '.', '.', '.', '.', '.', '.', '.', '.', '.'},
- {'.', '.', '.', '.', '.', '.', '.', '.', '.', '.'},
- {'.', '.', '.', '.', '.', '.', '.', '.', '.', '.'},
- {'.', '.', '.', '.', '.', '.', '.', '.', '.', '.'},
- {'.', '.', '.', '.', '.', '.', '.', '.', '.', '.'},
- {'.', '.', '.', '.', '.', '.', '.', '.', '.', '.'}
- };
- /**
- * Speichert, wie viele gegnerische Schiffe getroffen wurden.
- */
- private static int hitCount = 0;
- /**
- * Speichert, wie viele eigene Schiffe getroffen wurden.
- */
- private static int enemyHitCount = 0;
- /**
- * Fragt den Spieler so lange welche Aktion er ausführen will, bis das Spiel zuende ist.
- * Bei falschen Eingaben wird der Spieler aufgefordert, es nochmal zu versuchen.
- *
- * @param args Parameter von Kommandozeile (nicht genutzt)
- */
- public static void main(String[] args) {
- Scanner scanner = new Scanner(System.in);
- while (true) {
- //Spieler fragen, was er machen will
- System.out.print("\nWählen sie eine Aktion (attack | defend | exit): ");
- String action = scanner.nextLine();
- //Entsprechende Aktion ausführen
- if (action.equals("exit")) {
- System.out.println("Das Spiel wurde abgebrochen.");
- return;
- } else if (action.equals("attack")) {
- attack();
- } else if (action.equals("defend")) {
- defend();
- } else {
- System.out.println("Falsche Eingabe \"" + action + "\"! Nochmal.");
- }
- //Überprüfen, ob das Spiel zuende ist
- if (hitCount >= 30) {
- System.out.println("Spiel gewonnen!");
- return;
- }
- if (enemyHitCount >= 30) {
- System.out.println("Spiel verloren :(");
- return;
- }
- }
- }
- /**
- * Fragt den Spieler zuerst nach der Zeile und dann der Spalte, die er angreifen möchte.
- * Wurde bereits auf das Feld geschossen, wird die Aktion abgebrochen.
- *
- * Danach muss der Spieler eingeben, ob ein Schiff getroffen wurde.
- */
- public static void attack() {
- Scanner scanner = new Scanner(System.in);
- //Bisheriges Spielfeld ausgeben
- System.out.println("\nBisherige Treffer: ");
- print(shots);
- int row;
- int col;
- try {
- //Zeile abfragen
- System.out.print("Welche Zeile greifen sie an? (0 - 9): ");
- row = scanner.nextInt();
- //Spalte abfragen
- System.out.print("Welche Spalte greifen sie an? (0 - 9): ");
- col = scanner.nextInt();
- } catch (InputMismatchException e) {
- System.out.println("Falsche Eingabe! Aktion abgebrochen.");
- return;
- }
- //Feld muss innerhalb des Spielfelds liegen
- row = Math.min(Math.max(row, 0), 9);
- col = Math.min(Math.max(col, 0), 9);
- //Abbrechen falls bereits auf das Feld geschossen wurde
- if (shots[row][col] != '.') {
- System.out.println("Auf Feld " + row + " " + col + " wurde bereits geschossen!");
- return;
- }
- //Java-Fehler umgehen: Scanner::nextLine nach Scanner::nextInt gibt sofort lehre Zeile zurück
- scanner.nextLine();
- //Treffer abfragen
- System.out.print("Haben sie getroffen? (ja | nein): ");
- String hit = scanner.nextLine();
- //Treffer in Spielfeld eintragen
- if (hit.equals("ja")) {
- shots[row][col] = 'X';
- //Anzahl eigener Treffer erhöhen
- hitCount++;
- } else if (hit.equals("nein")) {
- shots[row][col] = 'O';
- } else {
- System.out.println("Falsche Eingabe \"" + hit + "\"! Aktion abgebrochen.");
- return;
- }
- //Neues Spielfeld ausgeben
- System.out.println("\nNeue Treffer: ");
- print(shots);
- }
- /**
- * Fragt den Spieler zuerst nach der Zeile und dann der Spalte ab, in der er angegriffen wird.
- * Überprüft anschließend ob ein Schiff getroffen wurde und gibt dies aus.
- *
- * Der Schuss wird dann in das Spielfeld eingetragen.
- */
- public static void defend() {
- Scanner scanner = new Scanner(System.in);
- int row;
- int col;
- try {
- //Zeile abfragen
- System.out.print("Welche Zeile wird angegriffen? (0 - 9): ");
- row = scanner.nextInt();
- //Spalte abfragen
- System.out.print("Welche Spalte wird angegriffen? (0 - 9): ");
- col = scanner.nextInt();
- } catch (InputMismatchException e) {
- System.out.println("Falsche Eingabe! Aktion abgebrochen.");
- return;
- }
- //Feld muss innerhalb des Spielfelds liegen
- row = Math.min(Math.max(row, 0), 9);
- col = Math.min(Math.max(col, 0), 9);
- //Treffer überprüfen
- if (ships[row][col] == 'X') {
- //Feld wurde bereits getroffen
- System.out.println("\nDer wurde bereits getroffen! Abgebrochen.");
- return;
- } else if (ships[row][col] == '#') {
- //Feld ist ein Schiff
- ships[row][col] = 'X';
- System.out.println("\nGetroffen! :(");
- //Anzahl gegnerischer Treffer erhöhen
- enemyHitCount++;
- } else {
- //Feld ist Wasser
- ships[row][col] = 'O';
- System.out.println("\nDer ging daneben!");
- }
- //Neues Spielfeld ausgeben
- print(ships);
- }
- /**
- * Gibt ein Spielfeld mit Zeilen- und Spaltennummern in der Console aus.
- *
- * @param grid Auszugebendes Spielfeld
- */
- public static void print(char[][] grid) {
- //Spaltennummern
- System.out.println("\\ 0 1 2 3 4 5 6 7 8 9");
- //Alle Zeilen ausgeben
- for (int i = 0; i < grid.length; i++) {
- //Zeilennnummer
- String row = "" + i;
- //Alle Spalten in dieser Zeile anfügen
- for (int j = 0; j < grid[i].length; j++) {
- row += " " + grid[i][j];
- }
- System.out.println(row);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement