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

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 17.11.2011
Размер файла 388,8 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

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

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

Кафедра ИС

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

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

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

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

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

Введение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Рисунок 2.1.1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2.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;

Mas:array[1..MAXSIZEX,1..MAXSIZEY] of TLink; ,где

TLink=record

Xish:TPXishnik;

Creature:TPKosiak;

Eda:TPPlankton;

end;

TPXishnik=^TXishnik;

TPKosiak=^TKosiak;

TPPlankton=^TPlankton;

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

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

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

procedure DrawGrid - рисует сетку MAXSIZEX на MAXSIZEY;

Procedure KillKosiak(tx,ty: integer) - уничтожает косяк;

Procedure KillXishnik(tx,ty: integer) - уничтожает хищника;

procedure Draw(i,j:integer) - прорисовывает каждую клетку массива Mas;

Procedure 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. Программная реализация

3.1 Среда разработки

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

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

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

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

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

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

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

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

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

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

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

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

Приложения

ПРИЛОЖЕНИЕ А

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

Project15.dpr

program Project15;

uses

Forms,

Unit2 in 'Unit2.pas' {Form1},

okean in 'okean.pas';

{$R *.res}

begin

Application.Initialize;

Application.CreateForm(TForm1, Form1);

Application.Run;

end.

Unit2.pas

unit Unit2;

interface

uses

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

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

Type

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;

var

Form1: TForm1;

implementation

{$R *.dfm}

var

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;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

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;

end;

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

Shift: TShiftState; X, Y: Integer);

begin

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;

end;

{+}

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

if playing then

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

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

image2.Visible:=not image2.Visible;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

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);

end;

procedure TForm1.Image2MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

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

end;

procedure TForm1.Image2MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

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

end;

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

begin

Play.Free;

Play_d.Free;

Nextb.Free;

Next_d.Free;

Pause.Free;

Pause_d.Free;

end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin

Syst.Step;

end;

procedure TForm1.Image1Click(Sender: TObject);

begin

Timer1.Enabled := not Timer1.Enabled;

end;

procedure TForm1.Image2Click(Sender: TObject);

begin

Syst.Step;

end;

procedure TForm1.FieldMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

var

nx,ny:integer;

begin

{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); }

end;

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

Y: Integer);

var

nx,ny:integer;

begin

{ 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; }

end;

procedure TForm1.SpinEdit1Change(Sender: TObject);

begin

AmountAtTheBeginingK:=SpinEdit1.Value;

end;

procedure TForm1.SpinEdit3Change(Sender: TObject);

begin

AmountAtTheBeginingX := SpinEdit3.Value;

end;

procedure TForm1.SpinEdit2Change(Sender: TObject);

begin

PoraDelK:=SpinEdit2.Value;

end;

procedure TForm1.SpinEdit5Change(Sender: TObject);

begin

PoraDelX:=SpinEdit5.Value;

end;

end.

Okean.pas

unit okean;

interface

uses

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

Dialogs, StdCtrls;

type

DxDy=record

dx,dy:integer;

end;

TKletka=class

public

x,y:integer;

private

constructor Init(InitX, InitY: integer);

procedure Draw;

destructor Done;

end;

TPlankton=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;

TKosiak=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;

TXishnik=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;

TPXishnik=^TXishnik;

TPKosiak=^TKosiak;

TPPlankton=^TPlankton;

TLink=record

Xish:TPXishnik;

Creature:TPKosiak;

Eda:TPPlankton;

end;

TOkean=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;

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

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

end;

var

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; {съедает за один раз}

implementation

var

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;

constructor TKletka.Init(InitX, InitY: integer);

begin

x:=initx; y:=inity;

end;

procedure TKletka.Draw;

begin

end;

destructor TKletka.Done;

begin

end;

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

begin

x:=x1; y:=y1;

Canv := Canva;

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

Syt:=0; Gol:=5;

Life:=0;

IsHodila:=true;

end;

function TKosiak.GetHod: boolean;

begin

Result:=IsHodila;

end;

Procedure TKosiak.NilHod;

begin

IsHodila:=false;

end;

function TKosiak.Raspozn(k:integer):dxdy;

