Модели сложных систем

 

Министерство Образования и наук Украины

Севастопольский национальный технический университет

Кафедра ИС










ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к курсовому проекту

на тему: «Модели сложных систем»

по курсу «Объектно-ориентированное программирование»













Севастополь 2007

Введение


Как известно, объектный подход - один из современных методов реализации программных систем (ПС). Наиболее показательна эффективность применения объектного подхода для больших ПС, со сложным характером взаимодействия значительного количества элементов.

Исследованиям этих вопросов и посвящена настоящая курсовая работа.

Тематика курсовой работы продиктована популярностью динамических моделей реального времени. Так как рассматриваемые модели учитывают влияние многих факторов на многие элементы системы, то разработка таких систем требует от проектировщика продуманных шагов и взвешенных решений.

Таким образом, цель настоящей курсовой работы - детальное проектирование и программная реализация стратегической системы, которая в соответствии с заданным вариантом реализует процессы создания и взаимодействия группы объектов.

Однако следует заметить, что преимущества объектно-ориентированного программирования в полной мере проявляются лишь при разработке достаточно сложных программ.

Объектно-ориентированный подход помогает справиться с такими сложными проблемами, как

уменьшение сложности программного обеспечения;

повышение надежности программного обеспечения;

обеспечение возможности модификации отдельных компонентов программного обеспечения без изменения остальных его компонентов;

обеспечение возможности повторного использования отдельных компонентов программного обеспечения.

Систематическое применение объектно-ориентированного подхода позволяет разрабатывать хорошо структурированные, надежные в эксплуатации, достаточно просто модифицируемые программные системы. Этим объясняется интерес программистов к объектно-ориентированному подходу и объектно-ориентированным языкам программирования. Объектно-ориентированный подход является одним из наиболее интенсивно развивающихся направлений теоретического и прикладного программирования.



1. Постановка задачи


Тематика курсовой работы продиктована популярностью динамических моделей реального времени, к которым принадлежат так называемые стратегические игры, где объекты системы формируют тактику действий на основании анализа текущей ситуации на игровом поле. Так как рассматриваемые модели учитывают влияние различных факторов на многие элементы системы, то разработка таких систем требует от проектировщика продуманных шагов и взвешенных решений.

Таким образом, цель настоящей курсовой работы - проектирование и программная реализация стратегическо-поведенческой системы, которая в соответствии с заданным вариантом реализует процессы создания, взаимодействия и уничтожения групп объектов.

По варианту задания на базе объектного подхода необходимо спроектировать и разработать модель стратегической игры по заданному плану. Постановка задачи строится из предположения, что в океане существует три формы жизни: планктон и косяки, питающиеся им, а хищники, питающиеся косяками.

Океан вырабатывает растительную пищу (планктон) следующим образом: к количеству планктона на предыдущем шаге (х) добавляется некоторая часть (например, 0.5х), если итоговая масса не превышает некоторого предела (Y), т.к. океан не может вырастить больше определенного количества на единицу поверхности. Потребление планктона происходит следующим образом: косяк потребляет массу планктона в процентном содержании от содержимого клетки. Если косяк определённое количество ходов не голодал (устанавливается пользователем), то он делится, при этом теряет некоторое количество веса в процентном содержании от начального. Косяк может породить себе подобного только в соседнюю клетку, если последняя не занята другим косяком. Косяк погибает когда продолжительно голодает, либо когда его съедает хищник. Хищник в свою очередь поедает треть косяка, в случае если они находятся в одной клетке. Если хищник определённое количество ходов не голодал (устанавливается пользователем), то он делится, при этом теряет некоторое количество веса в процентном содержании от начального. Хищник может породить себе подобного только в соседнюю клетку, если последняя не занята другим хищником. Хищник погибает когда продолжительно голодает, либо если проходит определенное количество шагов (от старости).

Ограничения: количество объектов ограничено размером игрового поля; видовое разнообразие ограничено тремя классами планктона, косяка и хищника, но даже на базе этих двух классов можно организовать несколько типов животных.

Системными требованиями для данной кусосовой работы является наличее операционной системы Windows 9x/Me/2000/XP/Vista, мышки и видеоадаптера.


. Объектно-ориентированный анализ (ООА)


.1 Описание проектного решения


В этом разделе приведены этапы объектно-ориентированного анализа и проектирования, подразумевающего ступенчатый и итеративный процесс разработки системы с постепенной модификацией различных, но, тем не менее, согласованных между собой логических и физических представлений о системе в целом.

Анализ следует начать с разбиения предметной области на объекты.

Из варианта задания, очевидно, что в луже существует два типа существ:

планктон - самый примитивный объект, жизненная деятельность которого ограничивается постоянным размножением;

косяк - объект, который может передвигаться по игровому полю, находя свободные пути для перемещения и так же как предыдущий класс, выполняет функцию воспроизведения и питается планктоном ;

хищник - более сложный объект, который кроме передвижения по игровому полю и функции воспроизведения, охотится на косяки ;

океан - жизненная система, которая содержит все особи, представленных выше классов существ

На рисунке 2.1 представлены информационные модели взаимодействия объектов друг с другом и лужей.

















Рисунок 2.1.1


Связи R1 R2 R3 - типа многие к одному, безусловны, т.к. с обеих сторон участвует каждый экземпляр. Связь R1, типа «Содержит - Содержится» формализована, посредством двумерного массива Mas, в котором по координатам можно обратиться к каждой ячейке океана. Но эти ячейки составляют океан, поэтому изменения происходят со всем океаном в целом. Связи R2 и R3 типа «Содержит - Содержится», формализована со стороны океана.


Рисунок 2.1.2 - Диаграмма информационной структуры


Тип связи R4 и R5 «Питается - является пищей».

Следующим этапом проектирования, будет построение диаграмм переходов состояний (ДПС) для всех объектов системы, которые выражают описание жизненного цикла каждого объекта.

Действие системы начинается с создания океана, в котором затем происходит размножение планктона.

Если в среду добавить косяки, то они начинают поедать планктон и размножаться, но процесс проходит не контролируемо и возможно вымирание косяков за счет исчезновения планктона либо за счёт поедания косяков хищниками. Если в среду добавить хищников, то они начинают поедать косяки и размножаться.

Процесс также проходит не контролируемо и возможно вымирание хищников за счет исчезновения косяков либо от старости.

Планктон рождается и погибает вместе с океаном, в процессе своей жизнедеятельности он только репродуцируется, поэтому нет необходимости описывать его жизненный цикл отдельно.


.2 Описание связей между объектами


Связь - это набор отношений, которые систематически возникают при взаимодействии объектов.

Поскольку в качестве способа представления объекта был выбран текстовый подход, то при изображении связей в качестве звеньев отображаются объекты без указания их атрибутов.

Связи между объектами изображены на рисунке 1.


Рисунок 2.2 - Связи между объектами


Объект TOkean порождает еду (объект класса TPlankton), которой питаются объекты класса TKosiak, которым в свою очередь питаются объекты TXishnik. Объект класса TOkean порождает объекты классов TPlankton, TKosiak и TXishnik.


2.3 Построение модели состояний объекта


Модель состояния объекта или системы состоит из диаграммы переходов состояний (ДПС), а также из описания каждого звена на этой ДПС.

Модели состояния объекта выражают описание жизненного цикла объекта, т.е. является формальным описанием поведения объекта.


