Программная реализация сложной системы

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

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

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

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

35

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

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовой работе
На тему: "Океан"
по курсу "Объектно-ориентированное программирование"
2005

Аннотация

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

Содержание

Введение

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

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

2.1 Объектно-ориентированный анализ

2.2 Объектно-ориентированное проетирование

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

3.1 Описание классов

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

Заключение

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

Приложение

Введение

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

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

Тематика курсовой работы продиктована популярностью динамических моделей реального времени. В качестве примера можно привести системы моделирования работы электронных схем (язык VHDL), симуляция работы динамической системы пакетом Simulink. По схожему принципу организуется работа так называемых стратегических игр, которые развивают у пользователя стратегическое мышление, обдумывание действий на несколько шагов вперед, предвидение и тактику действий.

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

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

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

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

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

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

Хищники, в отличие от травоядных, индивидуальны. Хищник находится в постоянном движении. В случае, если хищник в течение определенного количества ходов не «голодал» и достиг нужного веса тушки, он раздваивается (делится). Два хищника не могут занимать одну клетку.. Хищник живет N-ое количество ходов. Хищник погибает либо от старости, либо при падении веса до некоторого критического уровня.

Количество водорослей в одной клетке не превышает 190 единиц.

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

2.1 Объектно-ориентированный анализ

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

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

Предметная область представлена тремя объектами:

Растение

Травоядная рыба

Хищник

Все объекты классов Хищник,Травоядная рыба и Растение будут связаны единой системой координат и будут обладать рядом свойств типа

голоден

ест

количество здоровья,

в зависимости от состояния которых объекты будут взаимодействовать друг с другом.

Действие будет происходить на сетке с определенным количеством клеток.

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

Графическое представление информационной модели - диаграмма информационной структуры.

Как уже упоминалось ранее, предметная область содержит пять объектов. Объект «Растение» имеет уникальное и значимое имя «Растение», а также ключевой литерал Р (короткая форма имени для связи с другими объектами). Атрибутами данного объекта являются:

имя;

количество (пищи);

Объект «Травоядная рыба» имеет уникальное и значимое имя «Травоядная», а также ключевой литерал Т. Атрибутами данного объекта являются:

имя;

наличие голода;

количество дней без голода;

количество здоровья;

Объект «Хищник» имеет имя «Хищник», а также ключевой литерал Х. Атрибуты данного объекта идентичны с предыдущим.

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

Представим взаимосвязь объектов графическим способом, изображенным на рис. 2.1.1

Рисунок 2.1.1 -- Информационная модель

Для описания динамики поведения системы как единого целого, компонентами которой являются объекты и связи, необходимо построить модель состояний, состоящей из:

диаграммы переходов в состояния (ДПС);

таблицы переходов в состояния (ТПС).

Для описания поведения объектов изобразим модели состояний. Модель состояния объекта выражает описание жизненного цикла объекта. Жизненный цикл -- это формальное описание поведения объекта.

Рисунок 2.1.3 -- Модель состояний травоядных и хищников

На рисунке 2.1.3 приняты следующие обозначения:

состояние 1 -- поиск рыбой пищи

состояние 2 -- размножение

состояние 3 -- поедание пищи

С1 -- удовлетворение условий размножения (прожить сытым определенное количество дней);

С2 -- травоядная или хищник проголодался

С3 - рыба нашла еду

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

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

Существует три различных типа наполнения ячейки в ТПС:

Новое состояние.

Событие игнорируется.

Не может произойти.

Для модели состояний объектов «Травоядная» и «Хищник» таблица переходов представлена таблицей 2.1.1.

Таблица 2.1.1 -- Таблица переходов в состояния объектов «Травоядная» и «Хищник»

Состояния

События

С1

С2

С3

1

2

Игн

3

2

Игн

1

Не мог

3

2

1

3

Из таблицы 2.1.1 видно, что переход из состояния 1 в состояние 2 осуществляется с помощью события С1, а в состояние 3 - с помощью события С2.

Рисунок 2.1.4 -- Модель состояний травоядных и хищников

На рисунке 2.1.4 обозначения означают следующее:

состояние 1 -- рост растения;

состояние 2 -- размножение;

С1 -- удовлетворение условий размножения (вырасти до определенного уровня);

С2 -- частичное поедание растения рыбой

Модель состояний объекта «Растение» представлена таблицей 2.1.2.

Таблица 2.1.2 -- Таблица переходов в состояния объектов «Растение»

Состояния

События

С1

С2

1

2

Игн

2

Игн

1

2.2 Объектно-ориентированное проектирование

Известно, что на результатах ООА формируются модели, на которых основывается OOD; OOD в свою очередь создает фундамент для окончательной реализации системы с использованием методологии OOP (объектно-ориентированного программирования).

Процесс объектно-ориентированное проектирования (OOD), в свою очередь, начинается с разработки классов и объектов, формирующих предметную область.

Выделяют следующие этапы проектирования:

Первый шаг ООD включает идентификацию классов и объектов.

Для описания данной модели существуют три класса -- класс «Травоядная» с уникальным именем Т, класс «Хищник» с уникальным именем Х и класс «Растение» с уникальным именем Р, которые можно представить в виде диаграмм классов на рисунке 2.2.1.

Рисунок 2.2.1 -- Диаграмма классов

Классы «Травоядная» и «Хищник» будут наследованы от абстрактного класса «Создание», а «Растение» от суперкласса «Объект». Иерархия классов представлена на рисунке 2.2.2.

Рисунок 2.2.2 -- Иерархия классов

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

Объект «Растение» обладает следующими свойствами: имя, количество пищи.

Объекты «Травоядная» и «Хищник» имеют такие свойства: имя, количество зд, наличие голода, количество дней без голода.

