program Party; uses crt; const guests = 50;{100} minpeople = -2; ht = 25; width = 80; maxhate = 10; {10;} tblattract = 25; type ar = array[minpeople .. guests, 1 .. 2] of longint; ar2 = array[minpeople .. guests, minpeople .. guests] of longint; var a: boolean; people: ar; hate: ar2; b: integer; {Counter} c: integer; d: integer; e: integer; hi: real; hsum: real; dist: real; n: longint; xmove: shortint; {integer;} ymove: shortint; {integer;} { loops: integer;} begin randomize; {Position Tables} people[0, 1] := trunc(width / 2); people[0, 2] := trunc(ht / 2); people[-1, 1] := trunc(width /2) + 30; people[-1, 2] := trunc(ht / 2)-5; people[-2, 1] := 1; people[-2, 2] := 2; { c := 0; for b := minpeople to 0 do begin c := c + 2; people[b, 1] := c; people[b, 2] := 2; end;} ClrScr; for b := 1 to guests do begin people[b, 1] := random(width + 1); { The People } people[b, 2] := random(ht + 1); {writeln (people[b, 1], people[b, 2]);} end; for b := 1 to guests do begin for c := 0 to guests do begin hate[b, c] := trunc(random * 2 * maxhate - maxhate); end; end; repeat clrscr; for b := minpeople to guests do begin gotoxy (people[b, 1], people[b, 2]); if (b <= 0) then begin if (b = -2) then begin textcolor(1); write (#219); gotoxy(wherex - 1, wherey - 1); write('Washroom'); end else begin textcolor(6); write (#219); end; end else begin textcolor((b mod 9)+8); write (#2); end; end; {write(random(10 + 1));} for b := 1 to guests do begin for c := minpeople to 0 do begin if hate[b, c] > -tblattract then hate[b, c] := hate[b, c] - 1; if sqr(people[b, 1] - people[c,1]) + sqr(people[b, 2] - people[c, 2]) < 2 then hate[b, c] := maxhate; end; end; for b := 1 to guests do begin hi := 1000; for c := -1 to 1 do begin for d := -1 to 1 do begin hsum := 0; { for e := 0 to guests do} for e := minpeople to guests do begin if (e <> b) then begin dist := sqr(people[b, 1] + c - people[e, 1]) + sqr(people[b, 2] + d - people[e, 2]); if (dist > 0) then begin hsum := hsum + hate[b, e] / dist; if (dist < 1.5) then begin n := trunc(random(3)); if (n = 1) and (hate[b, e] < maxhate) then hate[b, e] := hate[b, e] + 1; if (n = 2) and (hate[b, e] > -maxhate) then hate[b, e] := hate[b, e] - 1; end; end else begin e := guests; hsum := 1000; end; end; end; if (hsum < hi) then begin hi := hsum; xmove := c; ymove := d; end; end; end; if (people[b,1] + xmove > 0) and (people[b, 1] + xmove < width) then people[b, 1] := people[b, 1] + xmove; if (people[b, 2] + ymove > 0) and (people[b, 2] + ymove < ht) then people[b, 2] := people[b, 2] + ymove; end; if keypressed then halt; {end;} { loops := loops + 1;} until a = true end.