Рисунок 2.3.1 - ДПС для косяка и хищника


.4 Описание классов


В качестве отправной точки для создания модели океана служат классы TOkean и TKletka, первый из которых описывает все характеристики океана как отдельного объекта. Здесь основным полем класса является двумерный массив ссылок на объекты классов TPlankton, TKosiak и TXishnik, которые могут быть пустыми. Второй же является родительским для трёх основных видов жизни, присутствующей в модели, как то пищи и собственно инфузорий, описанных классами TPlankton, TKosiak и TXishnik соответственно.

Интерфейс классов лужи и ее составляющих приведен в модуле oop.pas.

Задаваемые константы


MaxLife:=100;

MaxGolK:=10;{максимально возможное время

MaxGolX:=10; голодания косяка и хищника}

HavkaGrow=1;{выростает за один раз}

EST=8; {съедает за один раз}


Среди полей класса TOkean можно выделить следующие:


x,y: integer; :array[1..MAXSIZEX,1..MAXSIZEY] of TLink; ,где=record

Xish:TPXishnik;

Creature:TPKosiak;

Eda:TPPlankton;

end;=^TXishnik;=^TKosiak;

TPPlankton=^TPlankton;


т.е. есть массив, хранящий в себе ссылки на принадлежащие ему объекты, и соответственно имеющий к ним доступ посредством методов своего класса, а те в свою очередь обращаются к методам объектов типа TPlankton, TKosiak и TXishnik.

Методы класса TOkean

constructor Init(Canv: TCanvas) - создает AmountAtTheBeginingR косяков, AmountAtTheBeginingХ хищников, рисует сетку с помощью процедуры DrawGrid;

procedure DrawGrid - рисует сетку MAXSIZEX на MAXSIZEY;KillKosiak(tx,ty: integer) - уничтожает косяк;KillXishnik(tx,ty: integer) - уничтожает хищника;Draw(i,j:integer) - прорисовывает каждую клетку массива Mas; Step - здесь рассматривается каждая инфузория, анализируются ее поля и если необходимо лужа перемещает инфузорию по полю.

Procedure DivisionKosiak (tx,ty: integer) - текущий косяк делится, порождая новый косяк;

Procedure DivisionXishnik (tx,ty: integer) - текущий хищник делится, порождая нового хищника;

Поля класса TPlankton

amount: integer - количество еды в текущей ячейке;

Методы класса TPlankton

constructor Init(initx, inity, havka: integer; Canva:TCanvas) - конструктор, создает экземпляр класса;

procedure Draw;virtual - прорисовка по текущим координатам;

procedure SetKol(h: integer) - устанавливает значение Amount

function GetKol:integer - возвращает значение Amount

Поля класса TKosiak

Amount: integer - насыщенность;

Life: integer - время жизни;

Syt: integer - коеффициент сытости;

Gol: integer - коеффициент голода;

VecWas: integer; - откуда пришла

IsHodila: boolean; - флаг хода;

Function Raspozn(k:integer):dxdy - определении направления следующего хода

Методы класса TKosiak

constructor Init(x1, y1, vmove:integer;v: Vertype; Canva:TCanvas); - конструктор, создает экземпляр класса;

function GetHod: boolean - возвращает текущее значение флага хода;

Procedure NilHod - обнулить флаг хода;

procedure Draw;virtual - прорисовка инфузории по текущим координатам;

Методы класса TXishnik

constructor Init(x1, y1, vmove:integer;v: Vertype; Canva:TCanvas); - конструктор, создает экземпляр класса;

function GetHod: boolean - возвращает текущее значение флага хода;

Procedure NilHod - обнулить флаг хода;

procedure Draw;virtual - прорисовка инфузории по текущим координатам;

Function Raspozn(k:integer):dxdy - определении направления следующего хода


проектирование объектный модель программа

3. Программная реализация


.1 Среда разработки


Программа была реализована в среде разработки Borland Delphi 7 c использованием стандартных компонент.

Delphi был выбран для реализации программы по следующим причинам:

Высокопроизводительный компилятор в машинный код.

Объектно-ориентированная модель компонент.

Визуальное (а следовательно и скоростное) построение приложений.


.2 Описание программы


Дизайн и интерфейс программы интуитивно понятен. В программе предусмотрен удобный способ выбора входных параметров. К тому же возможность менять параметры в режиме реального времени только даёт преимущество в критических ситуациях.

В программе предусмотрены автоматический режим с установками по умолчанию, с пользовательскими установками, пошаговый режим для более глубокого исследования работы.



4. Руководство пользователя


Прежде чем начать описание данной системы моделирования, необходимо определить его назначение. Настоящая программа представляет собой жизнедеятельность океанских жителей. Их рождение, размножение, борьбу за жизнь.

Главное окно программы



















Рисунок 4.2 - Основное окно программы


Как мы видим, большую часть рабочего пространства занимает непосредственно область моделирования. Напрямую повлиять на неё не удастся. Для этого используем панель управления и панель предустановок.


панель управления панель предустановок


Первая кнопка на панели управления выполняет функции приостанова/рестарта моделирования.

Вторая - приостанавливает/продолжает моделирование.

Третья - осуществить один шаг (инициализация пошагового режима).

Под законом распределения понимается то, каким образом инициализированные косяки и хищники будут размещены в области моделирования. Предлагается в выпадающем меню выбрать между рандомным, гауссовым и обратным гауссовым.

В следующих двух полях задаётся количество моделируемых клеток по горизонтали и вертикали.

Далее задаём изначальное количество косяков и хищников, то есть сколько их будет проинициализировано при запуске.

Последние два параметра - динамически, т.е. могут изменяться пользователем непосредственно при работе программы. Это очень удобно, когда равновесие в системе смещается в одну из сторон (значительное преобладание хищников над косяками или наоборот). В данном случае можно изменить равновесие в системе в любую сторону.


Заключение


Данная программа разработана в соответствии с постановкой задачи на курсовое проектирование по теме "Океан" по дисциплине "Объектно-ориентированное программирование".

При написании программы были использованы методические указания по курсовому проектированию по дисциплине "Объектно-ориентированное программирование". Интерфейс программы удобен для использования. Тестирование программы подтвердило, что программа корректно выполняет обработку данных и демонстрацию взаимодействия объектов различных классов.

При построении программы были использованы основные идеи объектного подхода. Программа, реализующая данную объектную модель, написана в соответствии с основными принципами объектно-ориентированного программирования. В процессе написания программы были закреплены и усовершенствованы навыков работы в среде Delphi.

Написанная программа обеспечивает возможность моделирования жизненного процесса океана. В разработанной объектной модели были отражены те понятия и объекты реального мира, которые важны для работы системы.

Всё это свидетельствует о работоспособности программы и позволяет сделать вывод о пригодности программы к применению для анализа и моделирования различных биологических, социальных систем взаимодействия нескольких поведенческих групп, которые на примере данной программы можно было бы теоретически представить в виде нескольких форм жизни.



Библиографический список


1. Буч Г. Объектно-ориентированное проектирование с примерами применения: Пер с англ.-М.: Конкорд,1992.-519 с.

. Доронина Ю.В. Конспект курса лекций по дисциплине "Объектно-ориентированное программирование"

. Р. Вайнер, Л. Пинсон. Delphi 5 изнутри. - Киев: НПИФ "ДиаСофт", 2001.

