/**
 * Spielleiter fuer das Wuerfelspiel Dice (Wuerfelpoker) .
 * Es werden die Mitspieler verwaltet, der aktuelle Spieler gespeichert, die Wuerfel erzeugt.
 *
 * @version 1.0 vom 08.10.2012
 * @author Thomas Schaller  und Thomas Ningelgen
 */
import java.math.*;

public class Dice {

    // Anfang Attribute
    private Spieler[] spieler = new Spieler[2];   // Referenz auf die Spieler
    private Wuerfel[] wuerfel = new Wuerfel[5];   // Referenz auf die Wuerfel
    protected int amZug;
    private int[] anzahlZahl = new int[6];        // Speichert die Anzahl der jeweiligen Wuerfe: {3,0,0,2,1,0} 
    // bedeutet: 3 1-er, 0 2-er, 0 3-er, 2 4-er, 1 5-er, 0 6-er
    // Ende Attribute

    /** Erzeugt den Spielleiter fuer Dice. Es werden auch die notwendigen zwei Wuerfel erzeugt.
     */
    // fuenf Wuerfel erzeugen
    public Dice() {
        for (int i = 0;i<5 ;i++ ) {
            this.wuerfel[i] = new Wuerfel() ;
        } // end of for
    } 

    // Anfang Methoden
    /** Meldet einen Spieler beim Spielleiter an. Der Spieler wird darueber informiert, wer der Spielleiter ist.
     * @param s Spieler, der angemeldet werden soll.
     */
    public void setSpieler(Spieler s) {
        s.setSpielleiter(this);
        if (spieler[0] == null) {
            spieler[0] = s;
        } else {
            spieler[1] = s;
        }// end of if
    }

    //Wertet den letzten Wuerfelwurf aus. Der Punktewert beruecksichtigt die verschiedenen Wertigkeiten der Wuerfe bei Dice
    public void auswerten() {
        if (spieler[0].gesamtEinsatz > spieler[1].gesamtEinsatz) {    //zweiter Spieler zieht nicht mit  
            spieler[0].guthaben +=  spieler[0].gesamtEinsatz - spieler[1].gesamtEinsatz ; // Nicht akzeptierter Einsatz zurueckgebucht 
            spieler[0].gesamtEinsatz = spieler[1].gesamtEinsatz ; // Gesamteinsatz angepasst
            spieler[0].gewonnen(); spieler[1].verloren();
            spielBeenden();

        } 
        if (spieler[0].gesamtEinsatz < spieler[1].gesamtEinsatz) {    //erster Spieler zieht nicht mit      
            spieler[1].guthaben +=  spieler[1].gesamtEinsatz - spieler[0].gesamtEinsatz ; // Nicht akzeptierter Einsatz zurueckgebucht 
            spieler[1].gesamtEinsatz = spieler[0].gesamtEinsatz ; // Gesamteinsatz angepasst
            spieler[1].gewonnen(); spieler[0].verloren();
            spielBeenden();
        } 
        if (spieler[0].gesamtEinsatz == spieler[1].gesamtEinsatz) {     //Normalfall: Einsuetze gleich
            // Initialisierung
            for (int i = 0;i<6 ;i++ ) {
                anzahlZahl[i] = 0;
            } // end of for
            spieler[amZug].punkte = 0;                    
            // zuehlen wieviele von jeder mueglichen Zahl j+1
            for (int j = 0;j<6 ;j++ ) {              
                //j+1-er Wuerfe zuehlen
                for (int i = 0;i<5 ; i++) {             
                    if (getWuerfel(i).wurf == j+1) {
                        anzahlZahl[j] = anzahlZahl[j]+1;          
                    } // end of if
                } // end of i-for
            } // end of j-for
            spieler[amZug].wurfNummer += 1;
            //Gesamtpunktzahl berechnen  
            for (int k = 0;k<6 ;k++ ) {
                spieler[amZug].punkte = spieler[amZug].punkte + (int) ((k+1)*Math.pow(10,(anzahlZahl[k]-1)));
            }  
        } // end of if  
    }

    /** liefert eine Referenz auf einen Wuerfel
     * @param nr Nummer des gewuenschten Wuerfels
     * @return Referenz auf den Wuerfel
     */
    public Wuerfel getWuerfel(int nr) {
        return wuerfel[nr];
    }

    /** liefert eine Referenz auf den Spieler der am Zug ist
     * @return Referenz auf den Spieler
     */
    public Spieler getSpielerAmZug() {
        return spieler[amZug];
    }

    public void gewinnFeststellen() {
        if (spieler[0].punkte > spieler[1].punkte) {spieler[0].gewonnen(); spieler[1].verloren();} 
        if (spieler[0].punkte < spieler[1].punkte) {spieler[1].gewonnen(); spieler[0].verloren();} 
        spielBeenden();

    }

    public void spielBeenden() {
        spieler[0].punkte = 0; spieler[1].punkte = 0;
        spieler[0].wurfNummer = 0; spieler[1].wurfNummer = 0; 
    }

    // Ende Methoden
} // end of Dice
