Смекни!
smekni.com

Программа эмуляции развития (стр. 1 из 3)

ЖИВОТНЫХ

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