Class Field

java.lang.Object
  |
  +--Field

public class Field
extends Object

Klasse fuer ein Schiffe-Versenken-Spielfeld. Diese Klasse kann benutzt werden, um seine eigenen Schiffe zu positionieren und anzuzeigen, und gleichzeitig auch zur Speicherung des gegnerischen Spielfeldes, auf dem dann die Treffer markiert werden koennen. Saemtliche Zustaende und Belegungen der Felder eines Spielfeldes werden in einem zweidimensionalen Array abgespeichert. Diese Klasse enthaelt Methoden zum Zugriff und zur Manipulation dieser Felder.


Field Summary
static int bigship
          Feldbelegung: groesstes Schiff
static int size
          Groesse des Spielfeldes in Feldern (quadratisch)
static int smallship
          Feldbelegung: kleinstes Schiff
static int water
          Feldbelegung: Wasserfeld
 
Constructor Summary
Field()
           
 
Method Summary
 void clear()
          Loescht den Inhalt alle Felder, so dass ein leeres Spielfeld ohne Schiffe vorhanden ist.
 int getNeighbours(int row, int col)
          Gibt die Anzahl der Schiffsfelder in der Nachbarschaft eines Wasserfeldes an.
 int getShip(int row, int col)
          Liefert die Belegung des Feldes (bzw. den Schiffstyp) an der uebergebenen Position.
 boolean isAfloat(int row, int col)
          Fragt ab, ob sich an der uebergebenen Position ein noch nicht getroffenes, also "schwimmendes" Schiffsteil befindet.
 boolean isFree(int row, int col)
          Fragt ab, ob die uebergebene Position ein freies, unbeschossenes Wasserfeld ohne horizontale, vertikale oder diagonale Beruehrung eines vorhandenen Schiffes ist.
 boolean isHit(int row, int col)
          Fragt ab, ob die uebergebene Position schon beschossen (das heisst bei Schiffen: getroffen) worden ist.
 boolean isShip(int row, int col)
          Fragt ab, ob sich an der uebergebenen Position ein Schiff befindet.
 void manual_init(GameWindowInterface win)
          Ermoeglicht dem Spieler die manuelle Positionierung aller fuenf Schiffe.
 int query_ship(int s)
          Liefert die verbleibende Groesse bzw. den nichtgetroffenen Anteil des uebergebenen Schiffstyps.
 int query_ships()
          Liefert die aktuelle Anzahl nichtversunkener Schiffe, die sich noch auf dem Spielfeld befinden.
 void random_init()
          Initialisiert alle Felder zufaellig, d.h. es werden alle fuenf Schiffe zufaellig verteilt, ohne dabei die Regel zu verletzen, dass die Schiffe sich horizontal, vertikal oder diagonal nicht beruehren duerfen.
 void setHit(int row, int col)
          Setzt das Feld an der uebergebenen Position auf "getroffen".
 void setHit(int row, int col, boolean val)
          Setzt das Feld an der uebergebenen Position auf "getroffen" bzw.
 void setShip(int row, int col, int val)
          Setzt die Belegung des Feldes an der uebergebenen Position.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

size

public static final int size
Groesse des Spielfeldes in Feldern (quadratisch)

water

public static final int water
Feldbelegung: Wasserfeld
See Also:
getShip(int, int)

smallship

public static final int smallship
Feldbelegung: kleinstes Schiff
See Also:
getShip(int, int)

bigship

public static final int bigship
Feldbelegung: groesstes Schiff
See Also:
getShip(int, int)
Constructor Detail

Field

public Field()
Method Detail

clear

public void clear()
Loescht den Inhalt alle Felder, so dass ein leeres Spielfeld ohne Schiffe vorhanden ist. ACHTUNG: Anschliessend repaint() beim Fenster erforderlich (wenn das Spielfeld bereits dargestellt wird)!

query_ships

public int query_ships()
Liefert die aktuelle Anzahl nichtversunkener Schiffe, die sich noch auf dem Spielfeld befinden. Wenn nur Teile eines Schiffes getroffen sind, gilt dieses noch nicht als versunken und wird mitgezaehlt.
Returns:
Anzahl der nichtversunkenen Schiffe. Wenn 0 zurueckgegeben wird, dann sind alle Schiffe versunken und das Spiel muss beendet werden.

query_ship

public int query_ship(int s)
Liefert die verbleibende Groesse bzw. den nichtgetroffenen Anteil des uebergebenen Schiffstyps. Der Schiffstyp auf einer Position im Spielfeld kann durch die Methode getShip(row, col) ermittelt werden. Die Groesse liegt zwischen 0 und der maximalen Groesse des Schiffes. Eine 0 als Rueckgabewert bedeutet, dass das Schiff nicht oder nicht mehr existiert (bzw. versunken ist).
Parameters:
s - Schiffstyp. Der Wert muss zwischen den Werten fuer smallship und bigship liegen
Returns:
verbleibende Groesse bzw. nichtgetroffenen Anteil des uebergebenen Schiffes in Feldern
See Also:
getShip(int, int)

getShip

public int getShip(int row,
                   int col)
Liefert die Belegung des Feldes (bzw. den Schiffstyp) an der uebergebenen Position. Der zurueckgelieferte Wert ist Field.water fuer ein Wasserfeld bzw. Field.smallship...Field.bigship fuer ein Schiffsfeld.
Parameters:
row - Spielfeldzeile
col - Spielfeldspalte
Returns:
Feldbelegung an der gegebenen Position

