program battle;

const waitmin=0;

type
     nesw=(n,e,s,w);
     look = record
       case byte of
         1: ( ch: char;  col: byte;
              bgch: char; bgcol: byte; );
         2: ( cr,bg:integer );
     end;
     crab = record  x, y: integer; dir: nesw; wait: integer;  end;

const
    num = 3 ;
    info: array[1..num] of look =
        ((ch:'';col:9; bgch:'Û';bgcol:1),
         (ch:'';col:10;bgch:'Û';bgcol:2),
         (ch:'';col:12;bgch:'Û';bgcol:4) (* ,
         (ch:'';col:14;bgch:'Û';bgcol:6) *) );

var
    crabs: array[1..num] of crab;
    screen: array[0..24,0..39] of integer absolute $b800:$0000;
    i:integer; ch:char;

procedure writexy(x,y:integer; obj:integer);
begin screen[y,x]:=obj; end;

function readxy(x,y:integer): integer;
begin readxy:=screen[y,x]; end;

function newdir(dir:nesw):nesw;
begin
  case dir of
    n,s: if random(2)=1 then newdir:=e else newdir:=w;
    e,w: if random(2)=1 then newdir:=n else newdir:=s;
  end;
end;

procedure stepcrab(i:integer);
begin
  with crabs[i] do begin
    case dir of
      n: if y>0 then y:=y-1 else wait:=1;
      e: if x<39 then x:=x+1 else wait:=1;
      s: if y<24 then y:=y+1 else wait:=1;
      w: if x>0 then x:=x-1 else wait:=1;
    end;
    if readxy(x,y) = info[i].bg then
      begin if (wait>waitmin) and (wait<=0) then wait:=wait-1 end
    else wait:=wait+1;
    if wait > 0 then begin
      dir:=newdir(dir);
    end else begin
      if random(100)<5 then dir:=newdir(dir);
    end;
  end;
end;


begin
  textmode(c40); randomize;

  for i:=1 to num do with crabs[i] do begin
    x:= random(40); y:= random(25);
    dir := nesw(random(4));
    wait:=0;
  end;

  i:=0;
  repeat
    i:=i+1; if i>num then i:=1;
    with crabs[i],info[i] do begin
      if wait > 0 then wait:=wait-1 else begin

        writexy(x,y,bg);

        stepcrab(i);

        writexy(x,y,cr);

      end;
    end;
    delay(50);
  until keypressed;

  read(kbd,ch);
  textmode;
end.