. И. Пол. Объектно-ориентированное программирование с использованием Delphi. - Киев: НПИФ "ДиаСофт", 1999.

. Г. Шилдт. Самоучитель Delphi 5. BHV-Санкт-Петербург. 2000

. П. Дарахвелидзе, Е. Марков Delphi - среда визуального программирования. - BHV-Санкт-Петербург 1996.



Приложения


ПРИЛОЖЕНИЕ А


Текст программы


Project15.dpr

program Project15;

Forms,

Unit2 in 'Unit2.pas' {Form1},

okean in 'okean.pas';

{$R *.res}

Application.Initialize;

Application.CreateForm(TForm1, Form1);

Application.Run;..pasUnit2;

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, StdCtrls, Buttons, ImgList, okean, Spin;

TForm1 = class(TForm)

Image1: TImage;

Image2: TImage;

Image3: TImage;

ImageList2: TImageList;

Field: TImage;

Timer1: TTimer;

Label5: TLabel;

Label1: TLabel;

Label2: TLabel;

Label8: TLabel;

ComboBox1: TComboBox;

Label3: TLabel;

Label9: TLabel;

SpinEdit4: TSpinEdit;

SpinEdit8: TSpinEdit;

Label4: TLabel;

Label7: TLabel;

SpinEdit1: TSpinEdit;

SpinEdit2: TSpinEdit;

SpinEdit3: TSpinEdit;

SpinEdit5: TSpinEdit;

procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure FormCreate(Sender: TObject);

procedure Image2MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Image2MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Image3MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure Timer1Timer(Sender: TObject);

procedure Image1Click(Sender: TObject);

procedure Image2Click(Sender: TObject);

procedure FieldMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure FieldMouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

procedure SpinEdit1Change(Sender: TObject);

procedure SpinEdit2Change(Sender: TObject);

procedure SpinEdit3Change(Sender: TObject);

procedure SpinEdit5Change(Sender: TObject);


private

{ Private declarations }

public

{ Public declarations }

end;

Form1: TForm1;

{$R *.dfm}

p0k0x0: TBitmap;

p0k0x3: TBitmap;

p0k0x6: TBitmap;

p0k0x8: TBitmap;

p0k3x0: TBitmap;

p0k3x3: TBitmap;

p0k3x6: TBitmap;

p0k3x8: TBitmap;

p0k6x0: TBitmap;

p0k6x3: TBitmap;

p0k6x6: TBitmap;

p0k6x8: TBitmap;

p0k8x0: TBitmap;

p0k8x3: TBitmap;

p0k8x6: TBitmap;

p0k8x8: TBitmap;

p3k0x0: TBitmap;

p3k0x3: TBitmap;

p3k0x6: TBitmap;

p3k0x8: TBitmap;

p3k3x0: TBitmap;

p3k3x3: TBitmap;

p3k3x6: TBitmap;

p3k3x8: TBitmap;

p3k6x0: TBitmap;

p3k6x3: TBitmap;

p3k6x6: TBitmap;

p3k6x8: TBitmap;

p3k8x0: TBitmap;

p3k8x3: TBitmap;

p3k8x6: TBitmap;

p3k8x8: TBitmap;

p6k0x0: TBitmap;

p6k0x3: TBitmap;

p6k0x6: TBitmap;

p6k0x8: TBitmap;

p6k3x0: TBitmap;

p6k3x3: TBitmap;

p6k3x6: TBitmap;

p6k3x8: TBitmap;

p6k6x0: TBitmap;

p6k6x3: TBitmap;

p6k6x6: TBitmap;

p6k6x8: TBitmap;

p6k8x0: TBitmap;

p6k8x3: TBitmap;

p6k8x6: TBitmap;

p6k8x8: TBitmap;

p8k0x0: TBitmap;

p8k0x3: TBitmap;

p8k0x6: TBitmap;

p8k0x8: TBitmap;

p8k3x0: TBitmap;

p8k3x3: TBitmap;

p8k3x6: TBitmap;

p8k3x8: TBitmap;

p8k6x0: TBitmap;

p8k6x3: TBitmap;

p8k6x6: TBitmap;

p8k6x8: TBitmap;

p8k8x0: TBitmap;

p8k8x3: TBitmap;

p8k8x6: TBitmap;

p8k8x8: TBitmap;

Play, Play_d, Nextb, Next_d, Pause, Pause_d, start, stop: TBitmap;

Playing, go: boolean;TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

if playing then

begin

Image1.Canvas.Draw(0,0,Pause_d);

playing:= false;

end else

begin

Image1.Canvas.Draw(0,0,Play_d);

playing:= true;

end;;TForm1.Image3MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

if go then

begin

Image3.Canvas.Draw(0,0,start);

go:= false;

Timer1.Enabled := not Timer1.Enabled;

end else

begin

Image3.Canvas.Draw(0,0,stop);

go:= true;

FormCreate(Sender);

Timer1.Enabled := not Timer1.Enabled;

end;;

{+}TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

if playing then

Image1.Canvas.Draw(0,0,Pause) else

Image1.Canvas.Draw(0,0,Play);

image2.Visible:=not image2.Visible;;TForm1.FormCreate(Sender: TObject);

CellSize:=52;

MaxLife:=100;

PoraDelK:=SpinEdit2.Value;

PoraDelX:=SpinEdit5.Value;

MaxGolK:=10;

MaxGolX:=10;

EST:=8;

AmountAtTheBeginingK:=SpinEdit1.Value;

AmountAtTheBeginingX := SpinEdit3.Value;

MAXSIZEX := SpinEdit4.Value;

MAXSIZEY := SpinEdit8.Value;

rasp:=ComboBox1.Text;

randomize;

Field.Left:=8;

Field.Top:=56;

Field.Width:=MAXSIZEX*CELLSIZE+1;

Field.Height:=MAXSIZEY*CELLSIZE+1;

Form1.Width:=MAXSIZEX*CELLSIZE+23;

Form1.Height:=MAXSIZEY*CELLSIZE+96;

Form1.Color:=rgb(236,233,217);

counter:=0;

go:=true;

playing:=true;

Play := TBitmap.Create;

ImageList2.GetBitmap(0,Play);

Play_d := TBitmap.Create;

ImageList2.GetBitmap(1,Play_d);

Pause := TBitmap.Create;

ImageList2.GetBitmap(2,Pause);

Pause_d := TBitmap.Create;

ImageList2.GetBitmap(3,Pause_d);

Nextb := TBitmap.Create;

ImageList2.GetBitmap(4,Nextb);

Next_d := TBitmap.Create;

ImageList2.GetBitmap(5,Next_d);

start := TBitmap.Create;

ImageList2.GetBitmap(6,start);

stop := TBitmap.Create;

ImageList2.GetBitmap(7,stop);

Image1.Canvas.Draw(0,0,Pause);

Image2.Canvas.Draw(0,0,Nextb);

Image3.Canvas.Draw(0,0,stop);

Syst := TOkean.Init(Field.Canvas);;TForm1.Image2MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

Image2.Canvas.Draw(0,0,Next_d);;TForm1.Image2MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

Image2.Canvas.Draw(0,0,Nextb);;TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

Play.Free;

Play_d.Free;

Nextb.Free;

Next_d.Free;

Pause.Free;