На основе ООА, используя таблицы 2.1.1 и 2.1.2, изобразим диаграммы переходов состояний хищников и травоядных (рисунок 2.2.3), а также растений (рисунок 2.2.4). На диаграмме переходов показаны состояния объекта, а также события, приводящие к переходу из одного состояния в другое.

Рисунок 2.2.3 -- Диаграмма переходов состояний хищников и травоядных

На рисунке 2.2.3 приняты следующие обозначения:

состояние 1 - рождение рыбы

состояние 2 -- поиск рыбой пищи

состояние 3 -- размножение

состояние 4 -- поедание пищи

состояние 5 - смерть рыбы

А -- событие 1 -- травоядная или хищник проголодался;

Б -- удовлетворение условий размножения (прожить сытым определенное количество дней);

В - рыба нашла еду

Г - рыба умерла

На рисунке 2.2.4 представлена диаграмма переходов состояний объектов «Растение»

Рисунок 2.2.4 -- Диаграмма переходов состояний объектов «Растение»

Обозначения на рисунке 2.2.4:

состояние 1 - создание объекта;

состояние 2 -- рост растения;

состояние 3 -- размножение;

состояние 4 - смерть растения;

А -- событие 1 -- рождение;

Б -- удовлетворение условий размножения (вырасти до определенного уровня);

В -- частичное поедание растения рыбой

Г - полное поедание растения рыбой

Внутреннюю работу системы можно описать диаграммой потоков действий ( рисунок 2.2.5).

Рисунок 2.2.5 -- Диаграмма потоков действий

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

3.1 Описание классов

Описанные выше классы Растение, Травоядная, Хищник описаны в программе как TFlora, TKindFish и TPredator соответственно. TFlora наследует от TObject, а Травоядная и Хищник - от TCreature.

TFlora = class(TObject)

Bckgrnd: timage; //фон, на котором все движется

itself: TPanel;

Health: integer; //здоровье, у TFlora - кол-во еды (0..190)

Grid: pgrid; //сетка с инф-цией о поле

InImgX, InImgY: integer; //координаты в image(фоне)

InGridX, InGridY: integer; //координаты в сетке

constructor GrowUp(gridX, gridY: integer; back:timage;

itsparent: tcustomform; quant: integer);

destructor Death;virtual;

procedure Draw; virtual;

procedure Erase; virtual;

procedure Increase(coefficient: integer);

procedure Decrease(coefficient: integer);

private

end;

TCreature = class(TFlora)

public

Appearance: TBitMap; //картинка с внешностью

itself: TImage;

Name: string; //имя

Alive: boolean;

Age: integer; //возраст существа

whereItWantsTo: TPositionInGrid;

Direction: TDirection; //направление движения

IsEating: boolean;

IsHungry: boolean;

HealthyTime: integer; //кол-во прошедшего непрерывно времени

//в сытости (Health > HEALTHLIMIT)

WasHealthy: boolean; //было ли создание сыто в прошлый раз

constructor Born(gridX, gridY: integer; NameInit: string; back:timage; itsparent: tcustomform);virtual;

procedure Draw; override;

destructor Death; override;

procedure Erase; override;

procedure Move(dx, dy: integer); virtual;

procedure MoveInDirection(dir: TDirection; speed: integer); virtual;

function whereWantsTo: TPositionInGrid; virtual;

rivate

procedure ChangeDirection(Dir: TDirection);virtual;

function WhichPicture: string; virtual;

end;

TKindFish = class (TCreature)

function whereWantsTo: TPositionInGrid; override;

procedure MoveItself(speed: integer);

procedure EatOrNotToEat;

rivate

function WhichPicture: string; override;

end;

TPredator = class (TCreature)

function whereWantsTo: TPositionInGrid; override;

procedure MoveItself(speed: integer);

procedure Attack(Victim: TKindFish);

rivate

function WhichPicture: string; override;

end;

Поля класса TFlora:

Bckgrnd: - фон, на котором все движется

itself:

Health: - здоровье, у TFlora - кол-во еды (0..190)

Grid:; - сетка с инф-цией о поле

InImgX, InImgY: - координаты в image(фоне)

InGridX, InGridY: - координаты в сетке

Методы класса TFlora:

GrowUp; - конструктор

Death; - деструктор

Draw; - отображение

Erase; - стирание

Increase - увеличение пищи

Decrease; - ее уменьшение

Поля класса TСreature:

Appearance: TBitMap; - картинка с внешностью

itself: TImage;

Name: string; - имя

Alive: boolean; - жив или нет

Age: integer; - возраст существа

whereItWantsTo - позиция в сетке, куда хочет попасть

Direction: - направление движения

IsEating: - ест или нет

IsHungry: - голоден или нет

HealthyTime:; - кол-во прошедшего непрерывно время в сытости

WasHealthy:; - было ли создание сыто в прошлый раз

Методы класса TСreature::

MoveInDirection - у TCreature эта функция ничего не делает

WhereWantsTo - вычисляет желаемую позицию (эта процедура - мозги рыбы)

//меняет направление существа

ChangeDirection ; - меняет направление существа

WhichPicture - вспомогательная функция рисования

Методы классjd TkindFish и TPredator:

MoveItself - самостоятельное движение

EatOrNotToEat; - есть ели не есть

Все эти классы содержатся в модуле Creatures.pas.

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

TMaster = class

timer: ttimer;

world: timage;

f: tcustomform;

CreatList: TList;

TimeOver: integer;

TurnsOver: integer;

gridd: PGrid;

floragrowing: boolean;

constructor Generate(Tmr: TTimer; back: timage; form: tcustomform);

destructor Gone;

procedure AllowSimpleAction;

function GiveLifeTo(Who: TKindOfOrganism;

Father: Pointer): TPositionInGrid;

procedure DeleteCreature(ItsName: string);

private

Fishes: integer;

