import Prog1Tools.IOTools;

/** Dieses Programm spielt den Quizmaster fuer
ein Mastermind-Quiz bzgl. einer vierstelligen Zahl */
public class Mastermind {

  /** Wandle die Ziffern einer Zahl in einen String um */
  public static String zahl(int[] z) {
    String res=""; // Hier steht das Ergebnis
    for (int i=0;i<4;i++) // Reihe die Zahlen aneinander
      res=z[i]+res;
    return res;
  }

  /** Zerteilt eine ganze positive Zahl 0<=z<=9999 in
   ihre vier Ziffern */
  public static int[] ziffern(int z) {
    int[] res=new int[4];
    for (int i=0;i<4;i++) {
      res[i]=z%10; // Berechne die rechte Ziffer
      z=z/10; // Schiebe nach rechts
    }
    return res;
  }

  /** Zerteilt eine ganze positive Zahl 0<=z<=9999 in
   vier Ziffern. Wenn die Zahl die Voraussetzungen fuer
   die Mastermind-Spielregeln nicht erfuellt (keine
   zwei Ziffern sind gleich), wird null zurueckgegeben */
  public static int[] bereiteAuf(int z) {
    // Teste zuerst, ob die Zahl im richtigen
    // Groessenbereich liegt
    if (z<0 || z>9999)
      return null;
    // Nun teile die Zahl auf
    int[] res=ziffern(z);
    // Nun teste, ob sich zwei Ziffern gleichen
    for (int i=0;i<4;i++)
      for (int j=i+1;j<4;j++)
        if (res[i]==res[j])
          return null;
    // Andernfalls gib das Ergebnis zurueck
    return res;
  }

  /** Finde eine Zahl zwischen 0 und 9999, die die
   Voraussetzungen fuer das Spiel erfuellt. */
  public static int[] findeZahl() {
    int[] res=null; // hier steht das Ergebnis
    while(res==null) {
      int zahl=(int)(9999*Math.random());
      res=bereiteAuf(zahl);
    }
    // Wenn die Schleife verlassen wurde, ist eine passende
    // Zahlenkombination gefunden
    return res;
  }
  
  /** Finde heraus, ob alle Ziffern uebereinstimmen */
  public static boolean treffer(int[] original,int[] versuch) {
    for (int i=0;i<4;i++)
      if (original[i]!=versuch[i])
        return false;
    return true;
  }

  /** Finde heraus, wie viele direkte und indirekte Treffer
   es gibt */
  public static String auswerten(int[] original,int[] versuch) {
    int direkt=0;    // Zahl der direkten   Treffer
    int indirekt=0;  // Zahl der indirekten Treffer
    for (int i=0;i<4;i++)
      for (int j=0;j<4;j++)
        if (original[i]==versuch[j]) {
          if (i==j)
            direkt++;
          else
            indirekt++;
        }
    return
      "Direkte Treffer: "+direkt+"     "+
      "Indirekte Treffer: "+indirekt;
  }

  /** Lies eine gueltige Zahl von der Tastatur ein */
  public static int[] liesZahl(int versuch) {
    int n=IOTools.readInteger("Versuch Nr. "+versuch+": ");
    int[] res=bereiteAuf(n);
    while (res==null) {
      System.out.println("KEINE GUELTIGE ZAHL!");
      n=IOTools.readInteger("Versuch Nr. "+versuch+": ");
      res=bereiteAuf(n);
    }
    return res;
  }

  /** Hauptprogramm */
  public static void main(String[] args) {
    int[] original=findeZahl();
    boolean erraten=false;
    System.out.println("MASTERMIND\n");
    for (int i=1;i<=10;i++) { // Schleifenbeginn
      System.out.println("\nSie haben noch "+(10-i+1)+
                         " Versuch(e).");
      int[] versuch=liesZahl(i);
      if (treffer(original,versuch)) { // Erraten
        System.out.println("Hervorragend! Sie haben die Zahl im "
                           +i+". Versuch erraten.");
        erraten=true;
        break;
      }
      System.out.println("Leider falsch geraten.\n"+
                         auswerten(original,versuch));
    } // Schleifenende
    if (!erraten) {
      System.out.println("\nViel Glueck beim naechsten Mal!");
      System.out.println("Die richtige Zahl waere "+
                         zahl(original)+" gewesen.");
    }
  }
}
