uses crt,graph,uspace;
var l,px,py,dx,dy,cdr:integer;
    cerc:boolean;
    k:char;

procedure elem(i,j:integer);
var a,b,c,d:record x,y:integer;end;
    m,n:integer;
begin
for m:=1 to 2 do for n:=1 to 2 do begin
a.x:=(2*(i-1)+((n+1)mod 2)+((m+1)mod 2))*2;a.y:=(2*(j-1)+((n+1)mod 2))*2;
b.x:=(2*(i-1)+((m+1)mod 2)+(n mod 2))*2;   b.y:=(2*(j-1)+(1+(n+1)mod 2))*2;
c.x:=(2*(i-1)+(m+1)mod 2)*2+1;             c.y:=(2*(j-1)+(n+1)mod 2)*2+1;
d.x:=(2*(i-1)+n mod 2+((m+n)div 4)*2)*2;   d.y:=(2*(j-1)+(m+n)-2)*2;
line(a.x*l+px,a.y*l+py,b.x*l+px,b.y*l+py);
line(c.x*l+px,c.y*l+py,d.x*l+px,d.y*l+py);
end;
if cerc then begin
  circle(px+(4*i)*l,py+(4*j-1)*l,l,getcolor);
  circle(px+(4*i-2)*l,py+(4*j-3)*l,l,getcolor);
end;
end;

procedure inter(var d:integer;b,e:integer);
 var t:integer;w:word;
begin
if e<>b then begin
 if b>e then begin t:=b;b:=e;e:=t;end;
 w:=e-b;
 if(d>=e)then d:=(d-b)mod w+b;
 if(d<=b)then d:=(d-e)mod w+e;
end else d:=0;
end;

begin
init(6);
randomize;cdr:=1;
setcolor(random($ff));
l:=25;px:=0;py:=0;
dx:=random(7)-3;dy:=random(7)-3;
repeat
 repeat
  changepage;
  inc(cdr);  inter(cdr,0,maxint);
  inter(dx,-4*l,4*l);inter(dy,-4*l,4*l);
  inc(px,dx);inc(py,dy);
  inter(px,-4*l,4*l);inter(py,-4*l,4*l);
  for i:=0 to mx div (l*4)+2 do for j:=0 to my div (l*4)+2 do elem(i,j);
  if cdr mod 1000=0 then begin setcolor(random($ff0)+$f);cerc:=random(2)=1;end;
  if cdr mod 300=0 then dx:=dx+random(5)-2;
  if cdr mod 300=150 then dy:=dy+random(5)-2;
  if cdr mod 500=25 then l:=l+random(l)-l div 2;
  outtextxy(2,2,'<'+tex(cdr)+'>');
 until keypressed or not((dx<>0)or(dy<>0));
 k:=readkey;
  case k of
   '+':inc(l);'-':dec(l);'s':readkey;'c':setcolor(random($fff));'o':cerc:=not cerc;
   #72:dy:=dy-1;#75:dx:=dx-1;#77:dx:=dx+1;#80:dy:=dy+1;
  end;
  Inter(l,my div 4,0);
until k=#27;
end.