Pause_d.Free;;TForm1.Timer1Timer(Sender: TObject);

Syst.Step;;TForm1.Image1Click(Sender: TObject);

Timer1.Enabled := not Timer1.Enabled;;TForm1.Image2Click(Sender: TObject);

Syst.Step;;TForm1.FieldMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

nx,ny:integer;

{nx:=(x div CELLSIZE)+1;

ny:=(y div CELLSIZE)+1;

if button=mbRight then

if syst.Mas[nx,ny].eda<>nil then

with syst.mas[nx,ny].eda^ do

begin

if Amount+20<=100 then Amount:=Amount+10 else

Amount:=0;

end;

if button=mbleft then

syst.Add(nx,ny,true); };TForm1.FieldMouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

nx,ny:integer;

{ nx:=(x div CELLSIZE)+1;

ny:=(y div CELLSIZE)+1;

with syst.mas[nx,ny] do

begin

Field.Hint := 'TInfuz'+#13#10;

if Creature <> nil then

begin

Field.Hint:=Field.Hint+'Life='+inttostr(Creature.Life)+#13#10;

Field.Hint:=Field.Hint+'Gol='+inttostr(Creature.Gol)+#13#10;

Field.Hint:=Field.Hint+'Syt='+inttostr(Creature.Syt)+#13#10;

end else Field.Hint:=Field.Hint+'nil'+#13#10;

Field.Hint :=Field.Hint+#13#10+'THavka'+#13#10;

if Eda <> nil then

Field.Hint:=Field.Hint+'Amount='+inttostr(Eda.Amount)

else Field.Hint:=Field.Hint+'nil';

end; };TForm1.SpinEdit1Change(Sender: TObject);

AmountAtTheBeginingK:=SpinEdit1.Value;;TForm1.SpinEdit3Change(Sender: TObject);

AmountAtTheBeginingX := SpinEdit3.Value;;TForm1.SpinEdit2Change(Sender: TObject);

PoraDelK:=SpinEdit2.Value;;TForm1.SpinEdit5Change(Sender: TObject);

PoraDelX:=SpinEdit5.Value;;..pasokean;

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;=record

dx,dy:integer;

end;=class

public

x,y:integer;

private

constructor Init(InitX, InitY: integer);

procedure Draw;

destructor Done;

end;=class(TKletka)

public

Amount: integer;

Canv: TCanvas;

private

constructor Init(initx, inity, kol: integer; Canva:TCanvas);

procedure Draw(a,b:integer);virtual;

procedure SetKol(h: integer);

function GetKol:integer;

destructor Done;virtual;

end;=class(TPlankton)

public

Life:integer; {время жизни}

Syt:integer; {коэфф. сытости}

Gol:integer; {коэфф. голодания}

VecWas:integer; {откуда пришёл}

IsHodila:boolean;

Canv:TCanvas;

private

constructor Init(x1, y1, vmove:integer; Canva:TCanvas);

function GetHod: boolean;

Procedure NilHod;

procedure Draw(a,b:integer);virtual;

Function Raspozn(k:integer):dxdy;

destructor Done;virtual;

end;=class(TKosiak)

constructor Init(x1, y1, vmove:integer; Canva:TCanvas);

function GetHod: boolean;

Procedure NilHod;

procedure Draw(a,b:integer);virtual;

Function Raspozn(k:integer):dxdy;

destructor Done;virtual;

end;=^TXishnik;=^TKosiak;=^TPlankton;=record

Xish:TPXishnik;

Creature:TPKosiak;

Eda:TPPlankton;

end;=class

x,y:integer;

Canva:TCanvas;

Mas:array[1..50,1..50] of TLink;

constructor Init(Canv: TCanvas);

procedure DrawGrid;

function GetCanvas:TCanvas;

Procedure KillXishnik(tx,ty: integer);

Procedure KillKosiak(tx,ty: integer);

procedure Draw(i,j:integer);

Procedure Step;DivisionXishnik(tx,ty: integer{ n:vertype});

Procedure DivisionKosiak(tx,ty: integer{ n:vertype});

end;


Syst:TOkean;

AmountAtTheBeginingK:integer;

AmountAtTheBeginingX:integer;

AmountOfKosiak:integer;

AmountOfXishnik:integer;

Counter:Integer;

MAXSIZEX:integer;

MAXSIZEY:integer;

rasp:string;

CellSize:integer;

MaxLife:integer; {время жизни}

PoraDelK:integer;

PoraDelX:integer; {когда делится}

MaxGolK:integer;

MaxGolX:integer; {когда умирает}

PlanktonGrow:integer;

EST:integer; {съедает за один раз}

p0k0x0: TBitmap;

p0k0x3: TBitmap;

p0k0x6: TBitmap;

p0k0x8: TBitmap;

p0k3x0: TBitmap;

p0k3x3: TBitmap;

p0k3x6: TBitmap;

p0k3x8: TBitmap;

p0k6x0: TBitmap;

p0k6x3: TBitmap;

p0k6x6: TBitmap;

p0k6x8: TBitmap;

p0k8x0: TBitmap;

p0k8x3: TBitmap;

p0k8x6: TBitmap;

p0k8x8: TBitmap;

p3k0x0: TBitmap;

p3k0x3: TBitmap;

p3k0x6: TBitmap;

p3k0x8: TBitmap;

p3k3x0: TBitmap;

p3k3x3: TBitmap;

p3k3x6: TBitmap;

p3k3x8: TBitmap;

p3k6x0: TBitmap;

p3k6x3: TBitmap;

p3k6x6: TBitmap;

p3k6x8: TBitmap;

p3k8x0: TBitmap;

p3k8x3: TBitmap;

p3k8x6: TBitmap;

p3k8x8: TBitmap;

p6k0x0: TBitmap;

p6k0x3: TBitmap;

p6k0x6: TBitmap;

p6k0x8: TBitmap;

p6k3x0: TBitmap;

p6k3x3: TBitmap;

p6k3x6: TBitmap;

p6k3x8: TBitmap;

p6k6x0: TBitmap;

p6k6x3: TBitmap;

p6k6x6: TBitmap;

p6k6x8: TBitmap;

p6k8x0: TBitmap;

p6k8x3: TBitmap;

p6k8x6: TBitmap;

p6k8x8: TBitmap;

p8k0x0: TBitmap;

p8k0x3: TBitmap;

p8k0x6: TBitmap;

p8k0x8: TBitmap;

p8k3x0: TBitmap;

p8k3x3: TBitmap;

p8k3x6: TBitmap;

p8k3x8: TBitmap;

p8k6x0: TBitmap;

p8k6x3: TBitmap;

p8k6x6: TBitmap;

p8k6x8: TBitmap;

p8k8x0: TBitmap;

p8k8x3: TBitmap;

p8k8x6: TBitmap;

p8k8x8: TBitmap;

kart: TBitmap;TKletka.Init(InitX, InitY: integer);

x:=initx; y:=inity;;TKletka.Draw;;TKletka.Done;;TKosiak.Init(x1, y1, vmove:integer; Canva :TCanvas);

x:=x1; y:=y1;

Canv := Canva;

VecWas:=vmove; {откуда пришёл}

Syt:=0; Gol:=5;

Life:=0;

IsHodila:=true;;TKosiak.GetHod: boolean;

Result:=IsHodila;;TKosiak.NilHod;

