AG-Intra.net Arbeitsgemeinschaft
Intranet

Home
Was ist ein Intranet
Grundlagen
Netzwerke
Linux
Windows
Java
Sicherheit
Datenbanken
Projekte
Links
Impressum
Mitmachen ?
Diskussionsforum
Start:
25.11.2000
Letztes Update:
25.11.2000
3. Beispiel - Tic-Tac-Toe Applet
UNDER CONSTRUCTION
. Java Tutorial
Copyright 2000 by Frank Gehde
<= vorherige Seite Inhaltsverzeichnis nächste Seite =>

Liebe Besucher, ein aktueller Hinweis in eigener Sache:
Es ist beabsichtigt, diese Seiten und die Domain im Januar/Februar 2004 auf einen anderen Server umzuziehen. Es ist leider nicht auszuschließen, daß es während des Umzugs zu technischen Problemen mit diesen Seiten kommen wird. Insbesondere im eMail-Bereich wird es vermutlich Probleme geben. Wenn Sie fragen haben oder mich sonstwie erreichen wollen empfehle ich an rebel@snafu.de zu posten.
Nachdem der Umzug abgeschlossen ist, wird es allerdings auch inhaltliche Änderungen während des ersten Halbjahrs 2004 geben. Keine Angst. Es werden keine Inhalte verlorengehen, aber die Struktur der Seiten wird komplett geändert. Diese Seite hat eben eine andere Entwicklung genommen seit 2000, als das Projekt gestartet wurde ;-) Ich werde mich bemühen, daß bei ihnen vorhandene alte Bookmarks wenigstens zu einem Verweis auf die Neustruktur führen, und die gesuchten Inhalte für sie trotzdem leicht und schnell auffindbar sein werden.
Die eigentlich zu dieser Seite gehörenden Domains ag-intra.com, ag-intra.org und ag-intra.de werden von mir geschlossen bzw. gelöscht und unregistriert.

UNDER CONSTRUCTION
Vorwort zu diesem Beispiel
Ich habe das jetzt nur reingenommen, weil das zentrale Thema, der Sourcecode zu dem Applet hier bereits herumliegt. Wer interessiert ist, kann sich das also schon einmal ansehen, und den ominösen Fehler suchen. Das Beispiel wird ansonsten aber erst weitergeführt, wenn das zweite Beispiel zum Thema AWT vollständig beendet ist.

3.1. Warum Bonus-Beispiel ?
Dieses gesamte Tutorial zielt eigentlich mehr auf den Schwerpunkt Applikationsprogrammierung, und nicht auf Applets. Dennoch wird häufig nachgefragt, wie man Applets programmiert. Obwohl die meisten dann ob des Aufwandes zurückschrecken, scheinen bunte, bewegte Applets auf Web-Seiten immer noch zu faszinieren. Ich habe tatsächlich auch Ideen, wie man im Productivity-Bereich Applets sinnvoll einsetzen könnte. Das Sicherheitsmodell von Java wirkt aber diesen Ideen entgegen. Man kann es im Einzelfall umgehen, aber davon wird dringend abgeraten.

Dieses Beispiel unterscheidet sich auch vom Aufbau her komplett von den anderen Beispielen im Tutorial. Wir werden hier ganz allgemein etwas über die Unterschiede zwischen Applikationen und Applets in Java erfahren. Danach werde ich einen sehr, sehr langen Quellcode vorgeben, den Sie analysieren sollen. Das interessante ist nämlich, daß das dort gezeigte Applet eigentlich funktioniert, aber einen mehrfach auftauchenden schwerwiegenden Fehler aufweist. Wenn Sie das Tutorial bis hier durchgearbeitet haben, sollten Sie den Fehler eigentlich finden. Danach werden wir einerseits den Fehler beseitigen, und das Programm ein wenig optimieren. Im großen und ganzen halte ich nicht viel von Optimierungen, weil die meisten kaum Performance-Gewinn bringen. Es haben sich schon Leute zu Tode optimiert. In diesem Fall tun wir es aber doch, weil das ganze Applet viel zu aufwendig (alte Rechtschreibung) implementiert wurde. Sie können bei der Gelegenheit einige Programmierkniffe lernen, die sie später dann auch beim normalen Programmieren verwenden werden. Es gibt in diesem Fall also etwas zu lernen.
Außerdem zeigen ich zB. noch, wie man bestehende Klassen erweitert, um ganz spezielle eigene grafische Komponenten zu erzeugen.
Sie sollten das Wort Bonus also nicht so auffassen, daß Sie dieses Beispiel einfach überspringen können. :-)