Predators: integer;

public

end;

Поля класса TMaster:

timer; - таймер

world; фон

f - форма

CreatList:; список организмов

TimeOver: - прошедшее время

TurnsOver: - прошедшие ходы

Gridd; - сетка

Методы класса TMaster:

AllowSimpleAction; - одно действие организмов

GiveLifeTo(Who: TKindOfOrganism;

Father: Pointer): TPositionInGrid; - рождение организмов

DeleteCreature(ItsName: string); - смерть организмов

3.2 Тестирование программы

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

Заключение

Работа выполнена в соответствии с постановкой задачи на курсовое проектирование.

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

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

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

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

Конспект лекций по дисциплине «Объектно-ориентированное программирование».

Приложение

unit Creatures

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

ExtCtrls;

const XLIM = 28;

YLIM = 21;

MAXHEALTH = 100; //максимальное здоровье рыб

MAXFLORA = 190; //кол-во пищи в одном объекте

HEALTH_LIMIT = 92; //если здоровье рыбы больше HEALTHLIMIT,

//она считается сытой и здоровой

type

TKindOfOrganism = (FLORA, KINDFISH, PREDATOR, NONE);

TPositionInGrid = record

x,y: integer;

end;

Cell = record

IsVacant: boolean; //свободна ли клетка

WhoInCell: TKindOfOrganism;

FoodQuantity: byte;

Flora: Pointer;

end;

TGrid = array[1..XLIM,1..YLIM]of cell;

PGrid = ^TGrid;

TDirection = (UP, UPRIGHT, RIGHT, DOWNRIGHT,

DOWN, DOWNLEFT, LEFT, UPLEFT);

//=================== TFLORA ===================

TFlora = class(TObject)

Bckgrnd: timage; //фон, на котором все движется

itself: TPanel;

Health: integer; //здоровье, у TFlora - кол-во еды (0..190)

Grid: pgrid; //сетка с инф-цией о поле

InImgX, InImgY: integer; //координаты в image(фоне)

InGridX, InGridY: integer; //координаты в сетке

constructor GrowUp(gridX, gridY: integer; back:timage;

itsparent: tcustomform; quant: integer);

destructor Death;virtual;

procedure Draw; virtual;

procedure Erase; virtual;

procedure Increase(coefficient: integer);

procedure Decrease(coefficient: integer);

private

// it: tbitmap;

// buf: tbitmap;

end;

//================= TCREATURE =========================

TCreature = class(TFlora)

public

Appearance: TBitMap; //картинка с внешностью

itself: TImage;

Name: string; //имя

Alive: boolean;

Age: integer; //возраст существа

whereItWantsTo: TPositionInGrid;

Direction: TDirection; //направление движения

IsEating: boolean;

IsHungry: boolean;

HealthyTime: integer; //кол-во прошедшего непрерывно времени

//в сытости (Health > HEALTHLIMIT)

WasHealthy: boolean; //было ли создание сыто в прошлый раз

constructor Born(gridX, gridY: integer; NameInit: string; back:timage; itsparent: tcustomform);virtual;

procedure Draw; override;

destructor Death; override;

procedure Erase; override;

procedure Move(dx, dy: integer); virtual;

procedure MoveInDirection(dir: TDirection; speed: integer); virtual;

//у TCreature эта функция ничего не делает

function whereWantsTo: TPositionInGrid; virtual;

rivate

//меняет направление существа

procedure ChangeDirection(Dir: TDirection);virtual;

//возвращает строку с названием рисунка, который

//надо загрузить в Appearance в зависимости от Direction

//вызывается в конструкторе и в ChangeDirection

function WhichPicture: string; virtual;

end;

//============== TKINDFISH =============================

TKindFish = class (TCreature) //'Добрая Рыбка' - травоядная

{возвращает место, куда хочет рыбка

(с координатами -1,-1, если никуда не хочет)}

function whereWantsTo: TPositionInGrid; override;

procedure MoveItself(speed: integer);

//решает важгый вопрос: Есть или не есть

rocedure EatOrNotToEat;

private

function WhichPicture: string; override;

end;

//================= TPREDATOR =========================

TPredator = class (TCreature) // 'хищник' - понятно

IsEating: boolean;

IsHungry: boolean;

function whereWantsTo: TPositionInGrid; override;

procedure MoveItself(speed: integer);

procedure Attack(Victim: TKindFish);

private

function WhichPicture: string; override;

end;

var floras: integer = 0;

implementation

/////////////////////////////////////////////////////////////

//====================== МЕТОДЫ TFLORA ===============

constructor TFlora.GrowUp(gridX, gridY: integer; back:timage;

itsparent:tcustomform; quant: integer);

begin

randomize;

BckGrnd:= Back;

Health:= quant;

InGridX:= gridx;

InGridY:= gridy;

InImgX:= 16*(ingridx)+8;

InImgY:= 16*(ingridy)+8; //16 - сторона клетки в сетке

itself:= tpanel.Create(BckGrnd);

itself.Parent:= itsparent;

itself.BevelOuter:= bvNone;

itself.SendToBack;

itself.Width:= 9;

itself.height:= 9;

itself.color:= $0000FF00 - (health shl 8);

itself.Left:= inimgx+1;

itself.top:= inimgy+1;

itself.Name:= 'Flora' + inttostr(floras);

itself.Caption:= '';

inc(floras);

Draw;

end;

//-------------------------------------

destructor TFlora.Death;

begin

itself.Visible:= false;

itself.Free;

end;

//-------------------------------------

procedure TFlora.Draw;

begin

itself.Visible:= True;

end;

//-----------------------------------

procedure TFlora.Erase;

begin

itself.Visible:= False;

end;

//------------------------------------

procedure TFlora.Increase(coefficient: integer);

begin

Health:= Health + coefficient;

