program wator;

uses crt,dos;

const fasten=4;
      hbrut=12;
      fbrut=6;
      maxf=53;
      maxh=5;
      maxx=69;
      maxy=22;
      chrono=500;
      zug:array[1..16] of shortint=(-1,-1,0,-1,1,-1,1,0,1,1,0,1,-1,1,-1,0);

var r:registers;
    a:char;
    see:array[1..maxx,1..maxy] of integer;
    fischzug:array[1..maxx,1..maxy] of boolean;
    haizug:array[1..maxx,1..maxy] of boolean;
    hunger:array[1..maxx,1..maxy] of shortint;
    xfelder:array[1..8]of shortint;
    yfelder:array[1..8]of shortint;
    x,y,xn,yn,t,frei:shortint;
    I:integer;


procedure init;

begin
  randomize;
  r.ah:=1;
  r.ch:=215;
  r.cl:=215;
  intr($10,r);
  for x:=1 to maxx do
    for y:=1 to maxy do
    begin
      see[x,y]:=0;
      fischzug[x,y]:=false;
      haizug[x,y]:=false;
      hunger[x,y]:=0;
    end;
  for i:=1 to maxf do
  begin
    repeat
      x:=random(maxx)+1;
      y:=random(maxy)+1;
    until see[x,y]=0;
    see[x,y]:=random(fbrut)+1;
  end;
  for i:=1 to maxh do
  begin
    repeat
      x:=random(maxx)+1;
      y:=random(maxy)+1;
    until see[x,y]=0;
    see[x,y]:=-(random(hbrut)+1);
  end;
end;


begin
  textbackground(0);
  clrscr;
  init;
  textbackground(1);
  repeat
    for x:=1 to maxx do
      for y:=1 to maxy do
      begin
        gotoxy(x+10,y);
        if see[x,y]=0 then write(' ');
        if see[x,y]>0 then
        begin
          textcolor(0);
          write('.');
        end;
        if see[x,y]<0 then
        begin
          textcolor(4);
          write('0');
        end;
      end;
    for x:=1 to maxx do
      for y:=1 to maxy do
      begin
        if (see[x,y]>0) and (fischzug[x,y]=false) then
        begin
          frei:=0;
          for t:=1 to 8 do
          begin
            xn:=x+zug[t*2-1];
            yn:=y+zug[t*2];
            if xn<1 then xn:=maxx;
            if yn<1 then yn:=maxy;
            if yn>maxy then yn:=1;
            if xn>maxx then xn:=1;
            if see[xn,yn]=0 then
            begin
              inc(frei,1);
              xfelder[frei]:=xn;
              yfelder[frei]:=yn;
            end;
          end;
          if frei>0 then
          begin
            t:=random(frei)+1;
            xn:=xfelder[t];
            yn:=yfelder[t];
            if see[xn,yn]<>0 then write(chr(7));
            see[xn,yn]:=see[x,y]+1;
            see[x,y]:=0;
            fischzug[xn,yn]:=true;
            if see[xn,yn]>=fbrut then
            begin
              see[xn,yn]:=1;
              see[x,y]:=1;
              fischzug[x,y]:=true;
            end;
          end
          else inc(see[x,y],1);
        end;
        if (see[x,y]<0) and (haizug[x,y]=false) then
        begin
          if hunger[x,y]=fasten then
          begin
            hunger[x,y]:=0;
            see[x,y]:=0;
          end
          else begin
            frei:=0;
            for t:=1 to 8 do
            begin
              xn:=x+zug[t*2-1];
              yn:=y+zug[t*2];
              if xn<1 then xn:=maxx;
              if yn<1 then yn:=maxy;
              if yn>maxy then yn:=1;
              if xn>maxx then xn:=1;
              if see[xn,yn]>0 then
              begin
                inc(frei,1);
                xfelder[frei]:=xn;
                yfelder[frei]:=yn;
              end;
            end;
            if frei>0 then
            begin
              t:=random(frei)+1;
              xn:=xfelder[t];
              yn:=yfelder[t];
              see[xn,yn]:=see[x,y]-1;
              see[x,y]:=0;
              haizug[xn,yn]:=true;
              hunger[x,y]:=0;
              hunger[xn,yn]:=0;
              if see[xn,yn]<=-hbrut then
              begin
                see[xn,yn]:=-1;
                see[x,y]:=-1;
                haizug[x,y]:=true;
              end;
            end
            else begin
              frei:=0;
              for t:=1 to 8 do
              begin
                xn:=x+zug[t*2-1];
                yn:=y+zug[t*2];
                if xn<1 then xn:=maxx;
                if yn<1 then yn:=maxy;
                if yn>maxy then yn:=1;
                if xn>maxx then xn:=1;
                if see[xn,yn]=0 then
                begin
                  inc(frei,1);
                  xfelder[frei]:=xn;
                  yfelder[frei]:=yn;
                end;
              end;
              if frei>0 then
              begin
                t:=random(frei)+1;
                xn:=xfelder[t];
                yn:=yfelder[t];
                see[xn,yn]:=see[x,y]-1;
                see[x,y]:=0;
                haizug[xn,yn]:=true;
                inc(hunger[x,y],1);
                hunger[xn,yn]:=hunger[x,y];
                hunger[x,y]:=0;
                if see[xn,yn]<=-hbrut then
                begin
                  see[xn,yn]:=-1;
                  see[x,y]:=-1;
                  haizug[x,y]:=true;
                end;
              end
              else begin
                inc(hunger[x,y],1);
                dec(see[x,y],1);
              end;
            end;
          end;
        end;
      end;
    for x:=1 to maxx do
      for y:=1 to maxy do
      begin
        haizug[x,y]:=false;
        fischzug[x,y]:=false;
      end;
  until keypressed;
end.