IsHodila:=false;;TKosiak.Raspozn(k:integer):dxdy;

case k of

1:begin Raspozn.dx:=-1;Raspozn.dy:=-1;end;

2:begin Raspozn.dx:=0;Raspozn.dy:=-1;end;

3:begin Raspozn.dx:=1;Raspozn.dy:=-1;end;

4:begin Raspozn.dx:=1;Raspozn.dy:=0;end;

5:begin Raspozn.dx:=1;Raspozn.dy:=1;end;

6:begin Raspozn.dx:=0;Raspozn.dy:=1;end;

7:begin Raspozn.dx:=-1;Raspozn.dy:=1;end;

8:begin Raspozn.dx:=-1;Raspozn.dy:=0;end;

end;;TKosiak.Draw(a,b:integer);

if gol<(MaxGolK div 2) then

case a of

0..29: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p0k6x0);

30..59: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p3k6x0);

60..79: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p6k6x0);

80..100: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p8k6x0);

end

else

case a of

0..29: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p0k3x0);

30..59: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p3k3x0);

60..79: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p6k3x0);

80..100: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p8k3x0);

end;

end;TKosiak.Done;;TXishnik.Init(x1, y1, vmove:integer;{v: Vertype} Canva :TCanvas);

x:=x1; y:=y1;

Canv := Canva;

VecWas:=vmove; {откуда пришёл}

Syt:=0; Gol:=5;

Life:=0;

IsHodila:=true;;TXishnik.GetHod: boolean;

Result:=IsHodila;;TXishnik.NilHod;

IsHodila:=false;;TXishnik.Raspozn(k:integer):dxdy;

case k of

1:begin Raspozn.dx:=-1;Raspozn.dy:=-1;end;

2:begin Raspozn.dx:=0;Raspozn.dy:=-1;end;

3:begin Raspozn.dx:=1;Raspozn.dy:=-1;end;

4:begin Raspozn.dx:=1;Raspozn.dy:=0;end;

5:begin Raspozn.dx:=1;Raspozn.dy:=1;end;

6:begin Raspozn.dx:=0;Raspozn.dy:=1;end;

7:begin Raspozn.dx:=-1;Raspozn.dy:=1;end;

8:begin Raspozn.dx:=-1;Raspozn.dy:=0;end;

end;;TXishnik.Draw(a,b:integer);

if gol<(MaxGolX div 2) then

case b of

0: case a of

0..29: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p0k0x6);

30..59: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p3k0x6);

60..79: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p6k0x6);

80..100: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p8k0x6);

end;

1: case a of

0..29: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p0k3x6);

30..59: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p3k3x6);

60..79: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p6k3x6);

80..100: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p8k3x6);

end;

2: case a of

0..29: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p0k6x6);

30..59: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p3k6x6);

60..79: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p6k6x6);

80..100: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p8k6x6);

end;

end

else

case b of

0: case a of

0..29: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p0k0x3);

30..59: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p3k0x3);

60..79: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p6k0x3);

80..100: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p8k0x3);

end;

1: case a of

0..29: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p0k3x3);

30..59: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p3k3x3);

60..79: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p6k3x3);

80..100: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p8k3x3);

end;

2: case a of

0..29: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p0k6x3);

30..59: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p3k6x3);

60..79: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p6k6x3);

80..100: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p8k6x3);

end;

end;

end;TXishnik.Done;;TPlankton.Init(initx, inity, kol: integer; Canva :TCanvas);

inherited Init(initx,inity);

Canv := Canva;

Amount:=kol;;TPlankton.SetKol(h: integer);

Amount:=h;;TPlankton.GetKol: integer;

Result:=Amount;;TPlankton.Draw;

case Amount of

0..29: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p0k0x0);

30..59: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p3k0x0);

60..79: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p6k0x0);

80..100: Canv.Draw(cellsize*(x-1)+1,cellsize*(y-1)+1,p8k0x0);

end;;TPlankton.Done;;TOkean.Init(Canv: TCanvas);i,j: integer;

x1,y1: integer;

CellSize:=52;

MaxLife:=20;

PlanktonGrow:=5;

EST:=10;

Canva := Canv;

DrawGrid;

AmountOfKosiak := 0;

AmountOfXishnik := 0;

for j:=1 to MAXSIZEY do

for i:=1 to MAXSIZEX do

begin

mas[i,j].Xish:=nil;

mas[i,j].Creature:=nil;

mas[i,j].Eda:=nil;

end;rasp='рандомное' then begin

i:=1;

while i<=AmountAtTheBeginingK do

begin

x1:=random(MAXSIZEX)+1;

y1:=random(MAXSIZEY)+1;

if Mas[x1,y1].Creature=nil then

begin

new(Mas[x1,y1].Creature);

Mas[x1,y1].Creature^:=TKosiak.Init(x1,y1,random(8)+1,{Mutate_Nach} Canv);

Mas[x1,y1].Creature^.Life:=1;

inc(AmountOfKosiak,1);

i:=i+1;

end;

end;

i:=1;

while i<=AmountAtTheBeginingX do

begin

x1:=random(MAXSIZEX)+1;

y1:=random(MAXSIZEY)+1;

if Mas[x1,y1].Xish=nil then

begin

new(Mas[x1,y1].Xish);

Mas[x1,y1].Xish^:=TXishnik.Init(x1,y1,random(8)+1,{Mutate_Nach} Canv);

Mas[x1,y1].Xish^.Life:=1;

inc(AmountOfXishnik,1);

i:=i+1;

end;

end;;rasp='гауссово' then begin

i:=1;

while i<=AmountAtTheBeginingK do

begin

x1:=(2*(random(4)+MAXSIZEX div 2-1)+random(8)+MAXSIZEX div 2-4) div 3;

y1:=(2*(random(4)+MAXSIZEY div 2-1)+random(8)+MAXSIZEY div 2-4) div 3;

if Mas[x1,y1].Creature=nil then

begin

new(Mas[x1,y1].Creature);

Mas[x1,y1].Creature^:=TKosiak.Init(x1,y1,random(8)+1,{Mutate_Nach} Canv);

Mas[x1,y1].Creature^.Life:=1;

inc(AmountOfKosiak,1);

i:=i+1;

end;

end;

i:=1;

while i<=AmountAtTheBeginingX do

begin

x1:=(2*(random(4)+MAXSIZEX div 2-1)+random(8)+MAXSIZEX div 2-4) div 3;

y1:=(2*(random(4)+MAXSIZEY div 2-1)+random(8)+MAXSIZEY div 2-4) div 3;

if Mas[x1,y1].Xish=nil then

begin

new(Mas[x1,y1].Xish);

Mas[x1,y1].Xish^:=TXishnik.Init(x1,y1,random(8)+1,{Mutate_Nach} Canv);

Mas[x1,y1].Xish^.Life:=1;

inc(AmountOfXishnik,1);

i:=i+1;

end;

end;;rasp='обр.гаусс.' then begin

i:=1;

while i<=AmountAtTheBeginingK do

begin

if random(2)=1 then begin

x1:=(2*random(3)+random(4)) div 3;

y1:=random(MAXSIZEY)+1;

end

else begin

x1:=(2*(random(2)+MAXSIZEX-1)+random(4)+MAXSIZEX-3) div 3;

y1:=random(MAXSIZEY)+1;

end;

if Mas[x1,y1].Creature=nil then

