package spiel;

import java.io.Serializable;
import java.util.Vector;

/** 
 * Modelliert Würmer.
 * Änderungen gegenüber früher:
 * als Klasse implementiert, benutzt unparametrisierte Koordinaten-Klasse
 *
 * @version 1.3
 * @author ProgPrak-Team
 */
public final class Wurm extends Vector<Koordinaten> implements Serializable {

    // für Serialisierung
    private static final long serialVersionUID = 13L;

    /** Liefert die Koordinaten des Kopfs. */
    public Koordinaten  kopf() {
	return firstElement();
    }

    /** Liefert die Koordinaten des letzten Segments. */
    public Koordinaten ende() {
	return lastElement();
    }

    /** Liefert die Koordinaten eines beliebigen Segments. 
     *  @param i das Segment, beginnend mit dem Kopf (i=0)
     *  @throws KeinGueltigesSegmentException selbsterklärend
     */
    public Koordinaten segment(int i) throws KeinGueltigesSegmentException {
	if (0<=i && i<laenge()) return get(i);
	else throw new KeinGueltigesSegmentException("Der Wurm hat nur " +
						     "die Länge "+laenge());
    }

    /** Liefert den gesamten Wurm beginnend mit dem Kopf. 
     *  (Nur vorhanden wegen Verträglichkeit mit alter Fassung.)
     */
    public Vector<Koordinaten> wurm() {
	return this;
    }

    /** Liefert die Länge des Wurms. */
    public int laenge() {
	return size();
    }

    /** Bewegt einen Wurm um ein Feld in die angegebene {@link Richtung}.
     *  @throws WurmAutokarambolageException falls der Wurm dadurch auf ein
     *          Feld ziehen würde, welches er selbst zur Zeit schon belegt
     */
    public void bewege(Richtung richtung) throws WurmAutokarambolageException {
	Koordinaten neuerKopf =
	    new Koordinaten(kopf().koordinateX()+richtung.getDeltaX(),
			    kopf().koordinateY()+richtung.getDeltaY());
	if (contains(neuerKopf)) throw new WurmAutokarambolageException();
	else {
	    removeElement(ende());
	    add(0,neuerKopf);
	}
    }

}
