package de.uulm.progwerkstatt.observer;
import java.util.*;

public class ObserverSpiel {
	
	/**
	 * main-Methode, wird aufgerufen, bei Application Start
	 * 
	 * @param args String mit Argumenten, der nicht genutzt wird.
	 */
	public static void main(String[] args) {
		//neues Spiel erstellen
		Spiel s = new Spiel();
		
		//Spielfiguren dem Spiel hinzufügen
		s.addObserver(new Spielfigur("gelb", s));
		s.addObserver(new Spielfigur(" rot", s));
		s.addObserver(new Spielfigur("grün", s));
		s.addObserver(new Spielfigur("blau", s));
		
		//Spiel starten
		s.spielstart();
	}
}


class Spiel extends Observable {

	private boolean laeuft = true;
	
	/**
	 * Methode, die solange läuft, bis eine Spielfigur gewonnen hat und dies dem Spiel mitteilt
	 *
	 */
	public void spielstart() {
		while (true) {
			if (!laeuft)
				break;
			try {
				Thread.sleep(1000);
				setChanged();
				notifyObservers();
			} catch (Exception e) {
			}
		}
	}
	
	//Bricht, durch setzen der Variable laeuft auf false, die Schleife des Spiels ab.
	public void gewonnen () {
		laeuft = false;
	}
}


class Spielfigur implements Observer {
	String farbe;
	int feld = 1, runde = 0;
	
	/**
	 * Konstruktor der Klasse Spielfigur, setzt Farbe der Figur
	 * @param farbe
	 */
	Spielfigur(String farbe, Spiel os) {
		this.farbe = farbe;
	}
	
	/**
	 * Liefert eine Zufallszahl zwischen eins und sechs
	 */
	private int wuerfel() {
		return Math.round((float)(Math.random()*5)+1);
	}
	
	
	/**
	 * Diese Methode ist überschrieben und wird aufgerufen, wenn notifyObeservers aufgerufen wird, falls etwas geändert wurde.
	 * 
	 * @param o Observable, zuständiges Observable Objekt
	 * @param arg Object, ein Argument, dass übergeben werden kann.
	 */
	public void update(Observable s, Object arg) {
		//wuerfeln
		int wurf = wuerfel();
		
		//Ausgabe des Zugs
		System.out.print(this.farbe + " würfelt in der " + (++this.runde)
				+ ". Runde eine " + wurf + " und zieht von " + this.feld);
		
		if (this.feld+wurf < 100)
			this.feld += wurf;
		else {
			this.feld = 100;
			((Spiel) s).gewonnen();
		}
		
		System.out.println(" nach " + this.feld);
	}
}
