/**
  * Berechnungen - Sammlung von Methoden und Algorithmen
  *
  * Programm 			 : Nimm-Spiel
  * ----------------------------------------------------------------------------
  * Java Version		 : j2sdk1.4.2
  * Entwicklungsumgebung : JCreator LE Vers. 3.10.008
  * ----------------------------------------------------------------------------
  * @autor    		     : Mehmet-Ertan Cam
  * ----------------------------------------------------------------------------
  * @since   			 : 03.03.05 - Erstellung
  * @since				 : 10.03.05 - Kommentierung
  * ----------------------------------------------------------------------------
  * Dateiname			 : Berechnungen.java
  * @version  			 : 1.0
  * ----------------------------------------------------------------------------
  * Beschreibung		 : Methoden zur Berechnung von :
  *							- ankommenden Daten
  *							- Zufallszahlen
  *							- Strategien
  *							- Ausgabe mit entsprechendem Text, 
  *								um sie der Klasse Spieler bereitzustellen
  * ----------------------------------------------------------------------------
  */
  
  import java.util.*; 			// zur Erzeugung von Zufallszahlen


class Berechnungen 
{	

	// Variablendeklaration
	private int spNimmt,
				anzahl,
				höchstzahl,
				bestandNachSp,
				bestandNachComp,
				zufallszahl,
				probezahl,
				laufvar,
				aktuelleZahl=0;
					
  /**---------------------------------------------------------------------------
	* Konstruktor - Berechnungen
	* 
	* erhält folgende Werte von Klasse Spiel :
	*
	* @param anzahl 		(int) : Anzahl der Streichhölzer
	* @param höchstzahl 	(int) : Anzahl, der weggenommen werden darf
	* @param spNimmt	    (int) : Anzahl, der vom Spieler weggenommen wird
	* --------------------------------------------------------------------------
    */	
	public Berechnungen (int anzahl,int höchstzahl,int spNimmt)
	{
		this.anzahl = anzahl;
		this.höchstzahl = höchstzahl;
		this.spNimmt = spNimmt;
	}
	
  /** --------------------------------------------------------------------------
	* Methode - gibBestand
	*
	* Der Bestand der Streichhöler nach dem Spielzug des Spielers wird ermittelt
	* --------------------------------------------------------------------------
	*/	
	public void gibBestand()
	{
		bestandNachSp = anzahl - spNimmt;
	}
	
  /** --------------------------------------------------------------------------
	* Methode - gibBestandComp
	*
	* Methode probe wird aufgerufen;
	* Der Bestand der Streichhöler nach dem Spielzug des Computers wird ermittelt
	* und zurückgegeben;
	*
	* @return bestandNachComp (int) 
	* --------------------------------------------------------------------------
    */		
	public int gibBestandComp()
	{
		probe();
		bestandNachComp = bestandNachSp - aktuelleZahl;
		return bestandNachComp;
	}
	
  /** --------------------------------------------------------------------------
	* Methode - probe
	*
	* Hier wird entschieden, wieviel Hölzchen der Computer nimmt;
	* Methode stragtegie wird aufgerufen;
	*
	* aktuelleZahl wird auf seinen Inhalt geprüft;
	* Wenn dieser grösser 0 ist (also die strategische Zahl ermittelt werden konnte),
	*   behält er seinen aktuellen Wert bei;
	* Wenn nicht, wird die Methode erfasseZufall aufgerufen und
	*   eine Zufallszahl wird auf aktuelleZahl übertragen;
	* --------------------------------------------------------------------------
    */		
	public void probe()
	{
		strategie();
		if (aktuelleZahl>0)	
			aktuelleZahl=aktuelleZahl;
						
		else 
		{
			erfasseZufall();
			aktuelleZahl=zufallszahl;
		}
	}
	
  /** --------------------------------------------------------------------------
	* Methode - strategie
	*
	* laufvar wir auf 1 gesetzt;
	* In einer do-while Schleife wird (wenn möglich) die strategisch wichtige Zahl ermittelt;
	* --------------------------------------------------------------------------
    */	
	public void strategie()
	{
	
		laufvar=1;
		
		do
		{
			int probezahl = (bestandNachSp - laufvar) % (höchstzahl+1);
				
				if (probezahl==0)
				{
					aktuelleZahl=laufvar;
					laufvar=laufvar+höchstzahl;
				}
			
				else
				{
					laufvar++;
				}
		}
		while(laufvar<=höchstzahl);
	
	} 
	
	
  /** --------------------------------------------------------------------------
	* Methode - erfasseZufall
	*
	* Ein Objekt (zufall) wird erzeut,
	*   um schliesslich eine Zufallszahl (zwischen 1 und höchstzahl) zu generieren;
	* --------------------------------------------------------------------------
    */
	public void erfasseZufall()
	{
		Random zufall = new Random();
		zufallszahl = 1 + Math.abs(zufall.nextInt()) % höchstzahl;
	}

  /** --------------------------------------------------------------------------
	* Methode - ausgabe
	*
	* Die einzelnen Methoden werden aufgerufen, 
	* um anschliessend die Ausgabe bereitzustellen und zurückzugeben;
	* 
	* @return (String): Ergebnisse der Berechnung als Zusammenfassung mit entsprechendem Text;
	* --------------------------------------------------------------------------
    */
	public String ausgabe()
	{
	  gibBestand();
	  gibBestandComp();
	  probe();
	  
	  return ("\n Sie nehmen : " + spNimmt + "\n Bestand an Hölzchen : " + bestandNachSp + "\n ------------------------------------\n Computer nimmt : " + aktuelleZahl + "\n Bestand an Hölzchen : " + bestandNachComp + "\n ------------------------------------");
	}
	
} // end of class Berechnungen


