Die Langton-Ameise
Die Langton-Ameise stellt eine sogenannte Turing-Maschine dar: Eine Ameise sitzt auf einem Feld, das aus lauter kleinen Quadraten zusammengesetzt wird. Sie geht ein Quadrat weiter: Ist das Quadrat dort rot;, so wendet sie sich nach links, färbt das Quadrat weiß und krabbelt um ein Quadrat weiter. Trifft die Ameise auf ihrer Tour auf ein weißes Quadrat, so wendet sie sich nach rechts, färbt das Quadrat weiß und geht um ein Quadrat weiter.
Wir wollen die Tour der Ameise darstellen:
Wir setzen das kybernetische Wesen in die Mitte eines Zeichenfeldes und wählen die Pixel des Bildschirms als kleine Quadrate, die die Ameise besuchen soll. Die Farben werden durch 'clWhite' und 'clRed' dargestellt. Die Krabbelrichtung der Ameise wird in vier Bytes ausgedrückt:
0 - auf dem Bildschirm nach oben (dec(y))
1 - auf dem Bildschirm nach rechts (inc(x))
2 - auf dem Bildschirm nach unten (inc(y))
3 - auf dem Bildschirm nach links (dec(x))
Daraus ergibt sich: Wendet sich die Ameise nach rechts (Pixel clRed), so muss die Richtung um 1 verringert werden, andernfalls wird die Richtung um 1 erhöht. Erreicht das Richtungsbyte den Wert 4, wird er wieder auf 0 gesetzt...
procedure TForm1.Button1Click(Sender: TObject); var x,y,i,j:integer; richtung:byte; begin richtung:=1; x:=320; y:=240; inc(x); paintbox1.canvas.brush.color:=clWhite; paintbox1.canvas.pen.color:=clRed; paintbox1.canvas.rectangle(0,0,paintbox1.width,paintbox1.height); repeat with paintbox1 do begin if Canvas.Pixels[x,y]=clRed then begin richtung:=richtung-1; Canvas.Pixels[x,y]:=clWhite; end else begin richtung:=((richtung+1) mod 4); Canvas.Pixels[x,y]:=clRed; end; case richtung of 0:dec(y); 1:inc(x); 2:inc(y); 3:dec(x); end; if richtung=0 then richtung:=4; end; until (x<50) or (y<1) or (x>638) or (y>478); end;
Die Tour der Langton-Ameise im Großformat:
Dazu setzen wir die Ameise auf ein Quadrat, das beispielsweise aus 6x6 Pixel besteht und lassen das kybernetische Tierchen jeweils um 6 Pixel weiterkrabbeln...
procedure tform1.putpix(x,y:integer; farbe:TColor); begin Canvas.Brush.Color:=farbe; Canvas.Pen.Color:=farbe; Canvas.Rectangle(x-3,y-3,x+3,y+3); end; procedure TForm1.LangtonClick(Sender: TObject); var x,y:integer; richtung:byte; farbe:TColor; begin with paintbox1 do begin left:=0; top:=0; width:=640; height:=440; Canvas.Pen.Color:=clBlack; Canvas.Brush.Color:=clWhite; Canvas.Rectangle(1,1,639,440); farbe:=ClRed; formturmite.caption:='Langtons Ameise in Großformat'; richtung:=1; Canvas.Pen.Color:=clRed; x:=320; y:=222; x:=x+1; repeat if Canvas.Pixels[x,y]=clWhite then begin richtung:=((richtung+1) mod 4); putpix(x,y,farbe); end else begin richtung:=((richtung-1) mod 4); putpix(x,y,clWhite); end; case richtung of 0:y:=y-6; 1:x:=x+6; 2:y:=y+6; 3:x:=x-6; end; if richtung=0 then richtung:=4; until (x<50) or (y<10) or (x>625) or (y>425); end; end;