Program Wusel;
uses
    Crt,Graph,Alldrivers;
const
     MaxPunkt = 500;
     MaxKreis = 15;

var
  wurm       : array[0..MaxKreis] of PointType;
  richtung   : array[0..35] of PointType;
  punkt      : array[0..MaxPunkt] of PointType;
  zeiger     : integer;
  pZeiger    : integer;
  xpos,ypos  : integer;
  dir,cc     : integer;
  ColorLoc   : Integer;
  ch         : char;


procedure ZeichneKreis10(x,y:integer);

  procedure Zeichne4(xofs,yofs:integer);
  begin
  PutPixel(x+xofs,y+yofs,ColorLoc);
  PutPixel(x+xofs,y-yofs,ColorLoc);
  PutPixel(x-xofs,y+yofs,ColorLoc);
  PutPixel(x-xofs,y-yofs,ColorLoc);
  end;

begin
x := x+14;
y := y+14;
Zeichne4(10,0);
Zeichne4(10,1);
Zeichne4(10,2);
Zeichne4(10,3);
Zeichne4( 9,4);
Zeichne4( 9,5);
Zeichne4( 8,6);
Zeichne4( 7,7);
Zeichne4( 6,8);
Zeichne4( 5,9);
Zeichne4( 4,9);
Zeichne4( 3,10);
Zeichne4( 2,10);
Zeichne4( 1,10);
Zeichne4( 0,10);
end;


Procedure ShowWusel;
var stop : boolean;
    zeiger : integer;
    ch     : char;
begin
stop := false;
for zeiger := 0 to MaxKreis do begin
    wurm[zeiger].x := GetMaxX div 2;
    wurm[zeiger].y := GetMaxY div 2;
    end;
for zeiger := 0 to 35 do begin
    richtung[zeiger].y := round(4*sin(zeiger*0.1745));
    richtung[zeiger].x := round(4*cos(zeiger*0.1745));
    end;
for zeiger := 0 to MaxPunkt do begin
    punkt[zeiger].x := GetMaxX div 2;
    punkt[zeiger].y := GetMaxY div 2;
    end;
pZeiger := 0;
zeiger := 0;
xpos := GetMaxX div 2;;
ypos := GetMaxY div 2;;
dir := 0;
cc := -1;
ColorLoc := 0;
repeat
      ZeichneKreis10(wurm[zeiger].x,wurm[zeiger].y);
      ColorLoc := Lightgreen;
      punkt[pZeiger].x := wurm[zeiger].x+14;
      punkt[pZeiger].y := wurm[zeiger].y+11;
      PutPixel(punkt[pzeiger].x,punkt[pzeiger].y,ColorLoc);
      if (xpos < 0) then begin
         dir := 0;
         end else
         if (xpos > (GetMaxX - 28)) then begin
            dir := 18;
            end else
            if (ypos < 0) then begin
               dir := 9;
               end else
               if (ypos > (GetMaxY - 28)) then begin
                  dir := 27;
                  end else begin
                      dir := (dir + random(7) - 3);
                      if dir < 0 then dir := dir + 36 else dir := dir mod 36;
                      end;
      xpos := xpos + richtung[dir].x;
      ypos := ypos + richtung[dir].y;
      wurm[zeiger].x := xpos;
      wurm[zeiger].y := ypos;
      ZeichneKreis10(wurm[zeiger].x,wurm[zeiger].y);
      zeiger := succ(Zeiger) mod (MaxKreis + 1);
      pZeiger := succ(pZeiger) mod (MaxPunkt + 1);
      ColorLoc := Black;
      PutPixel (punkt[pZeiger].x,punkt[pZeiger].y,ColorLoc);
      if keypressed then begin
         ch := readkey;
         stop := true;
         end;
until stop;
end;



var
   gd,gm : integer;
begin
gd := detect;
initgraph(gd,gm,'');
if graphresult <> 0 then halt;
ShowWusel;
CloseGraph;
end.

