/**
  *
  * Mausefalle als endlicher Automat_Case_Struktur
  * lässt sich relativ leicht für andere Automaten ändern.
  *
  * @version 1.0 vom 25.11.2003
  * @author HR (c)´2003
  */

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class Automat_Case_Struktur 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
  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";
       E[4]= "Finger    ";
  }
  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 automat(int e) {  // Der Automat_Case_Struktur als Switch/Case - Struktur - soll umgebaut werden
       switch ( s ) {
         case  0:
           switch ( e ) {
             case  0: {
               ausZustand(s);
               ausAusgabe (0);
               s= 1; //Folgezustand
               ausNaechsterZustand(s);
               newLine();
             }
              break;
             case  1: {
               ausZustand(s);
               ausAusgabe (0);
               s= 3; //Folgezustand
               ausNaechsterZustand(s);
               newLine();
             }
               break;
             case  2: {
               ausZustand(s);
               ausAusgabe (2);
               s= 0; //Folgezustand
               ausNaechsterZustand(s);
               newLine();
             }
              break;
             case  3: {
               ausZustand(s);
               ausAusgabe (2);
               s= 0; //Folgezustand
               ausNaechsterZustand(s);
               newLine();
             }
              break;
             default: {
              ausZustand(0);
              newLine();
             }
           }
           break;
         case  1:
           switch ( e ) {
             case  0: {
               ausZustand(s);
               ausAusgabe (0);
               s= 1; //Folgezustand
               ausNaechsterZustand(s);
               newLine();
             }
              break;
             case  1: {
               ausZustand(s);
               ausAusgabe (0);
               s= 2; //Folgezustand
               ausNaechsterZustand(s);
               newLine();
             }
               break;
             case  2: {
               ausZustand(s);
               ausAusgabe (4);
               s= 0; //Folgezustand
               ausNaechsterZustand(s);
               newLine();
             }
              break;
             case  3: {
               ausZustand(s);
               ausAusgabe (4);
               s= 0; //Folgezustand
               ausNaechsterZustand(s);
               newLine();
             }
              break;
             default: {
              ausZustand(0);
              newLine();
             }
           }
           break;
         case  2:
           switch ( e ) {
             case  0: {
               ausZustand(s);
               ausAusgabe (5);
               s= 1; //Folgezustand
               ausNaechsterZustand(s);
               newLine();
             }
              break;
             case  1: {
               ausZustand(s);
               ausAusgabe (0);
               s= 2; //Folgezustand
               ausNaechsterZustand(s);
               newLine();
             }
               break;
             case  2: {
               ausZustand(s);
               ausAusgabe (1);
               s= 0; //Folgezustand
               ausNaechsterZustand(s);
               newLine();
             }
              break;
             case  3: {
               ausZustand(s);
               ausAusgabe (4);
               s= 3; //Folgezustand
               ausNaechsterZustand(s);
               newLine();
             }
              break;
             default: {
              ausZustand(0);
              newLine();
             }
           }
           break;
         case  3:
           switch ( e ) {
             case  0: {
               ausZustand(s);
               ausAusgabe (5);
               s= 0; //Folgezustand
               ausNaechsterZustand(s);
               newLine();
             }
              break;
             case  1: {
               ausZustand(s);
               ausAusgabe (0);
               s= 3; //Folgezustand
               ausNaechsterZustand(s);
               newLine();
             }
               break;
             case  2: {
               ausZustand(s);
               ausAusgabe (3);
               s= 0; //Folgezustand
               ausNaechsterZustand(s);
               newLine();
             }
              break;
             case  3: {
               ausZustand(s);
               ausAusgabe (2);
               s= 0; //Folgezustand
               ausNaechsterZustand(s);
               newLine();
             }
              break;
             default: {
              ausZustand(0);
              newLine();
             }
           }
       }
  }

  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);
  }
  public void e4ActionPerformed (ActionEvent evt) {
    automat(4);
  }
  // Ende Ereignisprozeduren




  public void init () {
    resize(600, 250);
    eingabeZeichen();
    ausgabeZeichen();
    zustaende();
    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

  }
}