begin

new(Mas[x1,y1].Creature);

Mas[x1,y1].Creature^:=TKosiak.Init(x1,y1,random(8)+1,{Mutate_Nach} Canv);

Mas[x1,y1].Creature^.Life:=1;

inc(AmountOfKosiak,1);

i:=i+1;

end;

end;

i:=1;

while i<=AmountAtTheBeginingX do

begin

if random(2)=1 then begin

x1:=(2*random(3)+random(4)) div 3;

y1:=random(MAXSIZEY)+1;

end

else begin

x1:=(2*(random(2)+MAXSIZEX-1)+random(4)+MAXSIZEX-3) div 3;

y1:=random(MAXSIZEY)+1;

end;

if Mas[x1,y1].Xish=nil then

begin

new(Mas[x1,y1].Xish);

Mas[x1,y1].Xish^:=TXishnik.Init(x1,y1,random(8)+1,{Mutate_Nach} Canv);

Mas[x1,y1].Xish^.Life:=1;

inc(AmountOfXishnik,1);

i:=i+1;

end;

end;;;TOkean.DrawGrid;

i: integer;

with Canva do

begin

Pen.Color:=clGray;

Brush.Color:=rgb(236,233,217);

Rectangle(0,0,MAXSIZEX*CELLSIZE+1,MAXSIZEY*CELLSIZE+1);

for i:=0 to MAXSIZEY do

begin

MoveTo(0,i*CELLSIZE);

LineTo(MAXSIZEX*CELLSIZE,i*CELLSIZE);

end;

for i:=0 to MAXSIZEX do

begin

MoveTo(i*CELLSIZE,0);

LineTo(i*CELLSIZE,MAXSIZEY*CELLSIZE);

end;

end;;TOkean.GetCanvas:TCanvas;

Result := Canva;;TOkean.KillKosiak(tx,ty: integer);

mas[tx,ty].Creature^.Done;

mas[tx,ty].Creature:=nil;;TOkean.DivisionKosiak(tx,ty: integer {n:vertype});i: integer;

if mas[tx+1,ty ].Creature = nil then

begin

tx:=tx+1;

end else

if mas[tx+1,ty+1].Creature = nil then

begin

tx:=tx+1;

ty:=ty+1;

end else

if mas[tx ,ty+1].Creature = nil then

begin

ty:=ty+1;

end else

if mas[tx-1,ty+1].Creature = nil then

begin

tx:=tx-1;

ty:=ty+1;

end else

if mas[tx-1,ty ].Creature = nil then

begin

tx:=tx-1;

end else

if mas[tx-1,ty-1].Creature = nil then

begin

tx:=tx-1;

ty:=ty-1;

end else

if mas[tx ,ty-1].Creature = nil then

begin

ty:=ty-1;

end;

if (mas[tx,ty].Creature = nil) and (tx<=MAXSIZEX) and (ty<=MAXSIZEY)

and (tx>=1) and (ty>=1) then

begin

new(Mas[tx,ty].Creature);

Mas[tx,ty].Creature^:=TKosiak.Init(tx,ty,random(8)+1,{mutate(n)} Canva);

inc(AmountOfKosiak,1);

end;;TOkean.KillXishnik(tx,ty: integer);

mas[tx,ty].Xish^.Done;

mas[tx,ty].Xish:=nil;;TOkean.DivisionXishnik(tx,ty: integer {n:vertype});i: integer;

if mas[tx+1,ty ].Xish = nil then

begin

tx:=tx+1;

end else

if mas[tx+1,ty+1].Xish = nil then

begin

tx:=tx+1;

ty:=ty+1;

end else

if mas[tx ,ty+1].Xish = nil then

begin

ty:=ty+1;

end else

if mas[tx-1,ty+1].Xish = nil then

begin

tx:=tx-1;

ty:=ty+1;

end else

if mas[tx-1,ty ].Xish = nil then

begin

tx:=tx-1;

end else

if mas[tx-1,ty-1].Xish = nil then

begin

tx:=tx-1;

ty:=ty-1;

end else

if mas[tx ,ty-1].Xish = nil then

begin

ty:=ty-1;

end;

if (mas[tx,ty].Xish = nil) and (tx<=MAXSIZEX) and (ty<=MAXSIZEY)

and (tx>=1) and (ty>=1) then

begin

new(Mas[tx,ty].Xish);

Mas[tx,ty].Xish^:=TXishnik.Init(tx,ty,random(8)+1,{mutate(n)} Canva);

inc(AmountOfXishnik,1);

end;;TOkean.Step;

k:integer;

dx,dy:integer;

i,j,m,l,a,b:integer;

nx,ny:integer;

flag:boolean;

for j:=1 to MAXSIZEY do

for i:=1 to MAXSIZEX do

begin

if mas[i,j].Xish<>nil then

if not mas[i,j].Xish^.IsHodila then

with mas[i,j].Xish^ do

begin

flag:=true;

for m:=1 to 8 do begin

k:=random(7)+1;

l:=k;

nx:=i;

ny:=j;

dx:=Raspozn({Vector[VecWas,l]}l).dx;

dy:=Raspozn({Vector[VecWas,l]}l).dy;

if ((nx+dx)<=MAXSIZEX) and ((nx+dx)>=1) and

((ny+dy)<=MAXSIZEY) and ((ny+dy)>=1) then

begin

if (mas[nx+dx,ny+dy].Xish=nil) and (mas[nx+dx,ny+dy].Creature<>nil) then

begin

New(mas[nx+dx,ny+dy].Xish);

mas[nx+dx,ny+dy].Xish^:=TXishnik.Init(nx+dx,ny+dy,VecWas,{VerMas}Canva);

mas[nx+dx,ny+dy].Xish^.life:=mas[nx,ny].Xish^.life;

mas[nx+dx,ny+dy].Xish^.syt:=mas[nx,ny].Xish^.syt;

mas[nx+dx,ny+dy].Xish^.gol:=mas[nx,ny].Xish^.gol;

KillXishnik(nx,ny);

nx:=nx+dx;

ny:=ny+dy;

flag:=false;

break;

end;

end;

end;

if flag then begin

k:=random(7)+1;

l:=k;

nx:=i;

ny:=j;

dx:=Raspozn({Vector[VecWas,l]}l).dx;

dy:=Raspozn({Vector[VecWas,l]}l).dy;

if ((nx+dx)<=MAXSIZEX) and ((nx+dx)>=1) and

((ny+dy)<=MAXSIZEY) and ((ny+dy)>=1) then

begin

if mas[nx+dx,ny+dy].Xish=nil then

begin

New(mas[nx+dx,ny+dy].Xish);

mas[nx+dx,ny+dy].Xish^:=TXishnik.Init(nx+dx,ny+dy,VecWas,{VerMas}Canva);

mas[nx+dx,ny+dy].Xish^.life:=mas[nx,ny].Xish^.life;

mas[nx+dx,ny+dy].Xish^.syt:=mas[nx,ny].Xish^.syt;

mas[nx+dx,ny+dy].Xish^.gol:=mas[nx,ny].Xish^.gol;

KillXishnik(nx,ny);

nx:=nx+dx;

ny:=ny+dy;

flag:=false;

break;

end;

end;

end;

if Mas[nx,ny].Creature<>nil then

begin

inc(Mas[nx,ny].Xish^.Syt,1);