if health > MAXFLORA then Health:= MAXFLORA;

grid[ingridx,ingridy].FoodQuantity:= Health;

itself.Color:= $0000FF00 - (health shl 8);

end;

//-----------------------------------

procedure TFlora.Decrease(coefficient: integer);

begin

Health:= Health - coefficient;

if Health < 0 then Health:= 0;

grid[ingridx,ingridy].FoodQuantity:= Health;

itself.Color:= $0000FF00 - (health shl 8);

end;

//==================== МЕТОДЫ TCREATURE ==============

procedure TCreature.ChangeDirection(Dir: TDirection);

var PictureName: string;

begin

Direction:= Dir;

PictureName:= WhichPicture;

Appearance.LoadFromResourceName(HInstance,PictureName);

itself.canvas.draw(0,0,appearance);

end;

//------------------------------------

function TCreature.WhichPicture: string;

var s: string;

begin

case Direction of

up: s:= 'up';

upright: s:= 'upright';

right: s:= 'right';

downright: s:= 'downright';

down: s:= 'down';

downleft: s:= 'downleft';

left: s:= 'left';

upleft: s:= 'upleft';

end;

WhichPicture:= s;

еnd;

//-------------------------------------

constructor TCreature.Born(gridx, gridy: integer; NameInit: string;

back:timage; itsparent: tcustomform);

var PictureName: string;

begin

whereItWantsTo.x:= -2;

whereItWantsTo.y:= -2;

Alive:= true;

Name:= NameInit;

Direction:= RIGHT;

BckGrnd:= Back;

Age:= 0;

Health:= MAXHEALTH;

HealthyTime:= 0;

WasHealthy:= true;

IsEating:= false;

IsHungry:= true;

InGridX:= gridx;

InGridY:= gridy;

InImgX:= 16*(ingridx-1);

InImgY:= 16*(ingridy-1); //16 - сторона клетки в сетке

Appearance:= TBitMap.Create;

//загружаем внешний вид существа в

//зависимости от его положения

PictureName:= WhichPicture;

Appearance.LoadFromResourceName(HInstance,PictureName);

itself:= timage.Create(BckGrnd);

itself.Parent:= itsparent;

itself.BringToFront;

itself.Width:= appearance.Width;

itself.height:= appearance.height;

itself.canvas.draw(0,0,appearance);

itself.Transparent:=true;

itself.Left:= inimgx;

itself.top:= inimgy;

Draw;

end;

//-----------------------------------

destructor TCreature.Death;

begin

itself.Free;

appearance.Free;

end;

//-----------------------------------

procedure TCreature.Draw;

begin

itself.Visible:= true;

end;

//------------------------------------

procedure TCreature.Erase;

begin

itself.Visible:= false;

end;

//--------------------------------------

procedure TCreature.Move(dx,dy: integer);

begin

Erase;

//меняем направление, если надо

if (dx=0)and(dy<0) then Direction:= UP;

if (dx>0)and(dy<0) then Direction:= UPRIGHT;

if (dx>0)and(dy=0) then Direction:= RIGHT;

if (dx>0)and(dy>0) then Direction:= DOWNRIGHT;

if (dx=0)and(dy>0) then Direction:= DOWN;

if (dx<0)and(dy>0) then Direction:= DOWNLEFT;

if (dx<0)and(dy=0) then Direction:= LEFT;

if (dx<0)and(dy<0) then Direction:= UPLEFT;

ChangeDirection(Direction);

//если находится в клетке

if (InImgX mod 16 = 0)and(InImgY mod 16 = 0) then

begin

InGridX:= trunc((InImgX+16)/16);

InGridY:= trunc((InImgY+16)/16);

Grid[InGridX,InGridY].IsVacant:= false;

// Grid[InGridX,InGridY].WhoInCell:= ClassName;

if classname = 'TKindFish' then

Grid[InGridX,InGridY].WhoInCell:= KINDFISH;

if classname = 'TPredator' then

Grid[InGridX,InGridY].WhoInCell:= PREDATOR;

end;

if (InImgX mod 16 = 0)and(InImgY mod 16 = 0) then

//если куда-то сдвинулись

if (dx<>0)and(dy<>0) then

begin

//то сообщаем, что клетка свободна

Grid[InGridX,InGridY].IsVacant:= true;

Grid[InGridX,InGridY].WhoInCell:= NONE;

end;

//сдвинулись

InImgX:= InImgX + dx;

InImgY:= InImgY + dy;

itself.Left:= inimgx;

itself.top:= inimgy;

Draw;

end;

//----------------------------------

procedure TCreature.MoveInDirection(dir: TDirection; speed: integer);

var dx,dy: integer;

begin

dx:=0;

dy:=0;

Direction:= dir;

case Direction of

up: begin dx:=0; dy:=-speed end;

upright: begin dx:=speed; dy:=-speed end;

right: begin dx:=speed; dy:=0 end;

downright: begin dx:=speed; dy:=speed end;

down: begin dx:=0; dy:=speed end;

downleft: begin dx:=-speed; dy:=speed end;

left: begin dx:=-speed; dy:=0 end;

upleft: begin dx:=-speed; dy:=-speed end;

end;

Erase;

//если находимся в клетке

if (InImgX mod 16 = 0)and(InImgY mod 16 = 0) then

/если куда-то сдвинулись

if (dx<>0)and(dy<>0) then

//то сообщаем, что клетка свободна

Grid[InGridX,InGridY].IsVacant:= true; //

//сдвинулись в требуемом направлении

InImgX:= InImgX + dx;

InImgY:= InImgY + dy;

//проверяем позицию в сетке заново:

//если приплыли в какую-то клетку, сообщаем, что она занята

if (InImgX mod 16 = 0)and(InImgY mod 16 = 0) then

begin

InGridX:= trunc(InImgX/16);

