Модели сложных систем
Описание проектного решения стратегической системы, этапы объектно-ориентированного анализа и проектирования. Описание связей между объектами. Программная реализация, построение модели состояний объекта. Руководство пользователя и описание программы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 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