uses Graph,crt,dos;
const nc=7;
var
  h,m,sa,ms,s1:word;
  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,r:integer;v:record x,y:integer;end;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;
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(40)+10;
v.x:=random(30)-14;v.y:=random(30)-15;
x:=px+r;px:=px+2+2*r;y:=1+r;
end;
end;
 Procedure Calc(i,j:integer);
var p1,p2:real;
 begin
p1:=sqr(c[i].r)*c[i].v.x+sqr(c[j].r)*c[j].v.x;
p2:=sqr(c[i].r)*c[i].v.y+sqr(c[j].r)*c[j].v.y;

c[i].v.x:=c[i].v.x-round(p1/(2*sqr(c[i].r)));
c[j].v.x:=c[j].v.x-round(p1/(2*sqr(c[j].r)));
c[i].v.y:=c[i].v.y-round(p2/(2*sqr(c[i].r)));
c[j].v.y:=c[j].v.y-round(p2/(2*sqr(c[j].r)));

if c[i].v.x=0 then c[i].v.x:=random(30)-15;
if c[j].v.x=0 then c[j].v.x:=random(30)-15;
if c[i].v.y=0 then c[i].v.y:=random(30)-15;
if c[j].v.y=0 then c[j].v.y:=random(30)-15;
{c[i].v.x:=-c[i].v.x;
c[i].v.y:=-c[i].v.y;
c[j].v.x:=-c[j].v.x;
c[j].v.y:=-c[j].v.y; }
end;

 Procedure PDes(n:byte);
var t:string;
begin
with c[n] do begin
 circle(x,y,r);
  circle(x-(r div 2),y-(r div 2),r div 10);
  circle(x+(r div 2),y-(r div 2),r div 10);
  Ellipse(x, y, 0, 360, r div 10, r div 4);
  circle(x,y+(r div 2),r div 6);
str(n,t);
  OutTextXY(x-textwidth(t)div 2,y-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 c[ca] do begin k:=readkey;
    case k of
'8':begin v.y:=v.y-1;end;
'2':begin v.y:=v.y+1;end;
'4':begin v.x:=v.x-1;end;
'6':begin v.x:=v.x+1;end;
'7':begin v.y:=v.y-1;v.x:=v.x-1;end;
'9':begin v.y:=v.y-1;v.x:=v.x+1;end;
'3':begin v.y:=v.y+1;v.x:=v.x+1;end;
'1':begin v.y:=v.y+1;v.x:=v.x-1;end;
'5':begin splt;end;
'0':atr;
'a','A':read(ca);
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;y:=y+v.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))) then calc(i,j);
PDes(i);
end;
changepage;
 until k=#27;
   halt(0);
  CloseGraph;
end.