InGridY:= trunc(InImgY/16);

Grid[InGridX,InGridY].IsVacant:= false;

end;

itself.Left:= inimgx;

itself.top:= inimgy;

Draw;

end;

//-------------------------------------

function TCreature.whereWantsTo: TPositionInGrid;

begin

end;

/////////////////////////////////////////////////////////////

//==================== МЕТОДЫ KINDFISH ================

function TKindFish.WhichPicture: string;

var s: string;

begin

s:= inherited WhichPicture;

WhichPicture:= 'kf_'+ s;

end;

//----------------------------------------

function TKindFish.WhereWantsTo: TPositionInGrid;

var i,j: integer;

begin

//если рыба ест, или в клетке есть пища

//или не голодна, то никуда ей не надо

if (iseating = true)or(Grid[ingridx,ingridy].FoodQuantity>0)

or(ishungry = false) then

begin

Result.x:= -1;

Result.y:= -1;

whereItWantsTo:= result;

exit;

end;

//если голодна

if (IsHungry = true) then

//ищет пищу на расстоянии 4 клетки

for i:=InGridX-4 to InGridX+4 do

for j:=InGridY-4 to InGridY+4 do

begin

//поиск только внутри сетки

if (i>=1)and(j>=1)and(i<=XLIM)and(j<=YLIM) then

//если клетка свободна и в ней есть пища

if (Grid[i,j].IsVacant=true)and(Grid[i,j].FoodQuantity>0)and

//и если эта клетка - не та, в которой рыба сейчас

(i<>InGridX)and(j<>InGridY) then

begin

//то направляется туда

Result.x:= i;

Result.y:= j;

whereItWantsTo:= result;

exit;

end;

end;

//если пищи рыба не нашла (а есть-то надо), движется случайно

//на расстояние 5ти клеток

randomize;

repeat

//находит внутри сетки

repeat

//свободную клетку

if random(10) > 5 then begin

i:= InGridX + random(4);

j:= IngridY + random(4);

end

else begin

i:= InGridX - random(4);

j:= IngridY - random(4);

end

until Grid[i,j].IsVacant=true

until (i>0)and(j>0)and(i<=XLIM)and(j<=YLIM);

//и направляется туда

Result.x:= i;

Result.y:= j;

whereItWantsTo:= result;

end;

//-------------------------------------

procedure TKindFish.MoveItself(speed: integer);

var dx,dy: integer;

begin

dx:= 0;

dy:= 0;

//если рыба в клетке, то решает, куда плыть дальше

if (InImgX mod 16 =0)and(InImgY mod 16 =0) then

begin

//если рыба приплыла куда хотела

if (whereItWantsTo.x = inGridX)and(whereItWantsTo.y = inGridY)

//или если прошлый раз никуда не хотела

or(whereItWantsTo.x<=-1)and(whereItWantsTo.y<=-1) then

// спрашивает себя, куда плыть дальше

WhereItWantsTo:= WhereWantsTo;

//если рыба куда-то хочет, то движется

if (WhereItWantsTo.x<>-1)or(WhereItWantsTo.y<>-1)then

begin

ith WhereItWantsTo do

begin

if x > InGridX then dx:=speed;

if x < InGridX then dx:=-speed;

if y > InGridY then dy:=speed;

if y < InGridY then dy:=-speed;

end;

move(dx,dy)

end;

end

else

//т.е. если рыба не в клетке, двигается как двигалась

MoveInDirection(Direction,2);

end;

//-------------------------------------------

procedure TKindFish.EatOrNotToEat;

begin

//по умолчанию рыба не ест (за едой еще поплавать надобно)

IsEating:= false;

//но если рыба точно в клетке

if (InImgX mod 16 =0)and(InImgY mod 16 =0) then

//и если в клетке есть еда

if (Grid[InGridX, InGridY].FoodQuantity>0) then

//и есть аппетит, то почему бы не поесть

if (IsHungry = true) then

IsEating:= true;

end;

//================ МЕТОДЫ TPREDATOR ==================

function TPredator.WhichPicture: string;

var s: string;

begin

s:= inherited WhichPicture;

WhichPicture:= 'pr_'+ s;

end;

//------------------------------------------

function TPredator.WhereWantsTo: TPositionInGrid;

var i,j: integer;

begin

if IsHungry = false then

begin

Result.x:= -1;

Result.y:= -1;

whereItWantsTo:= result;

exit;

end;

//хищник ищет добычу на расстоянии 8 клеток

for i:=InGridX-8 to InGridX+8 do

for j:=InGridY-8 to InGridY+8 do

//поиск только внутри сетки

if (i>0)and(j>0)and(i<=XLIM)and(j<=YLIM)and

//если в клетке рыбка (не хищник)

(Grid[i,j].WhoInCell = KINDFISH)and

//и эта клетка - не та, где он сейчас

((i<>InGridX)or(j<>InGridY)) then

begin

//то хищник хочет туда

Result.x:= i;

Result.y:= j;

whereItWantsTo:= result;

exit;

end;

//если не нашли (а есть-то надо), движется случайно

randomize;

repeat

//находим внутри сетки

repeat

//пустую клетку

if random(10) > 5 then begin

i:= InGridX + random(4);

j:= IngridY + random(4);

end

else begin

i:= InGridX - random(4);

j:= IngridY - random(4);

end

until Grid[i,j].IsVacant=true

until (i>0)and(j>0)and(i<=XLIM)and(j<=YLIM);

//и направляется туда

Result.x:= i;

Result.y:= j;

whereItWantsTo:= result;

end;

//------------------------------------

procedure TPredator.MoveItself(speed: integer);

var dx,dy: integer;

begin

dx:= 0;

dy:= 0;

//если рыба в клетке, то решает, куда плыть дальше

