/**
  *
  * Programmieraufgabe P-14 (Spiel Nim, nim.jar)
  *
  * @author Leonhard Fellermayr
  * @version 1.0
  *
  */

/** Implementierung der Klasse Haufen. */

public class Haufen {

	/** ***** VARIABLEN ***** */

	/**
	  *  @param MIN_STEINE Mindestanzahl von bereitgestellten Steinen beim Start
	  *  @param MAX_STEINE Hoechstanzahl von bereitgestellten Steinen beim Start
	  *
	  *  @param ERR_NO_ERROR Fehlercode fuer "Kein Fehler aufgetreten"
	  *  @param ERR_TOO_MANY Fehlercode fuer "Zu viele Steine entfernt"
	  *  @param ERR_TOO_LESS Fehlercode fuer "Zu wenige Steine entfernt"
	  *
	  *  @param anzahlSteine Aktuelle Anzahl Steine auf dem Haufen
	  *
	  */

	public final static int MIN_STEINE = 10;
	public final static int MAX_STEINE = 100;

	public final static int ERR_NO_ERROR = 0;
	public final static int ERR_TOO_MANY = 1;
	public final static int ERR_TOO_LESS = 2;

	private static int anzahlSteine;


	/** ***** PUBLIC METHODEN ***** */

	/**
	  *  getSpielstand () - Gib die Anzahl der derzeit auf dem Haufen befindlichen
	  *  Steine zurck.
	  *
	  *  @return Anzahl der Steine auf dem Haufen
	  *
	  */

	public static int getSpielstand () {

		return (anzahlSteine);			// Zugriff auf die Variable

	} // getSpielstand ()

	/**
	  *  istLeer () - Prft, ob der Haufen leer ist (0 Steine) oder nicht.
	  *
	  *  @return Boolescher Wert, der angibt, ob der Haufen leer ist (true)
	  *
	  */

	public static boolean istLeer () {

		return (getSpielstand () == 0);		// boolescher Vergleich

	} // istLeer ()

	/**
	 *  entferneSteine () - Entfernt die angegebene Anzahl Steine vom Haufen.
	 *  Dabei erfolgt Fehlerbehandlung fr weniger als 1 Stein sowie bei Eingaben,
	 *  die mehr als die Hlfte aller Steine reprsentieren.
	 *
	 *  @param anzahl Anzahl der zu entfernenden Steine
	 *  @return Fehlercode gemaess obiger Konstanten
	 *
	 */

	public static int entferneSteine (int anzahl) {

		/** Weniger als 1 Stein kann nicht entfernt werden. */

		if (anzahl < 1)
			return (ERR_TOO_LESS);

		/** Mehr als die Haelfte aller Steine darf nicht entfernt werden,
		  * es sei denn, es ist nur noch ein Stein da.
		  */

		else if ((anzahl > getSpielstand () / 2) && (anzahl != 1))
			return (ERR_TOO_MANY);

		/** Dekrementiere die Anzahl der Steine auf dem Haufen um die
		  * Anzahl der gerade eben entfernten Steine.
		  */

		anzahlSteine -= anzahl;

		/** Wenn wir hier angelangt sind, ist kein Fehler aufgetreten. */

		return (ERR_NO_ERROR);

	} // entferneSteine ()


	/** ***** KONSTRUKTOR der Klasse "Haufen" ***** */

	public Haufen () {

		/**  Ermittle einen Zufallswert fuer die Anzahl der Steine. Dieser
		  *  Wert muss im Intervall [MIN_STEINE..MAX_STEINE] liegen.
		  *
		  *  Wir verwenden den in der Klasse "Spiel" initialisierten
		  *  Zufallsgenerator.
		  *
		  */

		this.anzahlSteine = Spiel.gen.nextInt (MAX_STEINE - MIN_STEINE + 1) + MIN_STEINE;

	} // Konstruktor Haufen

} // Klasse Haufen