ЖИВОТНЫХ
1. ВВЕДЕНИЕ.
Ради интереса было дано задание написать программу типа "Жизнь", но с некоторыми изменениями в начальных условиях.
Условия были таковы, что в эмуляции должны участвовать две популяции: хищники и травоядные, которые взаимодействовали бы друг с другом путем поедания травоядных хищниками.
В процессе разработки программы были введены дополнительные параметры:
- Возраст животных
- Минимальный и максимальный репродуктивный возраст животных
- Количество пищи нужный животным для поддержания жизни
- Количество травы
- Процент восстановления травы
- Вероятность природных катаклизмов влияющих напопуляции животных
2. ОСНОВНАЯ ЧАСТЬ.
2.1 Методика взаимодействия популяций.
Методика взаимодействий хищника и травоядного заключается в том,что и хищники, и травоядные представлены в виде точек, которые передвигаются по экрану с шагом в один пиксель. При этом заданноусловие, если в радиусе один пиксель от точки принадлежащей хищникупоявляется точка принадлежащая травоядному, то считается, что хищниксъел травоядного.
Способ передвижения точек на экране был организован по алгоритму случайного блуждания, т.е. передвижение по осям Х и Y с шагом в один пиксель выбирается случайным образом.
Умершие своей жизнью травоядные считаются, как съевшиеся хищниками.
При недоедании обеими популяциями, особи умирают в процессе уменьшения возраста, т.е. чем больше возраст животного, тем больше вероятность погибнуть от голода. Из-за больших промежуточных расчетов учет по недоеданию был выбран так, что хищники учитываются один раз в год, а травоядные двенадцать раз в год.
2.2 Описание программы.
Данная программа написана с использованием объектно-ориентированного языка Borland Pascal 7.1 и построена на обработке массивов типа tosob описанного в объектном модуле fauna1. Этот тип имеет следующие параметры:
x - расположение по координате Х экрана
y - расположение по координате Y экрана
age - возраст точки
col - цвет вывода на экран
Программа обеспечивает следующие операции:
- Задание параметров популяции травоядных
- Задание параметров популяции хищников
- Задание параметров окружающей среды
- Просмотр взаимодействия животных в графическом режиме
- Индикация результатов по выходу из режима просмотра взаимодействия животных
- Выход из программы
При помощи зарезервированного слова "uses" к программе подключается стандартные библиотечные модули TPCRT, GRAPH, DOS и библиотечные модули написанные программистом-разработчиком MYCRT и FAUNA1.
В разделе описания констант и переменных были объявленны следующие переменные:
- gd,gm типа integer для инициализации графики
- q,x,y,x1,y1,t,i,j,k,at,at1,ct1,ctp типа integer дляиспользования их в теле циклов
- g,m типа integer для задания начального количества животных
- v,w типа integer для задания максимального возраста животных
- ct,ch типа shortint для задания цвета отображаемых точек
- tmin,tmax,hmin,hmax,tp,hp типа integer для задания факторов влияющих на репродуктивность животных
- tt типа integer для учета умерших и съеденных травоядных
- kata типа integer для задания вероятности природных катаклизмов
- ht типа integer для задания количества травоядных нужных хищнику для пищи
- ttt типа real для задания количества травы нужных травоядному для пищи
- tr типа real для задания процента восстановления количества травы
- tree,tree1 типа longint для задания и модификации количества травы
- z типа longint для счетчика времени
- key типа boolean для отслеживания нажатия клавиш
- s,ss типа string размером в семнадцать символов для вывода на экран в графическом режиме
- pal типа FillPatternType стандартная переменная библиотеки
GRAPH для хранения типа и цвета заливки графических фигур объектов
- tg массив объемом 4400 точек типа tosob для хранения травоядных
- hr массив объемом 1350 точек типа tosob для хранения хищников
2.3 ОПИСАНИЕ БИБЛИОТЕКИ FAUNA1
В данной библиотеке описано два типа данных Tposition и Tosob. Тип Tposition имеет два параметра:
x - расположение по координате Х экрана
y - расположение по координате Y экрана
Задействованы функции:
getx - получение координаты Х
gety - получение координаты Y
А также процедура инициализации объекта init
Тип Tosob имеет четыре параметра:
x - расположение по координате Х экрана
y - расположение по координате Y экрана
age - возраст точки
col - цвет вывода на экран
Задействованы функции:
daizwet - получение цвета точки
daiage - получение параметра age
vidnoli - получение факта отображения на экране процедуры:
blind - гашение точки
show - отображение точки
init - создание объекта Tosob
done - уничтожение объекта Tosob
2.4 ОПИСАНИЕ БИБЛИОТЕКИ MYCRT
В данную библиотеку включены функции и процедуры предназначенные для работы в текстовом режиме.
Процедуры:
fon - задание цвета фона экрана
txt - задание цвета выводимых символов
ramka - вывод прямоугольника символами 186,187,188,200,201,205
colorwind - вывод окна с рамкой
Функции:
colword - преобразование чисел от одного до пятнадцати в
строку с наименованием цвета
mes - преобразование чисел от нуля до триста шестидесяти пяти в строку с названием месяца
2.4 ОПИСАНИЕ ОСНОВНОГО ТЕЛА ПРОГРАММЫ
В основном модуле программы включены процедуры:
ini - вывод на экран массивов hr и tr со стартовыми параметрами
tnew - движение точки принадлежащей массиву tr с проверкой возраста
hnew - движение точки принадлежащей массиву hr с проверкой возраста
trod - создание новых точек массива tr
hrod - создание новых точек массива hr
dead - процесс поглощения точки массива tr точкой массива hr
havka - процесс уничтожения точек массива tr в зависимости от значения переменной tt
tmor - процесс уничтожения случайного количества точек массива tr
hmor - процесс уничтожения случайного количества точек массива hr
zasux - подсчет переменной tree
quit - выход из программы
herb - организация ввода стартовых значений переменных для массива tr
beast - организация ввода стартовых значений переменных для массива hr
env - организация ввода значений переменных для задания переменных tree, tr, kata, q
info - организация информационного окна
gmenu - прорисовка основного меню
omenu - прорисовка меню Option
start - запуск графического режима и запуск основного цикла
komenu - организация меню Option
gkmenu - организация основного меню
3. ЗАКЛЮЧЕНИЕ
Данная программа представляет достаточно грубую модель жизнедеятельности и взаимодействия живых организмов. Однако, даже такое моделирование позволяет проследить основные моменты цикла жизни популяции. При возможном добавлении некоторых дополнительных факторов, моделирование может более приблизиться к реальной ситуации. Такими факторами могут являться:
- Сезонные изменения климата
- “Технология” охоты
- Окружающая флора и фауна
- Влияние жизнедеятельности человека
- Взаимодействие особей внутри популяции
Данная программа может служить в качестве учебного пособия по программированию на языке Pascal.
Приложение 1.
Основная программА
program fauna;
uses mycrt,dos,graph,fauna1,tpcrt;
var
q,x,y,x1,y1,gd,gm,t,i,j,k,AT,at1,ct1,ctp:integer;{общие}
g,v,m,w:integer;{}
ct,ch:shortint;{цвет}
tmin,tmax,hmin,hmax,tp,hp:integer;{детородность}
tt:integer;{трупы и съеденые травоядные за 1 год}
kata,ht:integer;
ttt,tr:real;
z,tree,TREE1:longint;
key:boolean;
s,ss:string[17];
tg:array[1..4400] of tosob; {green-травоядных}
hr:array[1..1350] of tosob; {red-хищников}
pal:FillPatternType;
{***********************************************************}
procedure ini;
begin
for i:=1 to g do
begin
at:=RANDOM(v)+1;
tg[i].init((random(630)+5),(random(462)+18),at,ct);
tg[i].show;
end;
for i:=1 to m do
begin
at:=random(w)+1;
HR[i].init((random(630)+5),(random(462)+18),at,ch);
hr[i].show;
end;
end;
{***********************************************************}
procedure tnew;
begin
I:=0;
REPEAT
I:=I+1;
begin
x:=tg[i].getx;
y:=tg[i].gety;
AT:=TG[I].DAIAGE;
CTP:=TG[I].DAIZWET;
if (z mod 365)=0 then
BEGIN
at:=at+1; {Happy New Year!}
TG[I].INIT(X,Y,AT,CTP);
END;
if at>v then {Old ?}
begin
tg[i].done;
tg[i].init(0,0,0,0);
tt:=tt+1;{умершее животное}
for j:=i+1 to g do
begin
x1:=tg[j].getx;
y1:=tg[j].gety;
at1:=tg[j].daiage;
ct1:=tg[j].daizwet;
tg[j].done;
tg[j-1].init(x1,y1,at1,ct1);
tg[j-1].show;
end;
TG[G].INIT(0,0,0,0);
G:=G-1;
I:=I-1;
CONTINUE;
end;
x:=tg[i].getx;
y:=tg[i].gety;
x:=x+(random(3)-1);
y:=y+(random(3)-1);
if x<5 then x:=6;if x>635 then x:=634;if y<17 then y:=18;
if y>480 then y:=479;
AT:=TG[I].DAIAGE;
CTP:=TG[I].DAIZWET;
tg[i].done;
IF CT<>0 THEN
BEGIN
tg[i].init(x,y,at,CTP);
tg[i].show;
END;
END;
UNTIL I>=G;
end;
{***********************************************************}
procedure trod;
begin
if (z mod 365)=0 then {Happy New Year!}
begin
t:=0;
for i:=1 to g do
begin
at:=tg[i].daiage;
if (tmin<=at) AND (AT<=tmax) then t:=t+1;
end;
t:=(t div 2);
x:=0;
if t>0 then
begin
FOR I:=1 TO T DO
begin
J:=RANDOM(TP);
x:=x+j;
end;
for y:=g+1 to g+1+x do
begin
tg[y].init((random(630)+5),(random(462)+18),0,ct);
tg[y].show;
if y>4100 then break;
end;
g:=g+1+x;
if g>4000 then
begin
key:=true;
end;
end
else
begin
end;
end;
end;
{***********************************************************}
procedure hnew;
begin
I:=0;
REPEAT
I:=I+1;
begin
x:=hr[i].getx;
y:=hr[i].gety;
At:=hr[I].DAIAGE;
CTp:=hr[I].DAIZWET;
if (z mod 365)=0 then
BEGIN
at:=at+1; {Happy New Year!}
hr[I].INIT(X,Y,At,CTp);
END;
if at>w then {Old ?}
begin
hr[i].done;
hr[i].init(0,0,0,0);
for j:=i+1 to m do
begin
x1:=hr[j].getx;
y1:=hr[j].gety;
at1:=hr[j].daiage;
ct1:=hr[j].daizwet;
hr[j].done;
hr[j-1].init(x1,y1,at1,ct1);
hr[j-1].show;
end;
hr[m].INIT(0,0,0,0);
m:=m-1;
I:=I-1;
CONTINUE;
end;
x:=hr[i].getx;
y:=hr[i].gety;
x:=x+(random(3)-1);
y:=y+(random(3)-1);
if x<5 then x:=6;if x>635 then x:=634;if y<17 then y:=18;
if y>480 then y:=479;
AT:=hr[I].DAIAGE;
CTp:=hr[I].DAIZWET;
hr[i].done;
IF CTp<>0 THEN
BEGIN
hr[i].init(x,y,at,CTp);
hr[i].show;
END;
END;
UNTIL I>=m;
end;
{**********************************************************}
procedure hrod;
begin
if (z mod 365)=0 then {Happy New Year!}
begin
t:=0;
for i:=1 to m do
begin
at:=hr[i].daiage;
if (hmin<=at) AND (AT<=hmax) then t:=t+1;
end;
t:=(t div 2);
if t>0 then
begin
x:=0;
FOR I:=1 TO T DO
begin
J:=RANDOM(hP);
x:=x+j;
end;
for y:=m+1 to m+1+x do
begin
hr[y].init((random(630)+5),(random(462)+18),0,ch);
hr[y].show;
end;
m:=m+1+x;
if (m>1000) or (m<=0) then