if (InImgX mod 16 =0)and(InImgY mod 16 =0) then

begin

//если рыба приплыла куда хотела

if (whereItWantsTo.x = inGridX)and(whereItWantsTo.y = inGridY)

//или если прошлый раз никуда не хотела

or(whereItWantsTo.x<=-1)and(whereItWantsTo.y<=-1) then

// спрашивает себя, куда плыть дальше

WhereItWantsTo:= WhereWantsTo;

//если рыба куда-то хочет, то движется

if (WhereItWantsTo.x<>-1)or(WhereItWantsTo.y<>-1)then

begin

with WhereItWantsTo do

begin

if x > InGridX then dx:=speed;

if x < InGridX then dx:=-speed;

if y > InGridY then dy:=speed;

if y < InGridY then dy:=-speed;

end;

move(dx,dy)

end;

end

else

//т.е. если рыба не в клетке, двигается как двигалась

MoveInDirection(Direction,2);

end;

//-------------------------------------------------

procedure TPredator.Attack(Victim: TKindFish);

begin

//хищник делат бросок

erase;

InImgX:= Victim.InImgX;

nImgY:= Victim.InImgY;

itself.Left:= inimgx;

itself.top:= inimgy;

draw;

//убивает жертву

Victim.Alive:= false;

//и начинает есть

IsEating:= true;

end;

end.

unit Controller;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

ExtCtrls, Creatures, math;

const DAYS_FOR_REPRODUCTION = 24*8; //время, проведенное в сытости,

// необходимое для полового:) созревания

//(8 дней = 1 ход)

HEALTH_TO_DECREASE = 2;

HEALTH_TO_INCREASE = 5;

FLORA_INCREASE = 5;

type

Pflora = ^TFlora;

Pcreature = ^TCreature;

Pkindfish = ^TKindFish;

Ppredator = ^TPredator;

info = record

name,x,y,age,health: shortstring;

end;

TMaster = class

timer: ttimer;

world: timage;

f: tcustomform;

CreatList: TList;

TimeOver: integer;

TurnsOver: integer;

gridd: PGrid;

floragrowing: boolean;

constructor Generate(Tmr: TTimer; back: timage; form: tcustomform);

destructor Gone;

//простейшие дествия: есть, передвинуться, родить,

//умереть

procedure AllowSimpleAction;

//добавляет организм в случайную клетку, если Father = nil

//и рядом с организмом, если Father <> nil

function GiveLifeTo(Who: TKindOfOrganism;

Father: Pointer): TPositionInGrid;

procedure DeleteCreature(ItsName: string);

rivate

//нужны тока для формирования имен объектов

//и не отражают реальное количество рыб

Fishes: integer;

Predators: integer;

public

end;

var

fl: PFlora = nil;

cr: PCreature = nil;

kf: PKindFish = nil;

pr: PPredator = nil;

implementation

constructor TMaster.Generate(tmr: ttimer; back:timage; form: tcustomform);

var i,j,k: integer;

foodOnStart: integer;

pos: tpositioningrid;

egin

floragrowing:= true;

f:=form;

CreatList:= TList.Create;

Fishes:= 0;

Predators:= 0;

timer:= tmr;

timer.enabled:= true;

world:= back;

timeover:= 0;

turnsover:= 0;

//генерим сетку

randomize;

foodOnStart:= 6000;

new(gridd);

for i:=1 to XLIM do

for j:=1 to YLIM do begin

gridd[i,j].FoodQuantity:= 0;

gridd[i,j].IsVacant:= true;

gridd[i,j].WhoInCell:= NONE;

//приведение к типу PFlora

gridd[i,j].Flora:= pflora(gridd[i,j].Flora);

gridd[i,j].Flora:= nil;

end;

while foodonstart > 0 do

begin

pos:= GiveLifeTo(FLORA, nil);

foodonstart:= foodonstart - Gridd[pos.x, pos.y].FoodQuantity;

end;

//помещаем куда-нибудь рыбку(и)

for k:=0 to 0 do

GiveLifeTo(KINDFISH, nil);

//то же самое с хищником

for k:=0 to 0 do

GiveLifeTo(PREDATOR, nil);

end;

//------------------------------------

destructor TMaster.Gone;

begin

creatList.free;

dispose(gridd);

end;

//--------------------------------------

procedure TMaster.DeleteCreature(ItsName: string);

var i: integer;

fl: pflora;

kf: pkindfish;

pr: ppredator;

egin

for i:=0 to creatList.Count-1 do

if creatList.Items[i]<>nil then

begin

fl:= creatList.Items[i];

if fl^.ClassName = 'TFlora' then

if fl^.itself.Name = ItsName then

begin

gridd[fl^.InGridX,fl^.InGridY].FoodQuantity:= 0;

gridd[fl^.InGridX,fl^.InGridY].flora:= nil;

fl^.Death;

dispose(creatList.Items[i]);

creatList.Items[i]:= nil;

exit;

end;

if fl^.ClassName = 'TKindFish' then

begin

kf:= creatList.Items[i];

if kf^.name = ItsName then

begin

kf^.Death;

dispose(creatList.Items[i]);

creatList.Items[i]:= nil;

exit;

end;

end;

if fl^.ClassName = 'TPredator' then

begin

pr:= creatList.Items[i];

if pr^.name = ItsName then

begin

pr^.Death;

dispose(creatList.Items[i]);

creatList.Items[i]:= nil;

exit;

end

end;

end; // if items[i] <> nil

end;

//------------------------------------

procedure TMaster.AllowSimpleAction;

{в этой процедуре происходит передвижение рыб на 2 пикселя,

если им надо двигаться, а также рождение, смерть, при этом

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

этой процедуры, а только если она находиться точно в клетке}

var

i,j: integer;

begin

for i:=0 to creatList.Count-1 do