3.2. Unterschiede zwischen Java Applikationen und Applets
Kommt später (Vielleicht erkennen Sie sie ja auch im Listing)

3.2. Der Quellcode
Das Applet besteht aus zwei Klassen. Eine eigene Erweiterung der KlasseCanvas namens MyCanvas mit neuen Funktionalitäten, sowie der Hauptklasse ttt(Richtig, hätte ich eigentlich groß schreiben müssen). Dazu kommt noch der Source Code für die drüber liegende HTML-Seite. Hier also in Medias-Res:

HTML-Sourcecode ttt.html:

<HTML>
<HEAD>
</HEAD>
<BODY>
Willkommen beim Tic-Tac-Toe Java Applet.

Dies ist ein Applet, welches leider syntaktisch vollkommen falsch programmiert ist. Finden Sie heraus warum das so ist:
<BR>
<APPLET
   CODEBASE="."
   CODE="ttt.class"
   WIDTH=300
   HEIGHT=300
   ALT="Das Spiel laeuft leider nicht">
   Ihr Browser kann dieses Applet nicht .. schade
</APPLET>

</BODY>
</HTML>

Nun die Klasse MyCanvas.java:

import java.awt.*;       // für graphische Benutzerschnittstellen
import java.awt.event.*; // für die Behandlung von Ereignissen

public class MyCanvas extends Canvas {

  private String Status;

  public MyCanvas() { 
    super();
    Status="Leer";
  }

  public void paint(Graphics g) {
    int width = getSize().width;
    int height = getSize().height;
    g.setColor(getForeground());
    g.drawRect(2, 2, width - 4, height - 4);
  }
  public void setStatus(String stat) {
    if (stat=="Leer") {
      this.paint(this.getGraphics());
      Status="Leer";
    }
    if (stat=="Kreuz") {
      this.paint(this.getGraphics());
      int width = getSize().width;
      int height = getSize().height;
      Graphics g = this.getGraphics();
      g.setColor(getForeground());
      g.drawLine(2, 2, width - 4, height - 4);
      g.drawLine(width - 4, 2, 2, height - 4);
      Status="Kreuz";
    }
    if (stat=="Kreis") {
      this.paint(this.getGraphics());
      int width = getSize().width;
      int height = getSize().height;
      Graphics g = this.getGraphics();
      g.setColor(getForeground());
      g.drawOval(4, 4, width - 8, height - 8);
      Status="Kreis";
    }
  }
  public String getStatus() {
      return Status;
  }
}

