Schiffe versenken in Java

closeDieser Beitrag wurde vor über 3 Monaten veröffentlicht. Die darin beschriebenen Informationen sind mit Vorsicht zu geniessen, da sie bereits veraltet oder nicht mehr gültig sein könnten. Solltest du von Neuerungen oder Verbesserungen wissen, so freue ich mich über einen klärenden Kommentar.

Als Prüfungsvorbereitung kämpfe ich mich zur Zeit ein kleinwenig mit Java ab. Zum Glück noch nichts mit GUI, etc, einfach Java Basics, wie in den letzten zwei Büchern, die ich vorgestellt hatte. Im Zuge dieser Vorbereitung ist ein Programm entstanden, dass ich euch nicht vorenthalten möchte, vielleicht gibt es ja die eine oder andere Verbesserung oder Kritik, oder es hilft sonst jemandem auf seinem Weg.

Das Projekt besteht aus drei Klassen: Game, für die Hauptklasse, Schiffe, für die Schiffe und Feld, für die einzelnen Felder.
Die Schiffe-Klasse beinhaltet einen Namen und da Arrays immer so viel Vorplanung voraussetzen, eine Arraylist:

import java.util.ArrayList;

public class Schiffe {
	int name;
	ArrayList<Feld> position = new ArrayList<Feld>();
}

Auch die Feld-Klasse ist ganz schlicht, nur mit einem zusätzlichen Konstruktor:

public class Feld {
	int x;
	int y;
	int orientation;
	
	public Feld(int x, int y) {
		this.x = x;
		this.y = y;
	}
}

Interessant wird es in der Game-Klasse. Es gibt eine Methode positioning(), welche die Schiffe setzt. Darin werden auch gleich doppelt belegte Felder geprüft. Weiter gibt es eine Methode play(), welche für die Spieler 1 und 2 nacheinander die Methode shoot() aufruft, und darin gleich die Referenzen auf die Feld- und zum Schluss auch noch auf die Schiff-Objekte löscht. Ist ein Schiff versenkt, so wird die Methode win() aufgerufen, welche checkt, ob jemand gewonnen hat und bei bedarf, das Spiel unterbricht. Gar nicht so kompliziert oder? ;)

import java.util.Scanner;

public class Game {

	static Schiffe[] player1 = new Schiffe[3];
	static Schiffe[] player2 = new Schiffe[3];
	static Scanner s = new Scanner(System.in);

	static int player = 1;
	static int ships_player1 = 0;
	static int ships_player2 = 0;
	static int temp_x;
	static int temp_y;
	static boolean running = true;

	public static void main(String[] args) {
		System.out.println("GAME STARTED");
		positioning();
		play();
	}

	private static void play() {
		while (running) {
			if (running) {
				shoot(1);
			}
			if (running) {
				shoot(2);
			}
		}
		System.out.println("Player " + player + " WINNER!!");
	}

	private static void shoot(int gamer) {
		System.out.println("Player " + gamer + " enter your shoot [01]:");
		String input = s.next();
		int x = input.charAt(0) - 48;
		int y = input.charAt(1) - 48;

		if (gamer == 1) {
			for (int v = 0; v < ships_player2; v++) {
				while (v < ships_player2 && player2[v] == null) {
					v++;
				}
				if (v >= ships_player2) {
					break;
				}
				for (Feld entry : player2[v].position) {
					if (entry.x == x && entry.y == y) {
						player2[v].position.remove(entry);
						if (player2[v].position.isEmpty()) {
							System.out.println("HIT! You destroied a " + player2[v].name + " field battleship");
							player2[v] = null;
							win(gamer);
						} else {
							System.out.println("HIT!! You hit a " + player2[v].name + " field battleship");
						}
						break;
					}
				}
			}
		} else {
			for (int v = 0; v < ships_player1 && running; v++) {
				while (v < ships_player1 && player1[v] == null) {
					v++;
				}
				if (v >= ships_player1) {
					break;
				}
				for (Feld entry : player1[v].position) {
					if (entry.x == x && entry.y == y && running) {
						player1[v].position.remove(entry);
						if (player1[v].position.isEmpty()) {
							System.out.println("HIT! You destroied a " + player1[v].name + " field battleship");
							player1[v] = null;
							win(gamer);
						} else {
							System.out.println("HIT!! You hit a " + player1[v].name + " field battleship");
						}
						break;
					}
				}
			}
		}
	}

