import Prog1Tools.*;

/** Die Klasse MasterGame stellt eine graphische Variante
 unseres Mastermind-Spieles dar. */
public class MasterGame
  extends Mastermind implements GameModel {

  /** Die maximale Anzahl von Runden */
  private final static int MAXRUNDE = 10;

  /** Die aktuelle Runde, beginnend bei 1 */
  private int runde = 1;

  /** Der aktuelle Rateversuch */
  private int[] versuch = {1,2,3,4};

  /** Die zu erratende Zahl */
  private int[] original = findeZahl();

  /** Ist das Spiel bereits entschieden? */
  private boolean fertig;

  /** Hat der Spieler gewonnen? */
  private boolean gewonnen;

  /** Der auszugebende Text */
  private String ausgabe =
    "MASTERMIND\n\n" +
    "Raten Sie die Zahl! Sie haben " +
    MAXRUNDE +
    " Versuche...";

  /** Teste den aktuellen Versuch auf Gueltigkeit */
  private boolean validate() {
    int zahl =
      versuch[0] +
      versuch[1] * 10 +
      versuch[2] * 100 +
      versuch[3] * 1000;
    return bereiteAuf(zahl) != null;
  }

  /** Die Anzahl der Zeilen ist bei Mastermind immer 1 */
  public int rows() {
    return 1;
  }

  /** Die Anzahl der Spalten ist bei Mastermind immer 4 */
  public int columns() {
    return 4;
  }

  /** Was steht auf unserem Feuerknopf? */
  public String getFireLabel() {
    // Falls das Spiel noch nicht beendet ist ...
    if (!fertig)
      return "Rateversuch Nr. " + runde;

    // Andernfalls gib eine Siegesmitteilung aus
    if (gewonnen)
      return "GEWONNEN!";

    else
      return "Leider verloren...";
  }
  /** Gib den aktuellen Nachrichtentext zurueck */
  public String getMessages() {
    return ausgabe;
  }

  /** Gib den Namen des Spiels zurueck */
  public String getGameName() { 
    return "Mastermind"; 
  }

  /** Gib eine der Ziffern zurueck */
  public char getContent(int row, int col) {
    return (char)(versuch[col] + '0');
  }

  /** Wechsle eine der Ziffern */
  public void buttonPressed(int row,int col) {
    if (runde <= MAXRUNDE && !fertig) {
      do {
        versuch[col] = (versuch[col] + 1) % 10;
      } while (!validate());
    }
  }

  /** Wechsle in die naechste Runde */
  public void firePressed() {
    if (runde <= MAXRUNDE && !fertig) {
      // Erhoehe den Rundenzaehler
      runde++;
      // Teste, ob das Spiel zuende ist
      fertig = runde>MAXRUNDE || treffer(original,versuch);
      // Teste, ob der Spieler gewonnen hat
      gewonnen = treffer(original,versuch);
      // Aendere den Ausgabentext
      if (fertig && gewonnen)
        ausgabe = "Spiel beendet.\n\nSie haben gewonnen.";
      if (fertig && !gewonnen)
        ausgabe = "Spiel beendet.\n\nSie haben verloren.";
      if (!fertig)
        ausgabe =
          auswerten(original,versuch) +
          "\n\n" +
          "Anzahl der verbleibenden Versuche: " +
          (MAXRUNDE - runde + 1);
    }
  }

  /** Hauptprogramm */
  public static void main(String[] args){
    new GameEngine(new MasterGame());
  }

}