Nun die Hauptklasse ttt.java :

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class ttt extends Applet {

   private String Player = "1";
   private String Figur = "Kreis";
   private String Sieg = "False";

   private MyCanvas f1Cv = new MyCanvas();  // Die einzelnen Spielfelder
   private MyCanvas f2Cv = new MyCanvas();
   private MyCanvas f3Cv = new MyCanvas();
   private MyCanvas f4Cv = new MyCanvas();
   private MyCanvas f5Cv = new MyCanvas();
   private MyCanvas f6Cv = new MyCanvas();
   private MyCanvas f7Cv = new MyCanvas();
   private MyCanvas f8Cv = new MyCanvas();
   private MyCanvas f9Cv = new MyCanvas();

   public void init() {
      Figur="Kreis";
      this.setLayout(new GridLayout(3,3));
      Rectangle Fensta = this.getBounds();  //Größe der Fläche des Applets
      MouseListener aktion = new MouseListener() {
         public void mouseClicked(MouseEvent e) {
            reagieren(e.getSource());       //Zur Funktion wohin geklickt?
         }
         public void mousePressed(MouseEvent e) {}
         public void mouseReleased(MouseEvent e) {}
         public void mouseEntered(MouseEvent e) {}
         public void mouseExited(MouseEvent e) {}
      };
      f1Cv.addMouseListener(aktion);        // Listener an die 
      f2Cv.addMouseListener(aktion);        // Einzelfelder binden
      f3Cv.addMouseListener(aktion);
      f4Cv.addMouseListener(aktion);
      f5Cv.addMouseListener(aktion);
      f6Cv.addMouseListener(aktion);
      f7Cv.addMouseListener(aktion);
      f8Cv.addMouseListener(aktion);
      f9Cv.addMouseListener(aktion);

      this.add(f1Cv);                        // Felder auf 
      this.add(f2Cv);                        // Graphicsobjekt bringen
      this.add(f3Cv);
      this.add(f4Cv);
      this.add(f5Cv);
      this.add(f6Cv);
      this.add(f7Cv);
      this.add(f8Cv);
      this.add(f9Cv);

   } // Ende Methode init

   public void reagieren(Object komponente) {
      if (Sieg=="False") {
         if (komponente==f1Cv) {
            if (f1Cv.getStatus()=="Leer") {
               if (Player=="1") Figur="Kreuz";
               if (Player=="2") Figur="Kreis";
               f1Cv.setStatus(Figur);
               showStatus("erstes Feld");
               tic();
               if (Player=="1") Player="2";
               else     Player="1";
           }
         }
         else if (komponente==f2Cv) {
            if (f2Cv.getStatus()=="Leer") {
               if (Player=="1") Figur="Kreuz";
               if (Player=="2") Figur="Kreis";
               f2Cv.setStatus(Figur);
               showStatus("erstes Feld");
               tic();
               if (Player=="1") Player="2";
               else     Player="1";
            }
         }
         else if (komponente==f3Cv) {
            if (f3Cv.getStatus()=="Leer") {
               if (Player=="1") Figur="Kreuz";
               if (Player=="2") Figur="Kreis";
               f3Cv.setStatus(Figur);
               showStatus("erstes Feld");
               tic();
               if (Player=="1") Player="2";
               else     Player="1";
            }
         }
         else if (komponente==f4Cv) {
            if (f4Cv.getStatus()=="Leer") {
               if (Player=="1") Figur="Kreuz";
               if (Player=="2") Figur="Kreis";
               f4Cv.setStatus(Figur);
               showStatus("erstes Feld");
               tic();
               if (Player=="1") Player="2";
               else     Player="1";
            }
         }
         else if (komponente==f5Cv) {
            if (f5Cv.getStatus()=="Leer") {
               if (Player=="1") Figur="Kreuz";
               if (Player=="2") Figur="Kreis";
               f5Cv.setStatus(Figur);
               showStatus("erstes Feld");
               tic();
               if (Player=="1") Player="2";
               else     Player="1";
            }
         }
         else if (komponente==f6Cv) {
            if (f6Cv.getStatus()=="Leer") {
               if (Player=="1") Figur="Kreuz";
               if (Player=="2") Figur="Kreis";
               f6Cv.setStatus(Figur);
               showStatus("erstes Feld");
               tic();
               if (Player=="1") Player="2";
               else     Player="1";
            }
         }
         else if (komponente==f7Cv) {
            if (f7Cv.getStatus()=="Leer") {
               if (Player=="1") Figur="Kreuz";
               if (Player=="2") Figur="Kreis";
               f7Cv.setStatus(Figur);
               showStatus("erstes Feld");
               tic();
               if (Player=="1") Player="2";
               else     Player="1";
            }
         }
         else if (komponente==f8Cv) {
            if (f8Cv.getStatus()=="Leer") {
               if (Player=="1") Figur="Kreuz";
               if (Player=="2") Figur="Kreis";
               f8Cv.setStatus(Figur);
               showStatus("erstes Feld");
               tic();
               if (Player=="1") Player="2";
               else     Player="1";
            }
         }
         else if (komponente==f9Cv) {
            if (f9Cv.getStatus()=="Leer") {
               if (Player=="1") Figur="Kreuz";
               if (Player=="2") Figur="Kreis";
               f9Cv.setStatus(Figur);
               showStatus("erstes Feld");
               tic();
               if (Player=="1") Player="2";
               else     Player="1";
            }
         }
      }
      else {
         Player="1";
         Figur="Kreis";
         f1Cv.setStatus("Leer");
         f2Cv.setStatus("Leer");
         f3Cv.setStatus("Leer");
         f4Cv.setStatus("Leer");
         f5Cv.setStatus("Leer");
         f6Cv.setStatus("Leer");
         f7Cv.setStatus("Leer");
         f8Cv.setStatus("Leer");
         f9Cv.setStatus("Leer");
         init();
         Sieg="False";
      }
   }

   public void tic() {
      if ((f1Cv.getStatus()=="Kreuz") && (f2Cv.getStatus()=="Kreuz") && (f3Cv.getStatus()=="Kreuz")) {
         Sieg="Kreuz";
         Graphics g = f1Cv.getGraphics();
         g.drawString("Sieger",10,20);
      }
      if ((f4Cv.getStatus()=="Kreuz") && (f5Cv.getStatus()=="Kreuz") && (f6Cv.getStatus()=="Kreuz")) {
         Sieg="Kreuz";
         Graphics g = f4Cv.getGraphics();
         g.drawString("Sieger",10,20);
      }
      if ((f7Cv.getStatus()=="Kreuz") && (f8Cv.getStatus()=="Kreuz") && (f9Cv.getStatus()=="Kreuz")) {
         Sieg="Kreuz";
         Graphics g = f7Cv.getGraphics();
         g.drawString("Sieger",10,20);
      }
      if ((f1Cv.getStatus()=="Kreuz") && (f4Cv.getStatus()=="Kreuz") && (f7Cv.getStatus()=="Kreuz")) {
         Sieg="Kreuz";
         Graphics g = f1Cv.getGraphics();
         g.drawString("Sieger",10,20);
      }
      if ((f2Cv.getStatus()=="Kreuz") && (f5Cv.getStatus()=="Kreuz") && (f8Cv.getStatus()=="Kreuz")) {
         Sieg="Kreuz";
         Graphics g = f2Cv.getGraphics();
         g.drawString("Sieger",10,20);
      }
      if ((f3Cv.getStatus()=="Kreuz") && (f6Cv.getStatus()=="Kreuz") && (f9Cv.getStatus()=="Kreuz")) {
         Sieg="Kreuz";
         Graphics g = f3Cv.getGraphics();
         g.drawString("Sieger",10,20);
      }
      if ((f1Cv.getStatus()=="Kreuz") && (f5Cv.getStatus()=="Kreuz") && (f9Cv.getStatus()=="Kreuz")) {
         Sieg="Kreuz";
         Graphics g = f1Cv.getGraphics();
         g.drawString("Sieger",10,20);
      }
      if ((f3Cv.getStatus()=="Kreuz") && (f5Cv.getStatus()=="Kreuz") && (f7Cv.getStatus()=="Kreuz")) {
         Sieg="Kreuz";
         Graphics g = f3Cv.getGraphics();
         g.drawString("Sieger",10,20);
      }
 //Nun die Kreise
      if ((f1Cv.getStatus()=="Kreis") && (f2Cv.getStatus()=="Kreis") && (f3Cv.getStatus()=="Kreis")) {
         Sieg="Kreis";
         Graphics g = f1Cv.getGraphics();
         g.drawString("Sieger",10,20);
      }
      if ((f4Cv.getStatus()=="Kreis") && (f5Cv.getStatus()=="Kreis") && (f6Cv.getStatus()=="Kreis")) {
         Sieg="Kreis";
         Graphics g = f4Cv.getGraphics();
         g.drawString("Sieger",10,20);
      }
      if ((f7Cv.getStatus()=="Kreis") && (f8Cv.getStatus()=="Kreis") && (f9Cv.getStatus()=="Kreis")) {
         Sieg="Kreis";
         Graphics g = f7Cv.getGraphics();
         g.drawString("Sieger",10,20);
      }
      if ((f1Cv.getStatus()=="Kreis") && (f4Cv.getStatus()=="Kreis") && (f7Cv.getStatus()=="Kreis")) {
         Sieg="Kreis";
         Graphics g = f1Cv.getGraphics();
         g.drawString("Sieger",10,20);
      }
      if ((f2Cv.getStatus()=="Kreis") && (f5Cv.getStatus()=="Kreis") && (f8Cv.getStatus()=="Kreis")) {
         Sieg="Kreis";
         Graphics g = f2Cv.getGraphics();
         g.drawString("Sieger",10,20);
      }
      if ((f3Cv.getStatus()=="Kreis") && (f6Cv.getStatus()=="Kreis") && (f9Cv.getStatus()=="Kreis")) {
         Sieg="Kreis";
         Graphics g = f3Cv.getGraphics();
         g.drawString("Sieger",10,20);
      }
      if ((f1Cv.getStatus()=="Kreis") && (f5Cv.getStatus()=="Kreis") && (f9Cv.getStatus()=="Kreis")) {
          Sieg="Kreis";
          Graphics g = f1Cv.getGraphics();
          g.drawString("Sieger",10,20);
      }
      if ((f3Cv.getStatus()=="Kreis") && (f5Cv.getStatus()=="Kreis") && (f7Cv.getStatus()=="Kreis")) {
          Sieg="Kreis";
          Graphics g = f3Cv.getGraphics();
          g.drawString("Sieger",10,20);
      }
   }

   public String[][] getParameterInfo() {
      String[][] info = {{}}; // keine Parameter
      return info;
   }
   public String getAppletInfo() {
      return "TicTacToe Spiel";
   }
} // Ende der Klasse ttt (Tic Tac Toe)

Zum Ausprobieren, können Sie das Applet jetzt auch hier vom Server nutzen.


<= vorherige Seite Inhaltsverzeichnis nächste Seite =>

zurück zur Hauptseite

Copyright 2000 by Frank Gehde