Участие в разработке компонентов игрового программного продукта. Отчет по практике. Информационное обеспечение, программирование.

Участие в разработке компонентов игрового программного продукта. Отчет по практике. Информационное обеспечение, программирование.




👉🏻👉🏻👉🏻 ВСЯ ИНФОРМАЦИЯ ДОСТУПНА ЗДЕСЬ ЖМИТЕ 👈🏻👈🏻👈🏻


























































Информационное обеспечение, программирование

Вы можете узнать стоимость помощи в написании студенческой работы.


Помощь в написании работы, которую точно примут!

Похожие работы на - Участие в разработке компонентов игрового программного продукта

Скачать Скачать документ
Информация о работе Информация о работе

Нужна качественная работа без плагиата?

Не нашел материал для своей работы?


Поможем написать качественную работу Без плагиата!

Федеральное
государственное образовательное учреждение высшего профессионального
образования


“Мурманский
государственный технический университет“


по
производственно-технологической практике


Место
прохождения практики: ООО «Игровые системы»


Тема: Участие
в разработке компонентов игрового программного продукта






студентки Дмитриевой Нино Самсоновны


Руководитель практики Лазарева И.М.






.1 Сведения о предприятии ООО
«Игровые системы»


.2 Описание общих технических
характеристик аппаратных комплексов


.3 Обзор используемого
системного и прикладного программного обеспечения


.6 Описание существующей
компьютерной сети


.7 Описание использования
сети Internet


.3 Описание тестов и оценка
качества программного продукта


Компания ООО «Игровые системы» была организована в начале 2010 года.
Генеральный директор - Гуркин Дмитрий Викторович. Основным направлением
деятельности является профессиональная разработка игр для самого динамично
развивающегося рынка мобильных устройств - смартфонов и планшетов на базе iOS Apple, WindowsPhone и Android. В цикл работы входят все стадии
разработки игры, начиная с создания ее концепции, сценария, отрисовки
графического контента, программирования, тестирования и заканчивая поддержкой
пользователей после выпуска приложения.




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


a.      Процессор 2.4 ГГц Intel Core 2 Duo


2.     Все модели из линейки Apple iPad


.       Все модели из линейки Apple iPod


1.     Windows-совместимое оборудование


b.     Графика NVIDIA GeForce GT X


2.     Множество устройств на платформе Android


1.     Windows-совместимое оборудование


b.     Графика NVIDIA GeForce GT X


2.     Устройства на платформе WindowsPhone


1.     Операционная система: Mac OS X


.       Программные пакеты: iPhone SDK


.       Офисные пакеты: Libre Office, Neo Office


1.     Операционная система: Windows XP, 7


.       Программные пакеты: NDK, Android SDK


.       Среда разработки: Eclipse, IDEA


.       Офисные пакеты: Open Office, Microsoft Office


1.     Операционная система: Windows XP, 7


.       Программные пакеты: WinPhone SDK, Silverlight


.       Среда разработки: Microsoft VisualStudio


.       Офисные пакеты: Open Office, Microsoft Office


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




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









Рис. 1. Функциональная модель предприятия




Рис. 2. Функциональная модель
подразделения разработки







Рис. 3. Информационная модель предприятия




Для организации компьютерной сети используется роутер, к которому
подключены три сетевых коммутатора, обеспечивающие локальную сеть для всех
рабочих станций компании. Кроме того, к роутеру подключена точка доступа,
которая в свою очередь связана с тремя wi-fi точками,
обеспечивающими сеть Интернет. Интернет поставляется в два канала.







1.7 Описание использования сети Internet




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







Для качественной реализации задачи был проведен анализ экономической
составляющей игры, или игрового баланса. В качестве программного продукта
выступает так называемый «сити-билдер», то есть приложение, основной игровой
процесс которого заключается в построении различных зданий и объектов на карте
и затем взаимодействие с ними. Например, некоторые здания каждый интервал
времени производят такой ресурс как деньги и население, а также пользователь
может заключить контракт со зданием на производство различных продуктов. Каждое
здание выполняет данное ему задание за определенное время, по истечении
которого над ним появляется метка, указывающая на возможность собрать готовый
продукт. Требуется реализовать механизм одновременного сбора сразу нескольких
ресурсов. Иллюстрация к трем типам ресурсов, изготовляемых зданиями:




Рис. 4. Три типа ресурсов, производимых в игре




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


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

Ограничением является
количество ресурсов на складе. Допустим, вместимость склада M.
На момент сбора продуктов на складе уже лежит N элементов.
Тогда можно собрать всего M-N шт. Пример сообщения о переполнении склада:

Решение проблем с
превышением ограничения

Если количество готового к
сбору продукта превышает M-N, то на склад кладутся элементы с наибольшей ценой
продажи.

При сборе очередного
продукта добавляется такой пользовательский атрибут как Опыт.

Каждое здание производит
определенное количество населения в зависимости от типа и уровня. При сборе
данный элемент добавляется к такому атрибуту игрока, как Население. Атрибут
иллюстрируется баром:

Ограничением является
максимально возможное количество населения на данном уровне.  Допустим, максимум равен M. На момент
сбора населения его сумма уже равна N. Тогда можно собрать всего M-N.

Решение проблем с
превышением ограничения

Если количество готового к
сбору населения превышает M-N, то берется только возможное число. Причем,
возможна такая ситуация: со здания можно собрать P населения,
но до максимума всего P-2, тогда со здания снимается P-2
населения, а 2 остается висеть в метке до следующего сбора.

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

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







Таблица 5. Основные составляющие окна


Декоративный заголовок с
информацией для игрока

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

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

Отрисовка фона окна состоит
из 3 частей: отрисовка верхних, нижних углов, центра.

Отображает все собираемые
ресурсы с прокруткой. В таблице каждый ресурс представлен изображением с
подписью о собираемом количестве. Причем ресурсы одного типа должны показываться
одним элементом с суммированным показателем их количества. Например, пусть
собирается M денег, N продукта одного типа с
первого здания и P продукта такого же типа, но с другого здания. Тогда
в таблице должно присутствовать всего два элемента: изображение денег с
подписью M и изображение продукта с подписью K,
где К = N+P.

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


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




В процессе создания программного компонента требуется реализовать
визуальный интерфейс и алгоритм работы разрабатываемого модуля. Средой
разработки является Xcode, платформа iOS, используемое API Cocoa. Кроме того, для организации анимаций и части
интерфейса в игровой проект внедрен движок Cocos2d-iphone.


Окно запускается из панели на главном экране. На
данной панели при выполнении определенных условий появляется картинка, при
клике на которую пользователь запустит открытие окна. В качестве условий
берется некое количество готовых элементов каждого типа, например: должно быть
готово к сбору n ресурсов-денег, m ресурсов типа продукт, p ресурсов населения.
При подсчете каждого из них следует учитывать ограничения по населению и
складу. Таким образом, первой задачей является поиск возможности контролировать
количество готовых продуктов и отслеживать его изменение. Платформа разработки
позволяет сделать это двумя способами. Первый способ: посекундный пересчет
готовых ресурсов в режиме запущенной игры. Второй способ: использование такого
компонента Objective-C как NSNotificationCenter, механизма передачи
уведомлений. Регистрация и получение уведомления будет происходить в классе
MainPanel.m, а отправляться они будут в нескольких классах, в которых
происходит изменение текущего состояния готовности продукта. Каждый раз, когда
уведомление отлавливается, происходит проверка условий для появления кнопки
запуска окна в панели. Например, выполнился контракт на получение населения,
отправилось уведомление, оно было поймано, и тут же происходит пересчет всех
готовых ресурсов для проверки удовлетворения условиям.


Уведомления будет принимать класс MainPanel.m. Для этого зарегистрируем его в центре уведомлений в момент,
когда инициализируется класс:


[[NSNotificationCenter defaultCenter]
addObserver:self selector:@selector(onShowCollectAllButton:)
name:NOTIFY_DROP_ITEM_DROPPED object:nil]; bserver - это объект, который будет принимать уведомление. В
данном случае текущий класс MainPanel.m.- это метод, который будет вызван в
момент приема уведомления. В данном случае метод, который запускает проверку
условий для появления окна. - имя уведомления. - это объект, который отправил
уведомление (на тот случай, если нужно получать это уведомление от конкретных
объектов).