Mas[nx,ny].Creature^.Gol:=Mas[nx,ny].Creature^.Gol+3;

Mas[nx,ny].Creature^.Syt:=0;

Mas[nx,ny].Xish^.Gol:=0;

end else

begin

Mas[nx,ny].Xish^.Syt:=0;

inc(Mas[nx,ny].Xish^.Gol,2);

end;

if Mas[nx,ny].Xish^.Gol>=MaxGolX then

begin

KillXishnik(nx,ny);

AmountOfXishnik:=AmountOfXishnik-1;

end;

if Mas[nx,ny].Xish<>nil then

begin

inc(Mas[nx,ny].Xish^.Life,1);

if Mas[nx,ny].Xish^.Life>=MaxLife then

begin

KillXishnik(nx,ny);

AmountOfXishnik:=AmountOfXishnik-1;

end;

end;

if Mas[nx,ny].Xish<>nil then

if Mas[nx,ny].Xish^.Syt>=PoraDelX then

begin

Mas[nx,ny].Xish^.Syt:=0;

Mas[nx,ny].Xish^.Gol:=0;

DivisionXishnik(nx,ny,{Mas[nx,ny].Creature^.vermas});

end;

if Mas[nx,ny].Xish<>nil then

Mas[nx,ny].Xish^.IsHodila:=True;

end;

end;

for j:=1 to MAXSIZEY do

for i:=1 to MAXSIZEX do

begin

if mas[i,j].Creature<>nil then

if not mas[i,j].Creature^.IsHodila then

with mas[i,j].Creature^ do

begin

k:=random(7)+1;

l:=k;

nx:=i;

ny:=j;

dx:=Raspozn({Vector[VecWas,l]}l).dx;

dy:=Raspozn({Vector[VecWas,l]}l).dy;

if ((nx+dx)<=MAXSIZEX) and ((nx+dx)>=1) and

((ny+dy)<=MAXSIZEY) and ((ny+dy)>=1) then

begin

if (mas[nx+dx,ny+dy].Creature=nil) and (mas[nx+dx,ny+dy].Xish=nil) then

begin

New(mas[nx+dx,ny+dy].Creature);

mas[nx+dx,ny+dy].Creature^:=TKosiak.Init(nx+dx,ny+dy,VecWas,{VerMas}Canva);

mas[nx+dx,ny+dy].Creature^.life:=mas[nx,ny].Creature^.life;

mas[nx+dx,ny+dy].Creature^.syt:=mas[nx,ny].Creature^.syt;

mas[nx+dx,ny+dy].Creature^.gol:=mas[nx,ny].Creature^.gol;

KillKosiak(nx,ny);

nx:=nx+dx;

ny:=ny+dy;

end;

end;

if Mas[nx,ny].Eda<>nil then

begin

if (Mas[nx,ny].Eda.GetKol-EST)>=0 then

begin

inc(Mas[nx,ny].Creature^.Syt,1);

Mas[nx,ny].Eda.SetKol(Mas[nx,ny].Eda.GetKol-EST);

end else

begin

Mas[nx,ny].Creature^.Syt:=0;

inc(Mas[nx,ny].Creature^.Gol,1);

end;

end;

if Mas[nx,ny].Creature^.Gol>=MaxGolK then

begin

KillKosiak(nx,ny);

AmountOfKosiak:=AmountOfKosiak-1;

end;

begin

inc(Mas[nx,ny].Creature^.Life,1);

if Mas[nx,ny].Creature<>nil then

if Mas[nx,ny].Creature^.Syt>=PoraDelK then

begin

Mas[nx,ny].Creature^.Syt:=0;

Mas[nx,ny].Creature^.Gol:=0;

DivisionKosiak(nx,ny);

end;

if Mas[nx,ny].Creature<>nil then

Mas[nx,ny].Creature^.IsHodila:=True;

end;

end;

for j:=1 to MAXSIZEY do

for i:=1 to MAXSIZEX do

begin

if mas[i,j].Xish<>nil then

mas[i,j].Xish^.IsHodila:=False;

if mas[i,j].Creature<>nil then

mas[i,j].Creature^.IsHodila:=False;

if mas[i,j].Creature<>nil then

if mas[i,j].Creature^.gol<(MaxGolK div 2) then

b:=2

else b:=1

else b:=0;

if mas[i,j].Eda<>nil then

a:=mas[i,j].Eda^.Amount

else a:=0;

if mas[i,j].Xish<>nil then mas[i,j].Xish^.Draw(a,b)

else

if mas[i,j].Creature<>nil then mas[i,j].Creature^.Draw(a,0)

else

if mas[i,j].Eda<>nil then mas[i,j].Eda^.Draw(0,0) else

Canva.Draw(cellsize*(i-1)+1,cellsize*(j-1)+1,p0k0x0);

end;

if AmountOfKosiak> 0 then

counter:=counter+1;

for j:=1 to MAXSIZEY do

for i:=1 to MAXSIZEX do

begin

if mas[i,j].Eda=nil then

begin

new(Mas[i,j].Eda);

Mas[i,j].Eda^:=TPlankton.Init(i,j,0,canva);

end;

if mas[i,j].Eda^.GetKol+PlanktonGrow<=100 then

mas[i,j].Eda^.SetKol(mas[i,j].Eda^.GetKol+PlanktonGrow);

end;;

if mas[i,j].Creature<>nil then mas[i,j].Creature^.Draw(0,0) else

if mas[i,j].Eda<>nil then mas[i,j].Eda^.Draw(0,0) else

Canva.Draw(cellsize*(i-1)+1,cellsize*(j-1)+1,p0k0x0);

p0k0x0:= TBitmap.Create;

p0k0x3:= TBitmap.Create;

p0k0x6:= TBitmap.Create;

p0k0x8:= TBitmap.Create;

p0k3x0:= TBitmap.Create;

p0k3x3:= TBitmap.Create;

p0k3x6:= TBitmap.Create;

p0k3x8:= TBitmap.Create;

p0k6x0:= TBitmap.Create;

p0k6x3:= TBitmap.Create;

p0k6x6:= TBitmap.Create;

p0k6x8:= TBitmap.Create;

p0k8x0:= TBitmap.Create;

p0k8x3:= TBitmap.Create;

p0k8x6:= TBitmap.Create;

p0k8x8:= TBitmap.Create;

p3k0x0:= TBitmap.Create;

p3k0x3:= TBitmap.Create;

p3k0x6:= TBitmap.Create;

p3k0x8:= TBitmap.Create;

p3k3x0:= TBitmap.Create;

p3k3x3:= TBitmap.Create;

p3k3x6:= TBitmap.Create;

p3k3x8:= TBitmap.Create;

p3k6x0:= TBitmap.Create;

p3k6x3:= TBitmap.Create;

p3k6x6:= TBitmap.Create;

p3k6x8:= TBitmap.Create;

p3k8x0:= TBitmap.Create;

p3k8x3:= TBitmap.Create;

p3k8x6:= TBitmap.Create;

p3k8x8:= TBitmap.Create;

p6k0x0:= TBitmap.Create;

p6k0x3:= TBitmap.Create;

p6k0x6:= TBitmap.Create;

p6k0x8:= TBitmap.Create;

p6k3x0:= TBitmap.Create;

p6k3x3:= TBitmap.Create;

p6k3x6:= TBitmap.Create;

