/**
  *
  * Mausefalle als endlicher Automat_Datenstruktur. Realisiert durch eine Datenstruktur
  * lässt sich relativ leicht für andere Automaten ändern.
  *
  * @version 2.0 vom 21.2.2006
  * @author HR (c)´2003,2006
  */

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class Automat_Datenstruktur extends Applet {
  // Anfang Variablen
  int anz_E=5; int anz_A=6; int anz_S=5; // Anzahl der Eingabezeichen, Ausgabezeichen und Zustände
  String [] E = new String[anz_E]; //Eingabezeichentexte
  String [] A = new String[anz_A]; //Ausgabezeichentexte
  String [] S = new String[anz_S]; //Zustandstexte
  int e=0;  //aktuellles Eingabezeichen
  int a=0;  //aktuelles Ausgabezeichen
  int s=0;  //aktueller Zustand
  int [] [] u= new int [anz_S] [anz_E]; //Überführungsmatrix
  int [] [] g= new int [anz_S] [anz_E]; //Ausgabematrix
  Button e0 = new Button();  // Eingaben; sollen demnächst auch als Array implementiert werden.
  Button e1 = new Button();
  Button e2 = new Button();
  Button e3 = new Button();
  TextArea Aus = new TextArea ("", 50, 10, TextArea.SCROLLBARS_BOTH); // Ausgabeprotokoll
  Label zustand = new Label();  // Ausgabe des aktuellen Zustands
  Label Ausgabe = new Label();  // Ausgabe des aktuellen Ausgabezeichens
  // Ende Variablen
  
  void eingabeZeichen (  ) { //Zuweisen der Eingabetexte
       E[0]= "Käse      ";
       E[1]= "spannen   ";
       E[2]= "dumme Maus";
       E[3]= "kluge Maus";
  }
  void  ausgabeZeichen(  ) { // Zuweisen der Ausgabetexte
        A[0]="---------    Nichts    ---------";
        A[1]="Maus ist satt und tot   !";
        A[2]="Maus lebt, aber hungrig !";
        A[3]="Maus ist hungrig und tot!";
        A[4]="Maus lebt und ist satt  !";
        A[5]="Finger ist blau         !";
  }
  void zustaende (  ) { // Zuweisen der Zustandstexte
       S[0]="S0: Falle ungespannt und leer!";
       S[1]="S1: Falle ungespannt mit Käse!";
       S[2]="S2: Falle gespannt mit Käse  !";
       S[3]="S3: Falle gespannt und leer  !";
  }
  void bildeAutomat (  ) {  // Erstellen des Automaten als Zustands- und Ausgabematrix
     u[0][0]=1; u[0][1]=3; u[0][2]=0; u[0][3]=0; g[0][0]=0; g[0][1]=0; g[0][2]=2; g[0][3]=2;
     u[1][0]=1; u[1][1]=2; u[1][2]=0; u[1][3]=0; g[1][0]=0; g[1][1]=0; g[1][2]=4; g[1][3]=4;
     u[2][0]=1; u[2][1]=2; u[2][2]=1; u[2][3]=3; g[2][0]=5; g[2][1]=0; g[2][2]=1; g[2][3]=4;
     u[3][0]=1; u[3][1]=3; u[3][2]=0; u[3][3]=3; g[3][0]=5; g[3][1]=0; g[3][2]=3; g[3][3]=2;
  }

  void ausAusgabe (int a) { //Ausgabe der Ausgabetexte für Zeichen a
    Aus.append(A[a]+"\n");
    Ausgabe.setText(A[a]);
  }
  void ausZustand (int s) { //Ausgabe der Zustandstexte für Zustand s
    Aus.append(S[s]+"\n");
  }
  void ausNaechsterZustand (int s) { // Ausgabe des Folgezustands als Text "Folgezustand: Sx"
    Aus.append("       Folgezustand: "+S[s]+"\n");
    zustand.setText(S[s]);
  }
  void newLine (  ) { // Ausgabe einer Leerzeile
    Aus.append("\n");
  }
  // Anfang Ereignisprozeduren. Wenn mehr als 4 Eingabezeichen, muss angepasst werden.
  public void e0ActionPerformed (ActionEvent evt) {
    automat(0);
  }
  public void e1ActionPerformed (ActionEvent evt) {
    automat(1);
  }
  public void e2ActionPerformed (ActionEvent evt) {
    automat(2);
  }
  public void e3ActionPerformed (ActionEvent evt) {
    automat(3);
  }
  // Ende Ereignisprozeduren

  void automat(int e) {  // Der Automat_Datenstruktur
               ausZustand(s);
               ausAusgabe (g[s][e]);
               s= u[s][e]; //Folgezustand
               ausNaechsterZustand(s);
               newLine();
  }


  public void init () {
    resize(600, 250);
    eingabeZeichen();
    ausgabeZeichen();
    zustaende();
    bildeAutomat();
    e0.setLabel(E[0]);
    add(e0);
    e0.addActionListener (new ActionListener () {
      public void actionPerformed (ActionEvent evt) {
        e0ActionPerformed (evt);}});

    e1.setLabel(E[1]);
    add(e1);
    e1.addActionListener (new ActionListener () {
      public void actionPerformed (ActionEvent evt) {
        e1ActionPerformed (evt);}});

    e2.setLabel(E[2]);
    add(e2);
    e2.addActionListener (new ActionListener () {
      public void actionPerformed (ActionEvent evt) {
        e2ActionPerformed (evt);}});

    e3.setLabel(E[3]);
    add(e3);
    e3.addActionListener (new ActionListener () {
      public void actionPerformed (ActionEvent evt) {
        e3ActionPerformed (evt);}});


    Aus.setText("");
    Aus.setColumns(60);
    Aus.setRows(10);
    Aus.setBackground(Color.lightGray);
    add(Aus);
    zustand.setText(S[0]);
    add(zustand);
    Ausgabe.setText(A[0]);
    add(Ausgabe);
    // Ende Komponenten

  }
}