Отправляться уведомления будут в нескольких классах:
[[NSNotificationCenter defaultCenter] postNotification
name:NOTIFY_DROP_ITEM_DROPPED object:nil];


После получения уведомления требуется проверить три ресурса: деньги,
продукты и население:


.       Деньги: на деньги не накладываются никакие ограничения, поэтому
последовательно просматривая все здания на карте, которые их производят,
считаем здания с готовым ресурсом. Далее полученное число сравнивается с заданным
условием.


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


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


Если все три компонента выполняют условие, на панели появляется кнопка
запуска окна. Кнопка пульсирует, привлекая внимание игрока. Анимация
реализована с использование игрового движка Cocos2d-iphone.


Появление кнопки в правом нижнем углу отображено на рисунке 6:




Рис. 6. Отображение кнопки запуска окна




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


Ячейка состоит из изображения ресурса и его количества. Требуется отсортировать
все продукты по типу, сгруппировать их, таким образом определяя, каково их
количество для каждого типа. Кроме того, пользуясь файловой системой проекта
нужно подобрать соответствующее изображение. Для населения и денег всегда
берется одна и та же картинка, а для продуктов информация о нужном изображении
хранится в одной из переменных класса Resource.m. Так как данный
способ создания ячейки может быть использован еще в каких-либо таблицах с
наградой, специально был создан класс RewardNode.m.
После создания ячейки нужно организовать работу таблицы. Таблица
создается на основе такого механизма как CCScrollView, поэтому чтобы получить доступ к
некоторым методам этого класса, нужно наследовать основной класс CollectAll.m от скролла. CCScrollView класс принадлежит игровому движку cocos2d-iphone, который используется в приложении.
Так как функционал данного механизма все еще находится в разработке и он
является лишь контейнером для ячеек, для его правильной работы следует:


.       Добавить кнопки для прокрутки в обе стороны. Используются такие
данные как размер страницы прокрутки, размер всего контейнера и размер одной
ячейки, чтобы вручную указать, насколько сдвинется страница прокрутки
относительно всего его контейнера. Пример метода для прокрутки влево:




- (void)actionScrollLeft:(id)sender


{* rewardContainerScroll =
(CCScrollView*)[_buildernodeWithName:@"rewardContainerScroll"];cellWidth
= rewardContainerScroll.pageSize.width;


CGPoint pt = rewardContainerScroll.contentOffset;.x +=
cellWidth;.x = roundf(pt.x / (float)cellWidth);(pt.x > 0)


[rewardContainerScroll setContentOffset:pt animated:YES];


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


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


.       Отцентровать положение ячеек в контейнере, если их количество
меньше, чем вмещается на все поле прокрутки


В результате получаем контейнер CCScrollView с ячейками, изображенный на рисунке 7:




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


.       Деньги: происходит добавление полученного количества к атрибуту money из класса GameStat.m, а также метка над зданием изменяется с изображения готового
ресурса на картинку с изготавливающимся продуктом.


.       Продукты: все собранные продукты кладутся на склад, причем
одинаковые ресурсы складываются группами по 20 штук, метка над зданием меняется
на метку свободного здания. Кроме того, запускается анимация машинки, которая
отвозит ресурс на склад. Над машинкой указывается, какой ресурс она везет и его
количество.


.       Население: происходит добавление полученного количества к
атрибуту population. Метка над зданием меняется на метку
изготовления. Кроме того, учитывается такой вариант сбора, когда с
определенного здания собирается лишь часть населения, поэтому в метке над
зданием остается висеть еще n
населения.


После нажатия кнопки сбора должно измениться значение денежного атрибута
через класс GameStat.m, а также увеличиться счетчик сбора всех ресурсов за раз, так
как количество использований данного механизма сбора влияет на получение
пользователем игрового достижения, за которое дается награда. Кроме того, при
сборе ресурса с одиночного здания запускается звуковое сопровождение и на карте
появляется изображение полученных денег и опыта, но при сборе множества
продуктов такое количество анимации и работы с графикой может замедлить работу
приложения, поэтому нужно изменить алгоритм появления анимаций и звуков. Данные
алгоритмы являются частью игрового менеджера - DropItemManager.m, отвечающего за получение ресурсов, появления их на карте.


Классы, используемые в работе компонента:


Класс, контролирующий появление кнопки на игровой панели и ее анимацию.




Реализация некоторых методов класса Game:




- (BOOL)canCollectBuilding:(Building *)building
alert:(BOOL)alert


NSString *type = building.typeName;


int value = [building inCountToCollect];([type
isEqualToString:@"house"])


int population = [_gameStat valueForAttribute:ATTR_POPULATION];


int dropedPopulation = [self.map.dropItemManager
totalValueOfItemsWithType:DROP_ITEM_ATTRIBUTE name:@"population"];


int happiness = [_gameStat valueForAttribute:ATTR_HAPPINESS];


int v = (population + value + dropedPopulation) -
happiness;(((v > 0) && (v == value)) || (value - v) < 0 ||
![_gameStat canAddValue:(value - abs(v)) forAttribute:ATTR_POPULATION])


[Game showNotEnoughHapinessAlertForBuilding:building];


else if ([type isEqualToString:@"entertainment"])


if (![_gameStat canAddValue:value forAttribute:ATTR_MONEY1])


(void)collectBuilding:(Building*)building


NSString *type = building.typeName;*attribute = nil;([type
isEqualToString:BUILDING_TYPE_HOUSE])


[[Counters instance] updateWithType:TYPE_COLLECT_TIMES
subType:@"money1" addValue:1];


NSMutableArray *dropItems = [NSMutableArray
arrayWithCapacity:3];value = [building inCountToCollect];


if ([[building typeName] isEqualToString:BUILDING_TYPE_HOUSE])


int population = [_gameStat
valueForAttribute:ATTR_POPULATION];


int happiness = [_gameStat valueForAttribute:ATTR_HAPPINESS];


int dropedPopulation = [self.map.dropItemManager
totalValueOfItemsWithType:DROP_ITEM_ATTRIBUTE name:@"population"];


int v = - happiness + (population + value +
dropedPopulation);(v > 0)


}([_gameStat canAddValue:value forAttribute:attribute])