p6k3x8:= TBitmap.Create;

p6k6x0:= TBitmap.Create;

p6k6x3:= TBitmap.Create;

p6k6x6:= TBitmap.Create;

p6k6x8:= TBitmap.Create;

p6k8x0:= TBitmap.Create;

p6k8x3:= TBitmap.Create;

p6k8x6:= TBitmap.Create;

p6k8x8:= TBitmap.Create;

p8k0x0:= TBitmap.Create;

p8k0x3:= TBitmap.Create;

p8k0x6:= TBitmap.Create;

p8k0x8:= TBitmap.Create;

p8k3x0:= TBitmap.Create;

p8k3x3:= TBitmap.Create;

p8k3x6:= TBitmap.Create;

p8k3x8:= TBitmap.Create;

p8k6x0:= TBitmap.Create;

p8k6x3:= TBitmap.Create;

p8k6x6:= TBitmap.Create;

p8k6x8:= TBitmap.Create;

p8k8x0:= TBitmap.Create;

p8k8x3:= TBitmap.Create;

p8k8x6:= TBitmap.Create;

p8k8x8:= TBitmap.Create;

p0k0x0.LoadFromFile('p0k0x0.bmp');

p0k0x3.LoadFromFile('p0k0x3.bmp');

p0k0x6.LoadFromFile('p0k0x6.bmp');

p0k0x8.LoadFromFile('p0k0x8.bmp');

p0k3x0.LoadFromFile('p0k3x0.bmp');

p0k3x3.LoadFromFile('p0k3x3.bmp');

p0k3x6.LoadFromFile('p0k3x6.bmp');

p0k3x8.LoadFromFile('p0k3x8.bmp');

p0k6x0.LoadFromFile('p0k6x0.bmp');

p0k6x3.LoadFromFile('p0k6x3.bmp');

p0k6x6.LoadFromFile('p0k6x6.bmp');

p0k6x8.LoadFromFile('p0k6x8.bmp');

p0k8x0.LoadFromFile('p0k8x0.bmp');

p0k8x3.LoadFromFile('p0k8x3.bmp');

p0k8x6.LoadFromFile('p0k8x6.bmp');

p0k8x8.LoadFromFile('p0k8x8.bmp');

p3k0x0.LoadFromFile('p3k0x0.bmp');

p3k0x3.LoadFromFile('p3k0x3.bmp');

p3k0x6.LoadFromFile('p3k0x6.bmp');

p3k0x8.LoadFromFile('p3k0x8.bmp');

p3k3x0.LoadFromFile('p3k3x0.bmp');

p3k3x3.LoadFromFile('p3k3x3.bmp');

p3k3x6.LoadFromFile('p3k3x6.bmp');

p3k3x8.LoadFromFile('p3k3x8.bmp');

p3k6x0.LoadFromFile('p3k6x0.bmp');

p3k6x3.LoadFromFile('p3k6x3.bmp');

p3k6x6.LoadFromFile('p3k6x6.bmp');

p3k6x8.LoadFromFile('p3k6x8.bmp');

p3k8x0.LoadFromFile('p3k8x0.bmp');

p3k8x3.LoadFromFile('p3k8x3.bmp');

p3k8x6.LoadFromFile('p3k8x6.bmp');

p3k8x8.LoadFromFile('p3k8x8.bmp');

p6k0x0.LoadFromFile('p6k0x0.bmp');

p6k0x3.LoadFromFile('p6k0x3.bmp');

p6k0x6.LoadFromFile('p6k0x6.bmp');

p6k0x8.LoadFromFile('p6k0x8.bmp');

p6k3x0.LoadFromFile('p6k3x0.bmp');

p6k3x3.LoadFromFile('p6k3x3.bmp');

p6k3x6.LoadFromFile('p6k3x6.bmp');

p6k3x8.LoadFromFile('p6k3x8.bmp');

p6k6x0.LoadFromFile('p6k6x0.bmp');

p6k6x3.LoadFromFile('p6k6x3.bmp');

p6k6x6.LoadFromFile('p6k6x6.bmp');

p6k6x8.LoadFromFile('p6k6x8.bmp');

p6k8x0.LoadFromFile('p8k8x0.bmp');

p6k8x3.LoadFromFile('p8k8x3.bmp');

p6k8x6.LoadFromFile('p8k8x6.bmp');

p6k8x8.LoadFromFile('p8k8x8.bmp');

p8k0x0.LoadFromFile('p8k0x0.bmp');

p8k0x3.LoadFromFile('p8k0x3.bmp');

p8k0x6.LoadFromFile('p8k0x6.bmp');

p8k0x8.LoadFromFile('p8k0x8.bmp');

p8k3x0.LoadFromFile('p8k3x0.bmp');

p8k3x3.LoadFromFile('p8k3x3.bmp');

p8k3x6.LoadFromFile('p8k3x6.bmp');

p8k3x8.LoadFromFile('p8k3x8.bmp');

p8k6x0.LoadFromFile('p8k6x0.bmp');

p8k6x3.LoadFromFile('p8k6x3.bmp');

p8k6x6.LoadFromFile('p8k6x6.bmp');

p8k6x8.LoadFromFile('p8k6x8.bmp');

p8k8x0.LoadFromFile('p8k8x0.bmp');

p8k8x3.LoadFromFile('p8k8x3.bmp');

p8k8x6.LoadFromFile('p8k8x6.bmp');

p8k8x8.LoadFromFile('p8k8x8.bmp');


p0k0x0.Free;

p0k0x3.Free;

p0k0x6.Free;

p0k0x8.Free;

p0k3x0.Free;

p0k3x3.Free;

p0k3x6.Free;

p0k3x8.Free;

p0k6x0.Free;

p0k6x3.Free;

p0k6x6.Free;

p0k6x8.Free;

p0k8x0.Free;

p0k8x3.Free;

p0k8x6.Free;

p0k8x8.Free;

p3k0x0.Free;

p3k0x3.Free;

p3k0x6.Free;

p3k0x8.Free;

p3k3x0.Free;

p3k3x3.Free;

p3k3x6.Free;

p3k3x8.Free;

p3k6x0.Free;

p3k6x3.Free;

p3k6x6.Free;

p3k6x8.Free;

p3k8x0.Free;

p3k8x3.Free;

p3k8x6.Free;

p3k8x8.Free;

p6k0x0.Free;

p6k0x3.Free;

p6k0x6.Free;

p6k0x8.Free;

p6k3x0.Free;

p6k3x3.Free;

p6k3x6.Free;

p6k3x8.Free;

p6k6x0.Free;

p6k6x3.Free;

p6k6x6.Free;

p6k6x8.Free;

p6k8x0.Free;

p6k8x3.Free;

p6k8x6.Free;

p6k8x8.Free;

p8k0x0.Free;

p8k0x3.Free;

p8k0x6.Free;

p8k0x8.Free;

p8k3x0.Free;

p8k3x3.Free;

p8k3x6.Free;

p8k3x8.Free;

p8k6x0.Free;

p8k6x3.Free;

p8k6x6.Free;

p8k6x8.Free;

p8k8x0.Free;

p8k8x3.Free;

p8k8x6.Free;

p8k8x8.Free;.


Министерство Образования и наук Украины Севастопольский национальный технический университет Кафедра ИС ПОЯСНИТЕЛЬН

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