begin

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;

end;

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

begin

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;

destructor TKosiak.Done;

begin

end;

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

begin

x:=x1; y:=y1;

Canv := Canva;

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

Syt:=0; Gol:=5;

Life:=0;

IsHodila:=true;

end;

function TXishnik.GetHod: boolean;

begin

Result:=IsHodila;

end;

Procedure TXishnik.NilHod;

begin

IsHodila:=false;

end;

function TXishnik.Raspozn(k:integer):dxdy;

begin

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;

end;

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

begin

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;

destructor TXishnik.Done;

begin

end;

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

begin

inherited Init(initx,inity);

Canv := Canva;

Amount:=kol;

end;

procedure TPlankton.SetKol(h: integer);

begin

Amount:=h;

end;

function TPlankton.GetKol: integer;

begin

Result:=Amount;

end;

procedure TPlankton.Draw;

begin

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;

end;

destructor TPlankton.Done;

begin

end;

constructor TOkean.Init(Canv: TCanvas);

var i,j: integer;

x1,y1: integer;

begin

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;

if 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;

end;

if 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;

end;

if 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;

end;

end;

procedure TOkean.DrawGrid;

var

i: integer;

begin

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;

end;

function TOkean.GetCanvas:TCanvas;

begin

Result := Canva;

end;

procedure TOkean.KillKosiak(tx,ty: integer);

begin

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

mas[tx,ty].Creature:=nil;

end;

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

var i: integer;

begin

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;

end;

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

begin

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

mas[tx,ty].Xish:=nil;

end;

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

var i: integer;

begin

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;

end;

Procedure TOkean.Step;

var

k:integer;

dx,dy:integer;

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

nx,ny:integer;

flag:boolean;

begin

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;

end;

begin

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);

end

initialization

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');

finalization

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;

end.

Размещено на Allbest.ru


Подобные документы

  • Анализ предметной области "Конкурс поэтов" на основе объектно-ориентированного подхода. Разработка оконного приложения и описание информационной модели предметной области. Описание разработанных процедур С++ и результатов тестирования приложения.

    курсовая работа [355,9 K], добавлен 18.06.2013

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

    курсовая работа [3,3 M], добавлен 23.12.2014

  • Теоретическое исследование вопроса и практическое применение. Общие сведения о графах. Алгоритм Дейкстры. Особенности работы в среде. Программная реализация. Описание алгоритма и структуры программы. Описание программных средств. Текст программы.

    курсовая работа [1,0 M], добавлен 27.11.2007

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

    курсовая работа [821,4 K], добавлен 28.12.2012

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

    курсовая работа [624,5 K], добавлен 30.05.2019

  • Построение математической модели движения заряженных частиц, реализация на алгоритмическом языке с помощью ЭВМ. Описание предметной области. Имитация взаимодействия двух разноименно заряженных частиц. Результаты работы программы, руководство пользователя.

    курсовая работа [824,0 K], добавлен 26.02.2015

  • Описание входной и выходной информации. Определение связей информационных объектов и построение информационно-логической модели. Обобщенный алгоритм решения задачи и его декомпозиция на подзадачи. Описание реквизитов данной информационной системы.

    курсовая работа [1,7 M], добавлен 03.05.2013

  • Разработка клиентского приложения для информационной системы "Работа торгового склада" с помощью языка объектно-ориентированного программирования Delphi 6 и технологии InterBase Express. Описание реляционной модели данных и этапы ее проектирования.

    курсовая работа [1,0 M], добавлен 19.03.2009

  • Абстрактный анализ и синтез модели предметной области. Разработка структуры, внешних и внутренних спецификаций программы. Описание программы Kurs и подпрограммы Openf, особенности и результаты их тестирования. Руководство программиста и пользователя.

    курсовая работа [503,2 K], добавлен 14.07.2012

  • Особенности реализации главных элементов разрабатываемой программы (цифровые элементы) с помощью объектно-ориентированного подхода. Применение принципа инкапсуляции для защиты данных. Конструирование классов, описание и тестирование программного продукта.

    курсовая работа [2,3 M], добавлен 10.05.2015

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.