\begin{slide}{Applet-Anwendung: Plan}

Das Applet soll ein Ein-Personen-Spiel realisieren:
\begin{itemize}\itemsep 0pt
\item
  \emph{Spielfeld} ist Rechteck-Gitter von \emph{Punkten}
\item
  \emph{Punkt} hat \emph{Status} An oder Aus
  (anfangs zufällig)
\item
  \emph{Spielzug} ist Click auf Punkt, Wirkung:
  \begin{itemize}\itemsep 0pt
  \item
    Punkt an $\to$ alle Punkte seiner \emph{Spalte} umschalten;
  \item
    Punkt aus $\to$ \emph{Zeile} umschalten;
  \end{itemize}
  aber den Punkt selbst \emph{nicht}.
\item
  Spielziel: alle Punkte sind aus.
\end{itemize}
Ansatz zur Realisierung:
\begin{verbatim}
class Punkt extends Button { ... }
class Game extends Applet {
    Punkt feld [][]; ...
}
\end{verbatim}

\end{slide}


\begin{slide}{Applet-Anwendung: Klasse Punkt (1)}

Verwaltung des Status:
\begin{verbatim}
import java.awt.*;

public class Punkt extends Button {
   private boolean status;
   public boolean get () { ... }
   public void set (boolean s) { ... }
   public void flip () {
      set (! get ());
   }
}
\end{verbatim}
\end{slide}

\begin{slide}{Applet-Anwendung: Klasse Punkt (2)}
Anzeige des Status:
\begin{verbatim}
public class Punkt extends Button {
   public void set (boolean s) {
      ...
      Color c;
      if (s) { 
         c = Color.darkGray;
      } else {
         c = Color.yellow;
      }
      setBackground (c);
   }
}
\end{verbatim}
ggf. andere Farben probieren, benutze API-Dok für Klasse Color


\end{slide}

\begin{slide}{Applet-Anwendung: Klasse Punkt (3)}
Würfeln des Status zu Beginn:
\begin{verbatim}
import java.util.Random;

public class Punkt extends Button {

   static Random r = new Random ();
   
   Punkt () {
      int z = r.nextInt () % 2;
      set (z > 0);
   }
}
\end{verbatim}

\end{slide}

\begin{slide}{Applet-Anwendung: Klasse Game (1)}

\begin{verbatim}
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Game extends Applet {
   final int breit = 11;
   final int hoch  =  9;

   Punkt feld [][] = new Punkt [hoch][breit];

   public void init () {
      setLayout (new GridLayout (hoch, breit));
      for (int i=0; i<hoch; i++) {
         for (int j=0; j<breit; j++) {
            Punkt p  = new Punkt ();
            add (p);
            feld [i][j] = p;
         }
      }
   }
}
\end{verbatim}
Testen! (Welches Aussehen/Verhalten wird erwartet?)  

\end{slide}

\begin{slide}{Applet-Anwendung: Klasse Game (2)}

Alle Punkte der Spalte \verb|column| umschalten,
aber den Punkt auf \verb|(row,column)| nicht
\begin{verbatim}
public class Game extends Applet {
  void flip_column (int row, int column) {
    for (int i = 0; i<hoch; i++) {
      if (i != row) {
        feld[i][column].flip ();
      }
    }
  }
}
\end{verbatim}
\begin{itemize}\itemsep 0pt
\item
  \verb|flip_row| hinzufügen
\end{itemize}

\end{slide}

\begin{slide}{Applet-Anwendung: Klasse Game (3)}

Behandlung der Nutzereingaben:
\begin{verbatim}
public class Game extends Applet {
   Punkt feld [][] = ... ;
   class Click implements ActionListener {
      ...
   }
   public void init () {   
      ... p.addActionListener (new Click (...));
   }
}
\end{verbatim}
das Click-Objekt muß \glqq wissen\grqq,
auf welcher Koordinate der Click kam

$\to$ Click benötigt Attribute:
\begin{verbatim}
public class Game extends Applet {
  class Click implements ActionListener {
    private int row;
    private int column;
  }
}    
\end{verbatim}
Diese Attribute werden beim Konstruktor-Aufruf geschrieben:
\begin{verbatim}
public class Game extends Applet {
  class Click implements ActionListener {
    Click (int r, int c) { ... }
  }
}    
\end{verbatim}
und bei der Ereignisbehandlung gelesen:
\begin{verbatim}
public class Game extends Applet {
  class Click implements ActionListener {
    public void actionPerformed (ActionEvent ae) {
      Punkt p = feld [row][column];
      if ( p.get () ) {
        flip_column (row, column);
      } else {
        flip_row    (row, column);
      }
    }
  }
}    
\end{verbatim}


\end{slide}