DropItem *item = [[[DropItem alloc] initWithMap:building.map
attribute:attribute count:value] autorelease];


}exp = [building valueForParam:@"in_exp"];


DropItem *xpItem = [[[DropItem alloc]
initWithMap:building.map attribute:ATTR_EXP count:exp] autorelease];


[dropItems addObject:xpItem];*bonus = [Bonus
bonusByName:@"bonus_collect"];


[dropItems addObjectsFromArray:[bonus apply]];([Game
game].collectAllMode) // do not show drop when CollectAll


[building.map.dropItemManager applyInvisibleDrops:dropItems];


[building.map.dropItemManager dropItems:dropItems
atObject:building];


[[Counters instance] addValue:1
forCounter:@"count_collect_times"];


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




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




Класс, отвечающий за создание ячейки в таблице.




Организация окна, таблицы.
Запуск алгоритма сбора.

Подсчет выходных атрибутов
при сборе: опыт, население, продукты. Суммирование элементов для отрисовки в
ячейке таблицы.

Проверка условий для
появления кнопки запуска окна.

Реализация некоторых методов класса CollectAll:







NSInteger compareContractsCost(Building* building1, Building*
building2, void *context){*contract1 =
((FactoryBuilding*)building1).contractInProgress;


Contract *contract2 =
((FactoryBuilding*)building2).contractInProgress;*res1 = [Resource
resourceByCode:[contract1 outResource]];


Resource *res2 = [Resource resourceByCode:[contract2
outResource]];(res1.sellMoney1 != res2.sellMoney1)


return -(res1.sellMoney1 - res2.sellMoney1);


(int)xpForContract:(FactoryBuilding*)factoryBuilding


Contract *contract = factoryBuilding.contractInProgress;


(int)xpForAllContracts:(NSArray*)buildingsWithContracts


int allXp = 0;(int i = 0; i <
buildingsWithContracts.count; i++)


allXp += [self
xpForContract:(FactoryBuilding*)[buildingsWithContracts objectAtIndex:i]];


 NSMutableArray *result = [NSMutableArray array];


 NSMutableArray *buildingsWithReadyContract = [NSMutableArray
array];


 int freeWarehouseSpace = [[Game game].resourcesManager
freeSpace];*map = [Game game].map;


 for (Building *building in [map allBuildings]) {*type =
building.typeName;([type
isEqualToString:@"factory"])([(FactoryBuilding*)building
canCollectContract])


 [buildingsWithReadyContract addObject:building];


 }(buildingsWithReadyContract.count > freeWarehouseSpace)
// if there is no so much space in warehouse


 [buildingsWithReadyContract
sortUsingFunction:compareContractsCost context:nil];(int i = 0; i < freeWarehouseSpace;
i++)


 [result addObject:[buildingsWithReadyContract
objectAtIndex:i]];


 [result addObjectsFromArray:buildingsWithReadyContract];


 }result; // buildings, which contracts can be added to
