program Billard;
{19.06.1998/20.45/ nur die Steuerung fehlt noch}
{Versuch: mit Keypressed, Testvariable in jeder Schleife/Prozedur/until...}
{VOR START BITTE ANGEBEN; WO SICH GRAPH BEFINDET}
uses graph,crt;
type Kord=array[1..2] of record
                         x,y,r:integer;
                         f:byte;
                         end;
var j,i,z,b,y,x,t,speicher,grdriver,grmode,a:integer;
    size:word;
    p:pointer;
    test:char;
    kreis:Kord;
    datei:file of kord;
    pos1:byte;
    pos2:string[2];

{P R O Z E D U R E N}
procedure Eingabe;
begin
clrscr;
for i:=1 to 2 do
 with kreis[i] do begin
  write('x: ');readln(x);
  write('y: ');readln(y);
  write('r: ');readln(r);
  write('f: ');readln(f);
 end;
end;

procedure speichern;
begin
assign(datei,'kreis.dat');
rewrite(datei);
write(datei,kreis);
close(datei);
end;

procedure laden;
begin
assign(datei,'kreis.dat');
reset(datei);
read(datei,kreis);
close(datei);
end;

procedure zeichnen;
begin
for i:=1 to 2 do
 with kreis[i] do
  begin
   setfillstyle(1,f);setcolor(f);
   sector(x,y,0,360,r,r);
  end;
a:=1;b:=5;

y:=400;x:=580;t:=5;
rectangle(x+50,y+50,t-5,t-5);

size:=imagesize(kreis[1].x-kreis[1].r-a,kreis[1].y-kreis[1].r-a,kreis[1].x+kreis[1].r+a,kreis[1].y+kreis[1].r+a);
getmem(p,size);
getimage(kreis[1].x-kreis[1].r-a,kreis[1].y-kreis[1].r-a,kreis[1].x+kreis[1].r+a,kreis[1].y+kreis[1].r+a,p^);
end;

procedure bewegen1;
begin
pos2:='0';
 while pos2='0' do begin
  i:=i+1;j:=j+1;
  delay(b);

  putimage(kreis[1].x-kreis[1].r+i,kreis[1].y-kreis[1].r+j,p^,normalput);
  if (kreis[1].x-kreis[1].r+i>x) or (kreis[1].x-kreis[1].r+i<t) then pos2:='1';
  if (kreis[1].y-kreis[1].r+j>y) or (kreis[1].y-kreis[1].r+j<t) then pos2:='1';
  if keypressed then pos2:='2';
 end;
pos1:=1;
end;

procedure bewegen2;
begin
pos2:='0';
 while pos2='0' do begin
  i:=i+1;j:=j-1;
  delay(b);

  putimage(kreis[1].x-kreis[1].r+i,kreis[1].y-kreis[1].r+j,p^,normalput);
  if (kreis[1].x-kreis[1].r+i>x) or (kreis[1].x-kreis[1].r+i<t) then pos2:='1';
  if (kreis[1].y-kreis[1].r+j>y) or (kreis[1].y-kreis[1].r+j<t) then pos2:='1';
  if keypressed then pos2:='2';
 end;
pos1:=2;
end;

procedure bewegen3;
begin
 pos2:='0';
 while pos2='0' do begin
  i:=i-1;j:=j-1;
  delay(b);

  putimage(kreis[1].x-kreis[1].r+i,kreis[1].y-kreis[1].r+j,p^,normalput);
  if (kreis[1].x-kreis[1].r+i>x) or (kreis[1].x-kreis[1].r+i<t) then pos2:='1';
  if (kreis[1].y-kreis[1].r+j>y) or (kreis[1].y-kreis[1].r+j<t) then pos2:='1';
  if keypressed then pos2:='2';
 end;
pos1:=3;
end;

procedure bewegen4;
begin
pos2:='0';
 while pos2='0' do
 begin
  i:=i-1;j:=j+1;
  delay(b);

  putimage(kreis[1].x-kreis[1].r+i,kreis[1].y-kreis[1].r+j,p^,normalput);
   if (kreis[1].x-kreis[1].r+i>x) or (kreis[1].x-kreis[1].r+i<t) then pos2:='1';
  if (kreis[1].y-kreis[1].r+j>y) or (kreis[1].y-kreis[1].r+j<t) then pos2:='1';
  if keypressed then pos2:='2';
 end;
pos1:=4;
end;
 

{H A U P T P R O G R A M M}
begin
write('Wollen sie einen neuen Kreis eingeben? j/n');readln(Test);
if Test='j' then begin Eingabe;Speichern;end
   else laden;

grdriver:=detect;
initgraph(grdriver,grmode,'');
zeichnen;readln;
i:=0;j:=0;

pos1:=1;
bewegen1;
while (pos2='1') do
 begin
  if pos1=1 then
    if (kreis[1].y+kreis[1].r+j)>470
      then bewegen2
      else bewegen4;
  if pos1=2 then
    if (kreis[1].y-kreis[1].r+j)<5
      then bewegen1
      else bewegen3;
  if pos1=3 then
    if (kreis[1].y-kreis[1].r+j)<5
      then bewegen4
      else bewegen2;
  if pos1=4 then
    if (kreis[1].x-kreis[1].r+i)<5
      then bewegen1
      else bewegen3;
  end;

readln;
end.