isShip

public boolean isShip(int row,
                      int col)
Fragt ab, ob sich an der uebergebenen Position ein Schiff befindet. ACHTUNG: Sowohl schon getroffene als auch noch nicht getroffene Schiffsfelder liefern hier true!
Parameters:
row - Spielfeldzeile
col - Spielfeldspalte
Returns:
true wenn sich ein Schiff an der gegebenen Position befindet

isAfloat

public boolean isAfloat(int row,
                        int col)
Fragt ab, ob sich an der uebergebenen Position ein noch nicht getroffenes, also "schwimmendes" Schiffsteil befindet.
Parameters:
row - Spielfeldzeile
col - Spielfeldspalte
Returns:
true wenn sich ein intaktes Schiffsteil an der gegebenen Position befindet

isHit

public boolean isHit(int row,
                     int col)
Fragt ab, ob die uebergebene Position schon beschossen (das heisst bei Schiffen: getroffen) worden ist.
Parameters:
row - Spielfeldzeile
col - Spielfeldspalte
Returns:
true wenn das Feld schon beschossen (bzw. getroffen) wurde

getNeighbours

public int getNeighbours(int row,
                         int col)
Gibt die Anzahl der Schiffsfelder in der Nachbarschaft eines Wasserfeldes an. Die Nachbarschaft eines Feldes besteht aus allen horizontal, vertikal und diagonal direkt angrenzenden Feldern. Wenn in dieser Nachbarschaft eines Wasserfeldes ein oder mehrere Schiffsfelder liegen, darf gemaess der Plazierungsregel kein neues Schiff dorthin gelegt werden! Fuer - getroffene oder nicht getroffene - Schiffsfelder wird immer 0 zurueckgeliefert.
Parameters:
row - Spielfeldzeile
col - Spielfeldspalte
Returns:
Anzahl der belegten Nachbarfelder

isFree

public boolean isFree(int row,
                      int col)
Fragt ab, ob die uebergebene Position ein freies, unbeschossenes Wasserfeld ohne horizontale, vertikale oder diagonale Beruehrung eines vorhandenen Schiffes ist. Nur in solche Felder darf beim Plazieren ein weiteres Schiff gelegt werden!
Parameters:
row - Spielfeldzeile
col - Spielfeldspalte
Returns:
true wenn "freies" Wasserfeld

setShip

public void setShip(int row,
                    int col,
                    int val)
Setzt die Belegung des Feldes an der uebergebenen Position. Fuer ein Wasserfeld wird Field.water angegeben, fuer ein Schiffsfeld eine Zahl zwischen Field.smallship und Field.bigship. ACHTUNG: Anschliessend repaint() beim Fenster erforderlich (wenn das Spielfeld bereits dargestellt wird)!
Parameters:
row - Spielfeldzeile
col - Spielfeldspalte
val - neue Feldbelegung an der gegebenen Position (Field.water oder Zahl zwischen Field.smallship und Field.bigship)
See Also:
water, smallship, bigship

setHit

public void setHit(int row,
                   int col,
                   boolean val)
Setzt das Feld an der uebergebenen Position auf "getroffen" bzw. "nicht getroffen". Mit false wird das Feld als nicht beschossen (und damit auch nicht getroffen) markiert, mit true als beschossen (fuer ein Schiffsfeld also getroffen). ACHTUNG: Anschliessend repaint() beim Fenster erforderlich (wenn das Spielfeld bereits dargestellt wird)!
Parameters:
row - Spielfeldzeile
col - Spielfeldspalte
val - setzt das Feld an der gegebenen Position auf "getroffen" (true) bzw. "nicht getroffen" (false)

setHit

public void setHit(int row,
                   int col)
Setzt das Feld an der uebergebenen Position auf "getroffen". Entspricht also setHit(row, col, true). ACHTUNG: Anschliessend repaint() beim Fenster erforderlich (wenn das Spielfeld bereits dargestellt wird)!
Parameters:
row - Spielfeldzeile
col - Spielfeldspalte
See Also:
setHit(int, int, boolean)

random_init

public void random_init()
Initialisiert alle Felder zufaellig, d.h. es werden alle fuenf Schiffe zufaellig verteilt, ohne dabei die Regel zu verletzen, dass die Schiffe sich horizontal, vertikal oder diagonal nicht beruehren duerfen. ACHTUNG: Anschliessend repaint() beim Fenster erforderlich (wenn das Spielfeld bereits dargestellt wird)!

manual_init

public void manual_init(GameWindowInterface win)
Ermoeglicht dem Spieler die manuelle Positionierung aller fuenf Schiffe. Dazu muss dieser Methode eine Referenz auf das GameWindow uebergeben werden, damit die noetigen Ein- und Ausgaben gemacht werden koennen. Der Benutzer setzt das jeweils angegebene Schiff mit der Maus auf eine freie Position. Hierbei muss durch den ersten Mausklick die Position des ersten Feldes eines Schiffes gesetzt werden und mit dem zweiten Mausklick erfolgt die Angabe der Richtung, in der das Schiff liegen soll. Wenn mit der Maus auf ein bereits belegtes Feld geklickt wird, dann wird dieses geloescht und kann erneut positioniert werden.
Parameters:
win - GameWindow, das zu diesem Spielfeld gehoert
See Also:
GameWindow