Turing-Maschinen

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;      

Inhaltsverzeichnis "Delphi"
Nussbaumers Seite