next up previous contents
Nächste Seite: Regelketten für Turmiten abändern Aufwärts: Grafik Vorherige Seite: Langton-Ameise   Inhalt

Turmiten

Turmiten sind gewissermaßen verallgemeinerte Langton-Ameisen: Eine allgemeine Ameise hat nicht nur die Farbe Weiß und eine weitere Farbe zur Verfügung, sondern insgesamt $n$ Farben, die mit $0, 1, 2, ... n-1$ durchnummeriert werden. Aus einem Feld der Farbe $k$ macht sie ein Feld der Farbe $k+1$; aus der Farbe $n-1$ wird die Farbe $0$. Wie sich die Ameise sonst noch bewegt, wird durch eine so genannte ``Regelkette'' festgelegt. Diese ist eine Folge von genau $n$ Symbolen, die wieder von $0$ bis $n-1$ nummeriert sind. Jedes Symbol beschreibt entweder eine Linksdrehung (``L'') oder einer Rechtsdrehung (``R''). In dieser Verallgemeinerung bewegt sich Langtons Ameise auf einem Feld mit zwei Farben und der Regelkette RL.

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

public class RRLL extends Frame {

    RRLL() {
        super("Turmiten 1100 gibt es in jedem PC ;-)");
    }

    public static void main (String[] arguments) {
        RRLL proggi = new RRLL();
        WindowListener wl = new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        };
        proggi.addWindowListener(wl);
        proggi.setLocation(100,100);
        proggi.setSize(500,500);
        proggi.show();
    }

    public void paint(Graphics bs) {
        int x;
        int y;
        int i;
        int j;
        int zaehler;

        int richtung;

        int[][] Welt = new int [100][100];

        for (i=0;i<100;i++) 
            for (j=0;j<100;j++)
                Welt[i][j]=0;

        bs.setColor(Color.white);
        bs.fillRect(0,0,500,500);
  
        richtung = 1;
        x = 50;
        y = 50;
        x++;
        zaehler = 0;
        do {
            if (Welt[x][y]==0) {
                richtung = ((richtung + 1) % 4);
                Welt[x][y]=1;
                bs.setColor(Color.red);
                bs.fillRect(5*x,5*y,5,5);
            } else if (Welt[x][y]==1) {
                richtung = ((richtung + 1) % 4);
                Welt[x][y]=2;
                bs.setColor(Color.blue);
                bs.fillRect(5*x,5*y,5,5);
            } else if (Welt[x][y]==2) {
                richtung = ((richtung - 1) % 4);
                Welt[x][y]=3;
                bs.setColor(Color.green);
                bs.fillRect(5*x,5*y,5,5);
            } else if (Welt[x][y]==3) {
                richtung = ((richtung - 1) % 4);
                Welt[x][y]=0;
                bs.setColor(Color.white);
                bs.fillRect(5*x,5*y,5,5);
            }
            if (richtung == 0) {
                richtung=4;
                y--;
            } else if (richtung == 1) 
                x++;
            else if (richtung == 2)
                y++;
            else if (richtung == 3)
                x--;
            zaehler++;
        } while ((zaehler<400000) || (x!=50) || (y!=50)); 
    }
}

Aufgrund der Regelkette bewegt sich die Turmite so über das Zeichenfeld, dass ein symmetrisches Farbmuster entsteht. Außerdem kehrt sie dabei stets zum Ausgangspunkt zurück. Im Programm bricht die Ausführung dann ab, wenn die Turmite sowohl mindestens 400000 Schritte zurückgelegt hat, und wenn sowohl die x-Koordinate als auch die y-Koordinate gleich der Ausgangsposition sind.


\includegraphics[width=7cm]{RRLL.ps}

Wie das Verfahren (einfach) erweitert werden kann, wird im nächsten Beispiel behandelt.


next up previous contents
Nächste Seite: Regelketten für Turmiten abändern Aufwärts: Grafik Vorherige Seite: Langton-Ameise   Inhalt
Alfred Nussbaumer 2003-02-10