package de.uni.karlsruhe.aifb.prog2.solutions;

import de.uni.karlsruhe.aifb.prog2.chess.ChessboardDisplay;

import Prog1Tools.GameEngine;

/** Dieses Programm berechnet eine Loesung des
 *  im Buch beschriebenen Springerproblems
 */
public class KnightSwitchProblem extends ChessboardDisplay{

  /** Der Solver, der die Loesungen beinhaltet. */
  private Solver solver;

  /** Bei welchem Zug sind wir gerade? */
  private int move;

  /** Konstruktor. Der uebergebene Solver soll alle
   *  Loesungen des Problems beinhalten.
   */
  public KnightSwitchProblem(Solver solver) {
    // Rufe den Konstruktor der Superklasse
    // mit der Start-Situation auf
    super((BoardOfKnights) solver.get(0));
    // Setze die Instanzvariablen
    this.solver = solver;
    this.move = 0;
  }

  /** Gibt den Text zurueck, der aktuell auf dem
    * Feuer-Button stehen soll.
    **/
  public String getFireLabel() {
    return (move == 0) ? "Ausgangssituation"
      : ("Zug Nr. " + move);
  }

  /** Gibt den Namen des Spiels als String zurueck.
    **/
  public String getGameName() {
    return "Springer-Problem";
  }

  /** Gibt den Text zurueck, der in der aktuellen
    * Runde im Meldefenster stehen soll. Hier geben wir die
    * Anzahl der Schritte
    * zur Loesung an.
    **/
  public String getMessages() {
    return solver.isSolution() ?
      ("Problem ist in " + solver.getSteps() + " Zuegen loesbar.") :
      "Problem konnte nicht geloest werden.";
  }

  /** Signalisert, dass der Feuer-Button gedrueckt wurde.
    **/
  public void firePressed() {
    move = (move + 1) % (solver.getSteps() + 1);
    chessboard = (BoardOfKnights) solver.get(move);
  }

  /** Hauptprogramm */
  public static void main(String[] args) {
    System.out.println("Finde Loesung...");
    Solver solver = new Solver(BoardOfKnights.createInitial(),34);
    System.out.println("Problem ist loesbar in " +
      solver.getSteps() + " Zuegen.");
    System.out.println("Stelle Loesung dar.");
    new GameEngine(new KnightSwitchProblem(solver));
  }

}