	private static void win(int gamer) {
		if (gamer == 1) {
			int i = 0;
			if (player2[i++] == null && player2[i++] == null && player2[i] == null) {
				running = false;
				player = gamer;
			}
		} else {
			int i = 0;
			if (player1[i++] == null && player1[i++] == null && player1[i] == null) {
				running = false;
				player = gamer;
			}
		}
	}

	private static void positioning() {
		for (player = 1; player <= 2; player++) {
			for (int i = 2, k = 0; i <= 4; i++, k++) {
				System.out.println("Player " + player + " please enter a Startpoint XY and a Orientation for " + i + " field battleship [10s]:");
				String input = s.next();
				input = input.toUpperCase();
				if (input.length() == 3) {
					int x = (int) input.charAt(0) - 48;
					int y = (int) input.charAt(1) - 48;
					int orientation = (int) input.charAt(2);
					boolean doppelt = false;

					if (player == 1) {
						player1[k] = new Schiffe();
						player1[k].name = i;
					} else {
						player2[k] = new Schiffe();
						player2[k].name = i;
					}

					if (k > 0) {
						if (player == 1) {
							if (orientation == 86 || orientation == 83) {
								temp_y = y - 1;
								temp_x = x;
							} else {
								temp_x = x - 1;
								temp_y = y;
							}
							for (int v = 0; v <= k; v++) {
								if (orientation == 86 || orientation == 83) {
									temp_y++;
								} else {
									temp_x++;
								}
								for (Feld entry : player1[v].position) {
									if (entry.x == temp_x && entry.y == temp_y) {
										doppelt = true;
										i--;
										k--;
										System.out.println("ERROR - double used field, please enter another!");
										break;
									}

								}
							}
						} else {
							for (int v = 0; v <= k; v++) {
								int temp_x = x;
								int temp_y = y;
								for (Feld entry : player2[v].position) {
									if (entry.x == temp_x && entry.y == temp_y++) {
										doppelt = true;
										i--;
										k--;
										System.out.println("ERROR - double used field, please enter another!");
										break;
									}
								}
							}
						}
					}

					if (!doppelt) {
						if (player == 1) {
							ships_player1++;
						} else {
							ships_player2++;
						}

						for (int j = 0; j < i; j++) {
							if (orientation == 86 || orientation == 83) {
								if (player == 1) {
									player1[k].position.add(new Feld(x, y));
									y++;
								} else {
									player2[k].position.add(new Feld(x, y));
									y++;
								}
							} else {
								if (player == 1) {
									player1[k].position.add(new Feld(x, y));
									x++;
								} else {
									player2[k].position.add(new Feld(x, y));
									x++;
								}
							}
						}
					}
				} else {
					System.out.println("Please enter a position x (0-9), position y (0-9) and an orientation s, v, h or w");
					i--;
					k--;
				}
			}
		}
	}
}

Und nun liebe Java-Experten, legt los ;-)

close
Immer informiert sein dank meines RSS Feeds.Oder folge mir via Twitter!

4 Gedanken zu „Schiffe versenken in Java

  1. Beat

    weiter so!
    hast du spass am programmieren?
    (du könntest noch eine klasse player machen gegen den du dann spielst:-)

    Antworten

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <b> <blockquote cite=""> <cite> <del datetime=""> <em> <i> <pre lang="" line="" escaped=""> <strong>