4.10.6 Das 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.1 vom 22.11.2004
  * @author Michael Pohlig
  */
public class ChaosSpiel extends TurtleFrame {
  //t1 wird deklariert
  Turtle t1;
  // Festlegung der Koordinaten für das gleichseitige Dreieck
  double xA = -150, yA = -100,
         xB = 150, yB = -100,
         xC = 0, yC = 150*Math.sqrt(3)-100;
  //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 Turtle(tWin);
    //t1 erhält die Farbe rot
    t1.setColor(Color.RED);
    //t1 markiert die drei Eckpunkte des Dreiecks
    t1.writeTo(".",xA,yA);
    t1.writeTo(".",xB,yB);
    t1.writeTo(".",xC,yC);
    //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.writeTo(".",t1.getX(),t1.getY());
    }
    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.writeTo(".",t1.getX(),t1.getY());
    }
    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.writeTo(".",t1.getX(),t1.getY());
    }
  }
}

    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.
 

 

   
zu 4.10.7 switch - Konstruktion
zur Startseite www.pohlig.de  (C) MPohlig 2004