Lehrer Nussbaumer - JAVA (eine kleine Einführung ;)

Grundlagen

GUI

Eingabe

Ausgabe

Applikationen

Applets

  1. CheckBoxes
  2. Events
  3. Menüs
  4. Langton-Ameise
  5. Turmiten
  6. Fraktale
  7. Zelluläre Automaten
  8. Fraktales Wachstum
  9. Logistisches Wachstum
  10. Feigenbaum Diagramm
  11. Sortieralgorithmen
  12. Lorenz-Plot

Servlets

Beispiele

Spiele

IDEs

Skriptum

JAVA-DOCS


-----------------
letzte Änderung:
09 December 2021
-----------------
Lehrer Nussbaumers Seite

... in Arbeit ...

Turmiten

Turmiten sind gewissermaßen die Verallgemeinerung von Langton-Ameisen; Turmiten wuseln noch gewandter über ihre Welt, den Bildschirm ;-). Genau genommen wird die Regel erweitert, nach der sich eine Turmite weiterbewegt, wenn sie auf einem Feld zu sitzen gekommen ist. Die Felder werden nun mit mehreren Farben eingefärbt, beispielsweise mit 16 verschiedenen Farben (mit den Nummern von 0 bis 15). Für diese 16 verschiedenen Farben werden jeweils Regeln genannt, nach denen sich die Turmite entweder nach rechts ("1") oder nach links ("0") wenden soll. Die Turmite erhöht daraufhin die "Farbnummer" des Feldes (und färbt damit das Feld neu) und wandert ein Feld weiter...

F&uumL;r die Regelkette "1010101010101010" ergibt sich daher die Wanderung einer Langton-Ameise Langtons Ameise hat die Regelkette "10" und nur zwei Farben zur Auswahl - zum Beispiel weiß und rot).

Man kann zeigen, dass die Wanderung von Turmiten immer wieder zum Ausgangspunkt zurück führt und zudem symmetrisch verläft, wenn die Regelkette aus Paaren von "11" und "00" besteht und wenn die Turmite auf einer Ebene zu laufen beginnt, die selbst aus symmetrisch verteilten Farbfelder gebildet ist (dies ist nach einem vollständigen Durchlauf jeweils der Fall).

Beispiel:


Code:

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

public class turmitenapp extends Applet implements ActionListener {

    int regel[] = new int [16];
    Button ok;
    TextField eingabe;

    public void init() {
	setLayout(new FlowLayout());
	Label was = new Label("Regelkette, 16 Ziffern 0-1: ");
	add(was);
	eingabe = new TextField("1001100110011001",16);
	add(eingabe);
	ok = new Button("ok");
	add(ok);
	ok.addActionListener(this);
	werteuebernehmen();

    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == ok) {
            werteuebernehmen();
            repaint();
        }
    }

    public void werteuebernehmen() {
        int el;
	String eintrag = eingabe.getText();
        el = eintrag.length();
        if (el > 16) el = 16;
        for (int i=0; i<el;i++) {
	    if (eintrag.charAt(i) == '0') regel[i]=-1;
	    if (eintrag.charAt(i) == '1') regel[i]=1;
	}
    }

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

	int richtung;

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

	Color lblue = new Color(128,128,255);
	Color dblue = new Color(0,0,192);
	Color dyellow = new Color(192,192,0);
	Color lred = new Color(255,128,128);
	Color dred = new Color(192,0,0);
	Color dgreen = new Color(0,192,0);

	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 + regel[0]) % 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 + regel[1]) % 4);
		Welt[x][y]=2;
		bs.setColor(Color.green);
		bs.fillRect(5*x,5*y,5,5);
	    } else if (Welt[x][y]==2) {
		richtung = ((richtung + regel[2]) % 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 + regel[3]) % 4);
		Welt[x][y]=4;
		bs.setColor(Color.yellow);
		bs.fillRect(5*x,5*y,5,5);
	    } else if (Welt[x][y]==4) {
		richtung = ((richtung + regel[4]) % 4);
		Welt[x][y]=5;
		bs.setColor(Color.gray);
		bs.fillRect(5*x,5*y,5,5);
	    } else if (Welt[x][y]==5) {
		richtung = ((richtung + regel[5]) % 4);
		Welt[x][y]=6;
		bs.setColor(Color.magenta);
		bs.fillRect(5*x,5*y,5,5);
	    } else if (Welt[x][y]==6) {
		richtung = ((richtung + regel[6]) % 4);
		Welt[x][y]=7;
		bs.setColor(Color.orange);
		bs.fillRect(5*x,5*y,5,5);
	    } else if (Welt[x][y]==7) {
		richtung = ((richtung + regel[7]) % 4);
		Welt[x][y]=8;
		bs.setColor(Color.cyan);
		bs.fillRect(5*x,5*y,5,5);
	    } else if (Welt[x][y]==8) {
		richtung = ((richtung + regel[8]) % 4);
		Welt[x][y]=9;
		bs.setColor(Color.pink);
		bs.fillRect(5*x,5*y,5,5);
	    } else if (Welt[x][y]==9) {
		richtung = ((richtung + regel[9]) % 4);
		Welt[x][y]=10;
		bs.setColor(dred);
		bs.fillRect(5*x,5*y,5,5);
	    } else if (Welt[x][y]==10) {
		richtung = ((richtung + regel[10]) % 4);
		Welt[x][y]=11;
		bs.setColor(dgreen);
		bs.fillRect(5*x,5*y,5,5);
	    } else if (Welt[x][y]==11) {
		richtung = ((richtung + regel[11]) % 4);
		Welt[x][y]=12;
		bs.setColor(dblue);
		bs.fillRect(5*x,5*y,5,5);
	    } else if (Welt[x][y]==12) {
		richtung = ((richtung + regel[12]) % 4);
		Welt[x][y]=13;
		bs.setColor(dyellow);
		bs.fillRect(5*x,5*y,5,5);
	    } else if (Welt[x][y]==13) {
		richtung = ((richtung + regel[13]) % 4);
		Welt[x][y]=14;
		bs.setColor(lred);
		bs.fillRect(5*x,5*y,5,5);
	    } else if (Welt[x][y]==14) {
		richtung = ((richtung + regel[14]) % 4);
		Welt[x][y]=15;
		bs.setColor(lblue);
		bs.fillRect(5*x,5*y,5,5);
	    } else if (Welt[x][y]==15) {
		richtung = ((richtung + regel[15]) % 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<100000) || (x!=50) || (y!=50)) &&
	    ((x>0) && (x<100) && (y>0) && (y<100)));
    }
}

Kommentar:

Beachte die Methode "werteuebernehmen()", die von der Methode "actionPerformed()" aufgerufen wird: Um einen Bereichsfehler bei der Laufzeit zu vermeiden, wird eine irrtümlich zu lang eingegebene Regelkette einfach nach 16 Stellen abgeschnitten...

Die Methode "charAt()" ist für String-Typen realisiert - sie liefert das Zeichen der Zeichenkette an der angegebenen Stelle.


Aufgabe:

Untersuche das Verhalten von Turmiten in Abhängigkeit von der Regelkette! Überprüfe die Gültigkeit des angegebenen Satzes über sysmmetrische Turmitenbahnen! Was passiert, wenn die "1"-en und "0"-en in einer Regelkette vertauscht werden (etwa die Regelkette "010101010010100101" für die Bahn der Langton-Ameise anstelle von "1010101010101010")?


© Alfred Nussbaumer, Weblog "MiniNuss"