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