if creatList.Items[i] <> nil then

if Pflora(creatList.Items[i]).className = 'TFlora' then

begin

fl:= creatList.Items[i];

if (TimeOver mod 8 = 0) then

fl^.Increase(FLORA_INCREASE);

if floragrowing = true then

if fl^.Health = MAXFLORA then

GiveLifeTo(FLORA, fl);

end;

for i:=0 to creatList.Count-1 do

if creatList.Items[i] <> nil then

if (Pcreature(creatList.Items[i]).className = 'TKindFish') then

begin

kf:= creatList.Items[i];

//если рыба ест

if (kf^.IsEating = true) then

begin

l:=kf^.Grid[kf^.ingridx,kf^.ingridy].Flora;

if fl<>nil then begin

//уменьшаем количество пищи

fl^.decrease(10);

if fl^.Health<=0 then

DeleteCreature(fl^.itself.Name);

//увеличиваем здоровье рыбы

kf^.Health:= kf^.Health + HEALTH_TO_INCREASE;

if kf^.Health>100 then kf^.Health:= 100;

end

end

else

//если не кушает, то двигается

kf^.MoveItself(2);

//рыба сама решает, есть или не есть

kf^.EatOrNotToEat;

//если здоровья < .. то начинает чувствовать голод

if kf^.Health < MaxHealth then

kf^.IsHungry:= true

else

kf^.IsHungry:= false;

//если рыба сытая (здоровье больше определенного уровня)

if kf^.Health > HEALTH_LIMIT then

//и если была сытая в прошлый раз

if kf^.WasHealthy = true then

//увеличиваем готовность к размножению

inc(kf^.HealthyTime)

else

//иначе сбрасываем его в ноль

kf^.HealthyTime:= 0;

//если созрела для размножения, то вперед

if kf^.HealthyTime >= DAYS_FOR_REPRODUCTION then

begin

GiveLifeTo(KINDFISH, kf);

kf^.HealthyTime:= 0;

end;

//если в этот раз здоровья > этого уровня

//засчитываем день как здоровый

if kf^.Health > HEALTH_LIMIT then

kf^.WasHealthy:= true;

if (TimeOver mod 8 = 0) then begin

//увеличиваем возраст

inc(kf^.age);

//если рыба не ест, уменьшаем ей здоровье

if kf^.IsEating = false then

kf^.Health:= kf^.Health - HEALTH_TO_DECREASE;

end;

//а если здоровьичка не осталось, или надоедает

//все уже 200 ходов, то отправляем к рыбному богу

if (kf^.Health <= 0)or(kf^.Age >= 200) then

DeleteCreature(kf^.Name);

end;

