11.3 Chaosspiel
 
if - if - if Wir machen ein neues Spiel. Seine Regeln heißen.
Markiere die Eckpunkte eines gleichseitigen 

   Dreiecks: P1, P2 und P3.



Wiederhole (‚sehr oft‘)
  • Wähle einen beliebigen Punkt auf dem Zeichenblatt. 
  • Wähle P1, P2 oder P3 zufällig: Würfle und teile die 
    
    Augenzahl, wenn sie größer ist als 3 durch 2. Die so 
    
    gewonnene Zahl ist der Index des Punktes.
  • Gehe von der aktuellen Position um die halbe Distanz auf 
    
    den ‚gewürfelten Punkt‘ und markiere diesen Punkt. 
    
    Er ist die neue Position.
    
    

Am besten führe man den Algorithmus zunächst einmal auf dem Papier aus, bevor wir ihn in Java implementieren.
 

Download:
Chaosspiel.java

 
import turtle.*;

import java.awt.*;



/**

  * Turtle-Projekt: ChaosSpiel.java

  * @version 1.0 vom 15.01.2004

  * @author Michael Pohlig

  */

public class ChaosSpiel extends TurtleFrame {

  //t1 wird deklariert

  MeineTurtle t1; 

  // Festlegung der Koordinaten für das Dreieck

  double xA = -150, yA = -50,

         xB = 150, yB = -50,

         xC = 0, yC = 150*Math.sqrt(2)-50;

  //Die Start-Position der Turtle wird per Zufall gesetzt.

  double xStart = Math.random()*400-200;

  double yStart = Math.random()*400-200;

  //In Zufall wird das Ergebnis des Würfelns gespeichert

  int zufall;

  //In schritt wird die Schrittlänge der Turtle gespeichert

  double schritt;

    

  public ChaosSpiel(String title) {

    super(title);

    //t1 wird erzeugt

    t1 = new MeineTurtle(tWin);

    //t1 erhält die Farbe rot

    t1.setColor(Color.RED);

    //t1 zeichnet die drei Eckpunkte des Dreiecks

    t1.circle(xA,yA,2);

    t1.circle(xB,yB,2);

    t1.circle(xC,yC,2);

    //Die Farbe für t1 wird auf schwarz zurückgesetzte

    t1.setColor(Color.BLACK);

    //Die Turtle nimmt die Startposition ein

    t1.jumpTo(xStart,yStart);

  }



  public void zeichne() {



  for(int i =0; i <100; i++){

    //es wird ein Dreieckspunkt 'gewürfelt'

    zufall = (int)(3*Math.random())+1;

    if (zufall==1) {

      //Der Abstand der Turtle zu dem gewürfelten 

      //Punkt wird berechnet und in der Variablen schritt

      //gespeichert

      schritt = Math.sqrt(Math.pow(xA-t1.getX(),2)

                          +Math.pow(yA-t1.getY(),2));

      //t1 richtet sich in Richtung gefürfelten Eckpunkt aus

      t1.turnTo(xA,yA);

      //t1 nimmt den Zeichenstift hoch

      t1.up();

      //t1 bewegt sich auf Eckpunkt (halbe Entfernung) zu

      //ohne zu zeichnen

      t1.forward(0.5*schritt);

      //t1 setzt den Zeichnstift wieder ab

      t1.down();

      //t1 markiert seine aktuelle Position mit einen

      //kleinen Kreis.

      t1.circle(t1.getX(),t1.getY(),0.1);

    }

    if (zufall==2) {

      schritt = Math.sqrt(Math.pow(xB-t1.getX(),2)

                          +Math.pow(yB-t1.getY(),2));

      t1.turnTo(xB,yB);

      t1.up();

      t1.forward(0.5*schritt);

      t1.down();

      t1.circle(t1.getX(),t1.getY(),0.1);

    }

    if (zufall==3) {

      schritt = Math.sqrt(Math.pow(xC-t1.getX(),2)

                          +Math.pow(yC-t1.getY(),2));

      t1.turnTo(xC,yC);

      t1.up();

      t1.forward(0.5*schritt);

      t1.down();

      t1.circle(t1.getX(),t1.getY(),0.1);

    }

  }

}



    public static void main (String[] args) {

        new ChaosSpiel("ChaosSpiel");

    }

}
  Zeilenkommentare erläutern die einzelnen Anweisungen. Wir erkennen, dass  Java es erlaubt, auf die else-Anweisung zu verzichten, dann nämlich, wenn in ihrem Block nichts stehen würde.  In der zweiten und dritten if-Anweisung wurde auf die Kommentierung verzichtet, da die Anweisungen in allen drei Blöcken sich nur in dem Namen des anvisierten Punktes unterscheiden.

Um vom Bediener des Programmes nicht zu verlangen, dass er tausendfach den zeichne!-Schalter drückt, ist im Programm zusätzlich eine for-Schleife eingebaut, die pro Klick auf den zeichne!-Schalter die Turtle veranlasst 100 Punkte zu setzen.
 

Bemerkungen

Download:
MeineTurtle. class

Um die drei Eckpunkte des Dreiecks und die Positionsmarkierungen der Turlte beim Spiel zu zeichnen, benutzen wir, die selbst geschrieben Methode circle(double x, double y, double radius) in der Klasse MeineTurtle. Aus diesem Grund ist t1 nicht mehr vom Typ Turtle, sondern vom Typ MeineTurtle, die, wir erinnern uns, von Turlte erbt (MeineTutle.class, das Kompilat von MeineTurtle.java  muss sich also im gleichen Verzeichnis wie Chaosspiel.java befinden.
   
 

Das Bild das sich nach 150 Klicks ergibt zeigt das Aussehen des sog. Sierpinskidreiecks, auf das wir im Kapitel über Rekursionen noch einmal zu sprechen kommen. Es ist schon beeindruckend, dass ein Würfelspiel zu einer solchen geordneten Struktur führt.

   
zu 11.4 Übungen
zur Startseite www.pohlig.de  (C) MPohlig 2004