warehouse


2.3 Описание тестов и оценка качества программного продукта


программный
игровой компьютерный визуальный


Игровой продукт написан для планшетов Apple iPad, поэтому тестирование проводилось на всех устройствах
этой линейки, так как каждый из них использует различную версию платформы iOS.


Требуется проверить несколько аспектов работы компонента:


.       Производительность приложения во время работы компонента:
основным показателем является такая характеристика как кадровая частота, или FPS(Frame Per Second) планшета. Под кадровой частотой понимается частота,
генерируемая самой игрой в зависимости от ресурсов устройства и необходимости
передачи движений разной интенсивности. Так как сбор сразу нескольких ресурсов
запускает много анимаций, кадровая частота может уменьшаться. Во время тестирования
FPS не опускался ниже среднего
показателя 25, что является неплохим показателем.


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







По итогам прохождения производственно-технологической практики я
ознакомилась с платформой iOS, API Cocoa, языком программирования Objective-C и его парадигмами, а также с игровым движком Cocos2d-iphone. Кроме
того, был проведен анализ экономической составляющей игры, совместная работа с
отделом тестирования позволила выявить слабые места и ошибки приложения, и в
итоге разработан компонент программного продукта, удовлетворяющий заявленным
требованиям:


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


.       Механизм сбора функционирует корректно


.       Производительность игры остается на высоком уровне


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


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


.       Реализация возможности выбора, какие ресурсы собирать, а какие
оставить в готовом состоянии


.       Логгирование на сервер изменения денежного атрибута


.       Оптимизация анимации с целью ее добавления без потери
производительности


.       Оптимизация кода для уменьшения используемого объема памяти







1.     Хиллегаас,
А. Objective-C. Программирование для iOs и MacOs.
- М: Питер, 2010. - 304 с.


.       Кочан,
С. Изучаем iOS программирование. - М: Орейли, 2012.
- 428 с.


.       Иттерхейм,
С. Изучаем создание игр с использованием Cocos2d. -
М: Апресс, 2011 - 218 с.






Похожие работы на - Участие в разработке компонентов игрового программного продукта Отчет по практике. Информационное обеспечение, программирование.
Практическая Работа Дизайн
Курсовая работа по теме Проблемы реформирования местного самоуправления
Эссе по теме Поездка в метро как социальный опыт
Магазин Курсовых
Реферат: View From The Bridge 2 Essay Research
Реферат: Міжнародні договори України а питань трудової діяльності та соціального захисту працівників
Как Могу Писать Сочинение Со Смыслом
Реферат На Тему Организм Человека Как Сложная Диссипативная Система
Реферат по теме Президент США Ж. Кенедди (1961-63)
Реферат: Современный рационализм
Курсовая работа по теме Міжнародний кредит, його форма і використання в Україні
Реферат: Juvenile Justice System In England And Wales
Что Такое Настоящая Любовь Сочинение Итоговое
Контрольная Работа По Русскому Словосочетания
Эссе По Английскому 11 Класс Готовые
Реферат: Уголовный закон понятие, толкование, действие в пространстве и во времени
Темы Курсовых Работ По Скд
Итоговое Выпускное Сочинение
Курсовая работа: Интеллектуальная собственность и проблемы ее реализации
Почему Лиза Полюбила Эраста Сочинение
Реферат: Invisible Man Essay Research Paper Paper
Похожие работы на - Анализ рисков для девелоперской компании 'Ластея-Арт', работающей на рынке недвижимости
Похожие работы на - Функциональная подсистема системы менеджмента

Report Page