{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{}

{теперь разбираемся с хищниками}

for i:=0 to creatList.count-1 do

if creatList.Items[i] <> nil then

//если сейчас указатель на объекте "хищник"

if (Pcreature(creatList.Items[i]).className = 'TPredator') then

begin

pr:= creatList.Items[i];

if pr^.IsEating = true then

pr^.IsEating:= false;

//разрешаем хищнику двигаться

pr^.MoveItself(2);

if pr^.IsHungry = true then

begin

//если хищник на расстоянии броска (<= 32 пикселов)

//от какой-нить рыбки, то "сообщаем" ему и даем

//ему атаковать жертву. В общем, кердык ей.

for j:=0 to creatList.count-1 do

if creatList.Items[j] <> nil then

if (Pcreature(creatList.Items[j]).className = 'TKindFish') then

begin

kf:= creatList.Items[j];

if (abs(pr^.InImgX-kf^.InImgX)<=32)and(abs(pr^.InImgY-kf^.InImgY)<=32) then

begin

pr^.attack(kf^);

pr^.Health:= pr^.Health + kf^.Health;

if pr^.health > MAXHEALTH then

pr^.health:= MAXHEALTH;

pr^.IsHungry:= false;

DeleteCreature(kf^.Name);

break;

end

end;

end;//if hungry = true

//если здоровья < .. то начинает чувствовать голод

if pr^.Health < MaxHealth then

pr^.IsHungry:= true

else

pr^.IsHungry:= false;

//если рыба сытая (здоровье больше определенного уровня)

if pr^.Health > HEALTH_LIMIT - 20 then

//и если была сытая в прошлый раз

if pr^.WasHealthy = true then

//увеличиваем готовность к размножению

inc(pr^.HealthyTime)

else

//иначе сбрасываем его в ноль

pr^.HealthyTime:= 0;

//если созрела для размножения, то вперед

if pr^.HealthyTime >= DAYS_FOR_REPRODUCTION then

begin

GiveLifeTo(PREDATOR, pr);

pr^.HealthyTime:= 0;

end;

//если в этот раз здоровья > этого уровня

//засчитываем день как здоровый

if pr^.Health > HEALTH_LIMIT then

pr^.WasHealthy:= true;

if (TimeOver mod 8 = 0) then begin

//увеличиваем возраст

inc(pr^.age);

//уменьшаем здоровье

if (pr^.IsEating=false)then

pr^.Health:= pr^.Health - HEALTH_TO_DECREASE;

end;

//а если здоровьичка не осталось, или надоедает

//все уже 200 ходов, то отправляем к рыбному богу

if (pr^.Health <= 0)or(pr^.Age >= 200) then

DeleteCreature(pr^.Name);

end;//if 'Predator'

inc(TimeOver);

if (TimeOver mod 8 = 0) then inc(TurnsOver);

end;

//---------------------------------------------

function TMaster.GiveLifeTo(Who: TKindOfOrganism;

Father: Pointer): TPositionInGrid;

var i,j: integer;

newfl, fl: Pflora;

newkf, kf: Pkindfish;

newpr, pr: Ppredator;

begin

randomize;

if who = PREDATOR then

if Father = nil then

begin

inc(Predators);

repeat

i:=random(XLIM)+1;

j:=random(YLIM)+1;

until gridd[i,j].IsVacant=true;

new(newpr);

newpr^:= tpredator.Born(i,j,'Chicotillo'+inttostr(Predators), world, f);

newpr^.Grid:= gridd;

gridd[i,j].IsVacant:=false;

gridd[i,j].WhoInCell:= PREDATOR;

CreatList.Add(newpr);

result.x:= newpr^.InGridX;

result.y:= newpr^.InGridY;

exit;

end

else

begin

pr:= Father;

for i:=pr^.InGridX - 1 to pr^.InGridX + 1 do

for j:=pr^.InGridY - 1 to pr^.InGridY + 1 do

//поиск только внутри сетки

if (i>0)and(j>0)and(i<=XLIM)and(j<=YLIM)and

//и если эта клетка не с самим беременным хищником

((i<>pr^.InGridX)or(j<>pr^.InGridY)) then

//и если эта клетка не занята

if Gridd[i,j].IsVacant = true then

begin

inc(Predators);

Gridd[i,j].IsVacant:= false;

gridd[i,j].WhoInCell:= PREDATOR;

new(newpr);

newpr^:= TPredator.Born(i,j, 'Son of ' + pr^.name, world, f);

newpr^.Grid:= gridd;

CreatList.Add(newpr);

result.x:= newpr^.InGridX;

result.y:= newpr^.InGridY;

exit;

end;

end;

/////////////////////////////////

if who = KINDFISH then

if Father = nil then

begin

inc(Fishes);

repeat

i:=random(XLIM)+1;

j:=random(YLIM)+1;

until gridd[i,j].IsVacant=true;

new(newkf);

newkf^:= TKindFish.Born(i,j,'Victim'+inttostr(Fishes), world,f);

newkf^.Grid:= gridd;

gridd[i,j].IsVacant:=false;

gridd[i,j].WhoInCell:= KINDFISH;

CreatList.Add(newkf);

result.x:= newkf^.InGridX;

result.y:= newkf^.InGridY;

exit;

end

else

begin

kf:= Father;

for i:=kf^.InGridX - 1 to kf^.InGridX + 1 do

for j:=kf^.InGridY - 1 to kf^.InGridY + 1 do

//поиск только внутри сетки

if (i>0)and(j>0)and(i<=XLIM)and(j<=YLIM)and

//и если эта клетка не с самим беременным хищником

((i<>kf^.InGridX)or(j<>kf^.InGridY)) then

//и если эта клетка не занята

if Gridd[i,j].IsVacant = true then

begin

inc(Fishes);

Gridd[i,j].IsVacant:= false;

gridd[i,j].WhoInCell:= KINDFISH;

new(newkf);

newkf^:= TKindFish.Born(i,j,'Son of' + kf^.Name, world,f);

newkf^.Grid:= gridd;

CreatList.Add(newkf);

result.x:= newkf^.InGridX;

result.y:= newkf^.InGridY;

exit;

end;

end;

//////////////////////////////

if who = FLORA then

if Father = nil then

begin

repeat

i:= random(XLIM-1)+1;

j:= random(YLIM-1)+1;

until gridd[i,j].FoodQuantity = 0 ;

Gridd[i,j].FoodQuantity:= random(100)+80;

new(newfl);

newfl^:= TFlora.GrowUp(i,j, world,f, gridd[i,j].FoodQuantity);

newfl^.Grid:= gridd;

Gridd[i,j].Flora:= newfl;

CreatList.Add(newfl);

result.x:= newfl^.InGridX;

result.y:= newfl^.InGridY;

exit;

end

else

begin

fl:= Father;

//размещаем новую пищу около созревшего растения

for i:=fl^.InGridX - 1 to fl^.InGridX + 1 do

for j:=fl^.InGridY - 1 to fl^.InGridY + 1 do

//поиск только внутри сетки

if (i>0)and(j>0)and(i<=XLIM)and(j<=YLIM)and

//и если эта клетка не с созревшим растением

((i<>fl^.InGridX)or(j<>fl^.InGridY)) then

//и если эта клетка без растений

if Gridd[i,j].FoodQuantity = 0 then

if random(30) < 1 then

begin

Gridd[i,j].FoodQuantity:= 1;

new(newfl);

newfl^:= TFlora.GrowUp(i,j, world,f, Gridd[i,j].FoodQuantity);

newfl^.Grid:= gridd;

Gridd[i,j].Flora:= newfl;

CreatList.Add(newfl);

result.x:= newfl^.InGridX;

result.y:= newfl^.InGridY;

end;

end;

end;

end.


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

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

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

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

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

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

    отчет по практике [1,3 M], добавлен 11.04.2019

  • Агентно-ориентированная программная архитектура систем обработки потоковых данных. Обеспечение гибкости и живучести программного обеспечения распределенных информационно-управляющих систем. Спецификации программных комплексов распределенной обработки.

    реферат [1,1 M], добавлен 28.11.2015

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

    контрольная работа [606,0 K], добавлен 28.10.2010

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

    курсовая работа [164,8 K], добавлен 18.12.2011

  • Понятие, основные задачи и функции общей теории систем как науки. Формулирование требований к системе, разработка концептуальной модели системы на примере системы массового обслуживания (СМО). Проектирование имитационной модели, ее реализация и испытание.

    курсовая работа [131,3 K], добавлен 27.12.2010

  • Моделирование вариантов объектно-ориентированных программных систем. Проектирование статический структуры, интерфейса, диаграмм компонентов и архитектуры приложения для разработки имитационной модели информационной системы "Центр обслуживания абонентов".

    дипломная работа [951,4 K], добавлен 24.10.2010

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

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

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

    курсовая работа [388,8 K], добавлен 17.11.2011

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