Fun Stuff > CLIKC
A programming thread!
ankhtahr:
the class which is actually my task to write. It's supposed to model the field and the rules of the game.
Here's the whole task if anybody's interested. I don't feel like translating it this time…
(click to show/hide)
--- Quote ---A Schiffe versenken (15 Punkte)
Ihre Aufgabe ist die Implementierung einer vereinfachten Version des Spiels Schiffe versenken. Bei diesem Spiel besteht das Spielfeld aus einem Rechteck von n mal m Feldern, auf denen Schiffe positioniert werden können. Es gibt unterschiedliche Schiffstypen, die sich in der Größe der Schiffe unterscheiden. Um die Schiffe zu versenken, werden Bomben über den Feldern des Spielfeldes abgeworfen.
Ein Schiff ist versenkt, wenn über allen von diesem Schiff belegten Feldern jeweils mindestens eine Bombe abgeworfen wurde. Es gibt vier verschiedene Schiffstypen: Minensucher der Länge 1, Schlachtschiffe der Länge 2, Großkampfschiffe der Länge 3 und Flugzeugträger der Länge 4. Die Breite der Schiffe ist immer 1.
Für die Schistypen und Himmelsrichtungen verwenden Sie die beiden vorgegebenen Enums Direction und ShipType.
Jedes Feld wird über seine Position (die Koordinaten) im Spielfeld angesprochen, wobei die oberste linke Ecke der nord-westlichsten Koordinate (0, 0) und die unterste rechte Ecke der süd-östlichsten Koordinate (n − 1, m − 1) entspricht. Die erste Koordinate (im folgenden x) bezieht sich immer auf die Breite, während sich die zweite Koordinate (im folgenden y) auf die Höhe bezieht. Geben Sie Ihre Klassen im Paket battleship ab und dokumentieren Sie sie genau. Achten Sie ab sofort auf geeignete Sichtbarkeiten, aussagekräftige Bezeichnernamen und sinnvolle Kommentare.
Ihre zu implementierende Klasse soll das Spielfeld modellieren und die Spiellogik enthalten. Schreiben Sie dazu die Klasse Sea und implementieren Sie die folgenden Methoden.
public Sea(int width, int height)
Der Konstruktor erstellt ein neues Spielfeld der angegebenen Größe, wobei die Breite von Ost nach West und die Höhe von Nord nach Süd verläuft. Beim Anlegen eines Spielfeldes wird dessen Größe dauerhaft festgelegt. Anfangs ist kein Feld bombardiert und alle Felder enthalten nur Wasser.
boolean addShip(ShipType type, Direction dir, int x, int y)
Die Methode addShip fügt ein neues Schiff des angegebenen Typs hinzu.
Anhand der übergebenen Parameter wird überprüft, ob das Schiff an dieser Position überhaupt platziert werden kann. Dazu müssen sich alle vom Schiff belegten Felder innerhalb der Spielfeldgrenzen benden und dürfen noch nicht von anderen Schiffen belegt sein.
Außerdem darf das Bombardement noch nicht begonnen haben.
An der angegebenen Koordinate (x, y) befindet sich das Schiffsende und von dort ausgehend erstreckt sich das Schiff mit seiner Typ-spezischen Länge in die angegebene Richtung.
Falls das Schiff nicht hinzugefügt werden kann, soll false zurückgegeben werden.
boolean dropBomb(int x, int y)
Die Methode dropBomb dient dem Abwerfen einer Bombe. Falls ein Schiff an einer noch nicht bombardierten Stelle getroffen wird, gibt sie true zurück.
boolean allShipsSunk()
Die Methode allShipsSunk gibt true zurück, wenn alle Schiffe vollständig versenkt sind.
String toStringWithShips()
Diese Methode gibt einen String zurück, der das Spielfeld mit den Schiffen darauf darstellt. Jedes Feld wird durch ein Zeichen im String repräsentiert, Wasser durch ".", ein Schiffsfeld durch die Ziffer der Länge des entsprechenden Schiffs.
String toStringWithBombs()
Die Methode toStringWithBombs() liefert das Spielfeld aus Sicht des Angreifers mit einer Darstellung der bombardierten Felder zurück. Die Schiffe werden nicht dargestellt, unbombardierte Felder werden als "." dargestellt, Bomben auf Wasser durch "O" und solche auf Schiffe durch "X".
--- End quote ---
Masterpiece:
Oh man I'm reading through the Map-API and IT WOULD HAVE WORKED SO WELL HERE.
Masterpiece:
Oh but that is easy! If the access to the actual array is private, just write a public 'setCell' method. This could look like this:
(I am assuming an int array as a datastructure)
--- Code: ---private int[][] field;
...
public void setCell(int x, int y, int state) throws IndexOutOfBoundsException{
this.field[x][y] = state;
}
--- End code ---
The Index out of Bounds exception is just for debug, if you falsely input a higher index into the array than it has indices.
You could also give the setCell method different parameters:
--- Code: ---private int[][] field;
...
public void setCell(int x, int y, Ship ship) throws IndexOutOfBoundsException{
this.field[x][y] = ship.toString();
}
--- End code ---
Everything's possible!
ankhtahr:
In addition to this I have now created a getter and setter which set an entire row. Makes some things easier, and I don't have to write that iteration multiple times.
Also I added the task in my previous message.
Edit:
seriously, not using java.util makes anything ridiculous:
--- Code: (java) ---Ship[] afterAdd = new Ship[this.shipCount + 1];
for (int i = 0; i < this.shipCount; i++) {
afterAdd[i] = this.ships[i];
}
afterAdd[this.shipCount + 1] = new Ship(type, dir, x, y, this);
this.ships = afterAdd;
--- End code ---
Masterpiece:
can you tell me how ShipType and Direction look like? I'm writing a solution for your task, it's not that difficult.
edit: Nevermind, I wrote them on my own.
second edit: It would be so great if you could modify the shiptype enum.
Navigation
[0] Message Index
[#] Next page
[*] Previous page
Go to full version