uses Graph,crt,dos;
const nc=7;
var
  h,m,sa,ms,s1:word;
  grvt:record x,y,c:real;end;
  mx,my,ex,ey,i,j:integer;
  k:char;ca:byte;
  dir:array[1..9] of char;
  page:boolean;
  c:array[1..nc] of record
  x,y:real;r:integer;v:record x,y:real;end;o:byte;end;

procedure SPlt;
var a:integer;
begin
for a:=1 to 254 do SetRGBPalette(a,a div 5+random($ffffff)+$ff,random($aaaaaa),a div 2+random($ffffff)+$ffff);
end;
function hour:string;
var sh,sm,ss:string;
begin
str(h:0,sh);str(m:0,sm);str(sa:0,ss);
if length(sh)=1 then sh:='0'+sh;
if length(sm)=1 then sm:='0'+sm;
if length(ss)=1 then ss:='0'+ss;
hour:=sh+':'+sm+':'+ss;
end;
 procedure ChangePage;
begin
  if Page then begin
    SetActivePage(0);
    SetVisualPage(1,true);
    Page:=false;
  end else begin
    SetActivePage(1);
    SetVisualPage(0,true);
    Page:=true;
  end;
  ClearPage;
   OutTextXY(mx div 2-textwidth(hour)div 2, 1, hour);
end;
 Procedure Atr;
var px,py:integer;
begin
mx:=getmaxx;my:=getmaxy;
ex:=mx div 2;ey:=my div 2;
page:=false;
grvt.x:=0;grvt.y:=0;grvt.c:=0.2;
dir[1]:='1';dir[2]:='2';dir[3]:='3';
dir[4]:='4';dir[5]:='5';dir[6]:='6';
dir[7]:='7';dir[8]:='8';dir[9]:='9';
gettime(h,m,sa,ms); s1:=m;
px:=1;py:=1;  ca:=nc div 2;
for i:=1 to nc do with c[i] do begin
r:=random(30)+10;
v.x:=random(300)-149;v.y:=random(300)-150;
x:=px+r;px:=px+2+2*r;y:=random(my-2*r-1)+1+r;o:=0;
end;
end;

 Procedure repimp(var v1,v2:real;m1,m2:real);
Var Pe:real;va,vb:real;       pos,v:string;
Begin
Pe:=((v1-v2)*m1)/5;
va:=(m1*(v1-v2)-Pe*(2*m1+m2)/m1)/(m1+m2)+v2;
vb:=(m1*(v1-v2)+Pe*(2*m1+m2)/m2)/(m1+m2)+v2;
v1:=va;v2:=vb;
End;

 Procedure Calc(i,j:integer);
var p1,p2:real;m1,m2:real;
 begin
repimp(c[i].v.x,c[j].v.x,sqr(c[i].r),sqr(c[j].r));
repimp(c[i].v.y,c[j].v.y,sqr(c[i].r),sqr(c[j].r));
end;

 Procedure PDes(n:byte);
var t:string;px,py:integer;
begin
with c[n] do begin
px:=round(x);py:=round(y);
 circle(px,py,r);
  circle(px-(r div 2),py-(r div 2),r div 10);
  circle(px+(r div 2),py-(r div 2),r div 10);
  Ellipse(px, py, 0, 360, r div 10, r div 4);
  circle(px,py+(r div 2),r div 6);
str(n,t);
  OutTextXY(px-textwidth(t)div 2,py-r,t);
end;
end;

 begin
SetSVGAMode(640, 480, 8, LfbOrBanked);
  OutTextXY(270, 230, 'Please wait...');
randomize;           splt;
  SetRGBPalette(255, 63, 63, 63);
drawborder:=false;
Atr;

 repeat
for i:=1 to nc do begin
gettime(h,m,sa,ms);
if keypressed then
with grvt do begin
k:=readkey;
    case k of
'8':begin y:=y-c;end;
'2':begin y:=y+c;end;
'4':begin x:=x-c;end;
'6':begin x:=x+c;end;
'7':begin y:=y-c;x:=x-c;end;
'9':begin y:=y-c;x:=x+c;end;
'3':begin y:=y+c;x:=x+c;end;
'1':begin y:=y+c;x:=x-c;end;
'5':begin splt;end;
'0':begin x:=0;y:=0;end;
#27:halt(0);
end;end;

if s1+3<m then begin atr;s1:=m end;
with c[i] do begin
if(x<=r)then v.x:=abs(v.x);
if(x>=getmaxx-r)then v.x:=-abs(v.x);
if(y<=r)then v.y:=abs(v.y);
if(y>=getmaxy-r)then v.y:=-abs(v.y);
x:=x+v.x/10;y:=y+v.y/10;
end;
with c[i] do begin v.x:=v.x+grvt.x;v.y:=v.y+grvt.y;end;

for j:=i+1 to nc do
if ((c[i].r+c[j].r)>=(sqrt(sqr(c[i].x-c[j].x)+sqr(c[i].y-c[j].y))))and(i<>c[j].o)and(j<>c[i].o)
then begin c[i].o:=j;c[j].o:=i;calc(i,j);end;
PDes(i);
end;
changepage;
 until k=#27;
   halt(0);
  CloseGraph;
end.