Помогите понять в чем ошибка.

Гранат Фруктов

Нашел интересную на мой взгляд программу на Паскале, но при прогоне выдает не те значения. И кто знает как сделать её менее громоздкой?
```
program football;
(Программа составлена Р. Форсайтом, PNL? август 1981 г.)
const
halftime = 45;
deep = 20; //Ширина
wide = 32; //Длина
q1 = wide div 4;
q2 = wide div 2;
q3 = q1 + q2; //Границы зон
blob = 42; //Изображение мяча
ball = 0;
null = ' '; //Пробел
homeside = 'ARGENTINA'; //Названия команд
awayside = 'HOLLAND';

type
byte = 0..255;
cardinal = 0..maxint;
players = 0..10; //0=мяч, 1-5=домашняя команда, 6-10=соперники

var
half: 1..2;
tick: cardinal; //отсчет времени
name: array [players] of char;
down, east: array [players] of real; //Координаты по вертикали и вертикали
emin, emax: array [players] of byte; //Границы перемещения игроков
p, pn, withball: players;
goal: boolean;
seed: cardinal;
homegoal, awaygoal: cardinal; //Число забитых голов
hometeam, awayteam: set of players; //Игроки двух команд

procedure home; //Перевод курсора в верхний левый угол
begin
write(chr(29));
end;

procedure clrs; //Очистка экрана
begin
write(chr(12));
end;

procedure plot(a, b: real; c: char); //Установка символа по координатам
var
down, east, j: cardinal;
begin
down := round(a);
east := round(b);
home;
for j := 1 to down do
write(chr(10)); //сдвиг на строку вниз
for j := 1 to east do
write(chr(24)); //Сдвиг в вправо
write(c);
end;

procedure wait(t: integer); //Задержка времени
begin
t := t * 10;
while t > 0 do
t := t - 1;
end;

procedure init; //Присвоение значений глобальных перемен
var
p, g: players;
begin
name[ball] := chr(blob); //изображение мяча и игроков
for p := 1 to 5 do
name[p] := chr(ord('0') + p);
for p := 6 to 10 do
name[p] := chr(ord('a') + p - 6);
emin[ball] := 0;emax[ball] := wide + 1;
emin[1] := 0;emax[1] := q1; //зона вратаря
emin[2] := 0;emax[2] := q3;
emin[3] := 0;emax[3] := q3; //зона защитников
emin[4] := 0;emax[4] := wide;
emin[5] := 0;emax[5] := wide; //зона нападающих
emin[6] := 0;emax[6] := wide;
g := 5;
for p := 7 to 10 do //зона действия противника
begin
emin[p] := emin[g];
emax[p] := emax[g];
g := g - 1;
end;
seed := 0;withball := 0;
homegoal := 0;awaygoal := 0;
hometeam := [1..5];
awayteam := [6..10];
end;

procedure ballpark; //разметка поля
var
j: byte;
begin
clrs;home;
write('+');
for j := 1 to wide do write('-');
writeln('+'); //верхняя боковая линия
for j := 1 to deep div 2 do writeln('!', null:wide, '!');
for j := 1 to 4 do writeln; //линия ворот
for j := 1 to deep div 2 do writeln('!', null:wide, '!');
write('+');
for j := 1 to wide do write('-');
writeln('+'); //нижняя боковая линия
wait(100);
end;

function distance(row1, col1, row2, col2: real): real; //вычесления растояния между двумя точками
begin
distance := sqrt(sqr(row1 - row2) + sqr(col1 - col2));
end;

function rand: real; //генератор псевдослучайных чисел
const
c = 824;
k = 0;
m = 10657;
var
s: real;
begin
if seed = 0 then
begin
plot(deep + 2, 24, null);
write('luck no.?');
readln(seed);
end;
s := seed * c + k;
s := s - trunc(s / m) * m;
seed := round(s);
rand := s / m;
end;

procedure kickoff; //Растоновка футболистов
var
p: players;
begin
goal := false;
ballpark;
east[ball] := q2;
east[1] := 1;east[6] := wide;
east[2] := q1;east[7] := q3;
east[3] := q1;east[8] := q3;
east[4] := q2 - 1;east[9] := q2 + 1;
east[5] := q2 - 1;east[10] := q2 + 1;
down[ball] := deep / 2;
down[1] := down[ball];
down[2] := deep / 4;
down[3] := down[1] + down[2];
down[4] := down[2] - 1;
down[5] := down[3] + 1;
for p := 6 to 10 do
down[p] := down[p - 5]; //вывод позиций
for p := 0 to 10 do
plot(down[p], east[p], name[p]); //Счет встречи
plot(deep + 2, 7, null);
write(homeside:12, homegoal:4);
plot(deep + 3, 7, null);
write(awayside:12, awaygoal:4);
wait(256);
end;

procedure swapover; //смена ворот
var
p: players;
swap: char;
begin
for p := 1 to 5 do
begin
swap := name[p];
name[p] := name[p + 5];
name[p + 5] := swap;
end;
end;

procedure move(p: players; rows, cols: real); //перемещение игроков
var
h, v, dh, dv, diffmax: real;
i: byte;
begin
v := rows + rand - rand;
h := cols + rand - rand; //смещение по вертикали
if p = ball then diffmax := deep
else diffmax := deep / 2; //перемещение мяча
dv := v - down[p];
if dv > diffmax then dv := diffmax
else if dv < (-diffmax) then dv := -diffmax;
v := down[p] + dv; //смещение по горизонтали
if p = ball then diffmax := wide / 2
else diffmax := wide / 4;
dh := h - east[p];
if dh > diffmax then dh := diffmax
else if dh < (-diffmax) then dh := -diffmax;
h := east[p] + dh; //проверка границ
if v > deep then v := deep
else if v < 1 then v := 1;
if h > emax[p] then h := emax[p]
else if h < emin[p] then h := emin[p]; //перемещение за восемь шагов
dv := (v - down[p]) / 8;
dh := (h - east[p]) / 8;
for i := 1 to 8 do
begin
plot(down[p], east[p], null); //прежняя позиция
down[p] := down[p] + dv;
east[p] := east[p] + dh;
plot(down[p], east[p], name[p]); //новая позиция
end;
end;

procedure pick(var p: players); //выбор игрока совершающего действие
var
r: byte;
n, nearest: players;
d, dmin: real;
begin
if p = 0 then p := trunc(rand * 10) + 1; //поиск ближайщего к мячу игрока
nearest := 1;
dmin := distance(down[1], east[1], down[ball], east[ball]);
for n := 2 to 10 do
begin
d := distance(down[n], east[n], down[ball], east[ball]);
if d < dmin then
begin
dmin := d;nearest := n;
end;
end;
if(withball = 0) or (rand > 0.8) then
withball := nearest; // //определение варианта действий
r := trunc(rand * 4);
case r of
0: p := p;
1: p := withball;
2: p := trunc(rand * 10) + 1;
3: p := nearest;
end;
end;

function near(diff: real): boolean; //проверка растояния
begin
diff := diff * rand;
if diff < (wide / 8) then
near := true
else near := false;
end;

function nearball(p: players): boolean; //если достаточно близок к мячу
var
d: real;
begin
d := distance(down[p], east[p], down[ball], east[ball]);
nearball := near(d);
end;

function neargoal(p: players): boolean; //если близок к воротам
var
d: real;
edge: byte;
begin
if p in hometeam then edge := wide
else edge := 1;
d := distance(down[p], east[p], deep / 2, edge * 10);
neargoal := near(d);
end;

function blocked(p: players): boolean; //значение 1 если может блокировать
var
j, n: players;
d, dmin: real;
begin
if p in hometeam then n := 6
else n := 1;
dmin := wide * deep;
for j := n to n + 4 do
begin
d := distance(down[p], east[p], down[j], east[j]);
if d < dmin then dmin := d;
end;
if near(dmin) then blocked := true
else blocked := false;
end;

procedure pass(p: players); //передача паса
var
n: players;
edge: byte;
begin
if p in hometeam then
begin
n := 1;edge := wide;
end
else
begin
n := 6;edge := 1;
end;
n := trunc(rand * 5) + n;
move(p, down[ball], east[ball]);
if p = n then
begin
withball := 0;
move(ball, down[p], (edge + east[p]) / 2);
end
else
begin
move(ball, down[p], east[p]);
withball := n;
end;
end;

procedure dribble(p: players); //перемещение по полю с мячом
var
h, v: real;
begin
move(p, down[ball], east[p]); //приближается к мячу
if p in hometeam then h := wide / 4
else h := -(wide / 4);
h := h * rand + east[ball];
v := rand * 2 - 1 + down[ball];
move(ball, v, h); //бьет по мячу
move(p, v, h); //и бежит за ним
withball := p; //и мяч по прежнему и игрока
end;

procedure shot(p: players); //удар по воротам
var
g: players;
edge: byte;
vertical: real;
begin
move(p, down[ball], east[ball]);
if p in hometeam then
begin
g := 6; //вратарь соперников
edge := wide + 1;
end
else
begin
g := 1;edge := 0;
end;
move(g, down[g], (east[g] + edge) / 2); //готовится отразить удар
vertical := (deep / 2) + (rand * 4 - 2); //конечная точка полета мяча
move(ball, vertical, edge * 1); //удар по мячу
if (abs(edge - east[ball]) > 1.5) or (distance(down[g], east[g], down[ball], east[ball]) < (rand * 4)) then
begin //ворота спасены
withball := g;
if rand < 0.5 then pass(g)
else move(ball, deep / 2, 1 + wide - edge); //вратарь отдает мяч
end
else
begin //мяч в воротах
withball := 0; goal := true; //изменение счета
if (half = 1) = (p in hometeam) then homegoal := homegoal + 1
else
awaygoal := awaygoal + 1;
move(ball, deep / 2, edge * 1);
move(p, down[p], east[p]);
end;
end;

procedure advance(p: players); //перемещение без мяча
var
d, vertical: real;
begin
d := wide / 4;
if p in awayteam then d := -d;
vertical := rand * deep + 1;
move(p, vertical, east[p] + d);
end;

procedure retreat(p: players); //защита ворот защитниками
var
dh, vertical: real;
begin
if p in hometeam then dh := (1 - east[p]) * 0.25
else dh := (wide - east[p]) * 0.25;
vertical := (rand * deep + 1 + down[p]) * 0.5;
move(p, vertical, east[p] + dh);
end;

procedure tackless(p: players); //попытка забрать мяч у противника
var
d1, d2: real;
begin
move(p, down[ball], east[ball]);
d1 := distance(down[ball], east[ball], down[p], east[p]);
d2 := distance(down[ball], east[ball], down[withball], east[withball]);
if d1 < d2 then
begin //попытка удалась
withball := p;
if rand > 0.5 then dribble(p);
end
else dribble(withball); //не удалось
end;

procedure attacks(p: players); //атака на ворота противника
begin
if p = withball then //владеет мячом
if neargoal(p) then
if nearball(p) then
shot(p) //пытается забить
else
move(p, down[ball], east[ball])
else
if blocked(p) or (p in [1, 6]) then
pass(p) //вратарь пасует
else
dribble(p)
else
advance(p); //не владеет мячом
end;

procedure defends(p: players); //участие в обороне
begin
if nearball(p) or (rand > 0.75) then
tackless(p)
else
retreat(p); //прикрытие ворот
end;

procedure instruct; //выдача информации
begin
clrs;home;
writeln('welcome to the 5-a-side football game');
writeln('Sorry-no instructions yet!');
wait(400);
end;

begin //тело программы
init;
instruct; //Выдача инструкций
for half := 1 to 2 do
begin
tick := 0; //запуск времени
p := 0;
kickoff; //начало игры
repeat
for pn := 0 to 10 do
plot(down[pn], east[pn], name[pn]); //вывод игроков и мяч на экран
pick(p); //выбор игрока
if (p in hometeam) = (withball in hometeam) then //мяч у противников
attacks(p)
else
defends(p);
if goal then kickoff; //изменение счета
tick := tick + 1;
wait(2);
until tick > halftime; //конец первой половины
swapover; //смена ворот
end;
end.
```

Гранат Фруктов около 1 месяца назадСпасибо 1
1 чел.