Характеристика
|
Наименование
|
Операционная система.
|
Windows XP,
Vista, 7, 8/8.1, 10
|
Процессор
|
Intel Core 2 Duo
|
Оперативная память.
|
1 Гб О.З.У.
|
Место на диске
|
50 МБ
|
DirectX
|
9.0
|
Видео карта
|
128 МБ Видео Памяти
|
Необходимое П.О.:
Для работы и установки приложения на целевой машине требуется установка JavaMechine для корректной работы и
взаимодействия с библиотеками Java.
Выбор интерфейса:
) Интерфейс должен отображать информацию о каждом шаге для
пояснения и разбора проделанных действий.. Номер шага. Информация необходимая
для представления о количестве проделанных шагов и о общем их количестве.. Информация
о действии. Поле, в котором отражаются текст о проделанном шаге.. Информация
о виде алгоритма визуализированного. Текст поле о выбранном виде сортировки для
корректного представления о переданной информации.
) Интерфейс должен включать кнопки для управления процессом
визуализации и отправления команд от пользователя(«Next», «Play»,
«Prev»).
) Присутствие интерфейса для добавления в массив объектов новых
элементов(поле Edit, Text, Button).
) Начальное меню запуска. Меню для запуска отдельных функций:
Информация(«Info»).
Перейди на главный экран.(«Start»).
Закончить работу приложения(«Quit»).
Изменить настройки запуска.(«Option»).
.3 Выбор инструментальных средств разработки
Для разработки программного проекта было использован инструмент,
предоставляемый с SDKJMankeyEngineдля
разработки классов управления. Так же был использован стандартные средства JMankeyEngineдля разработки интерфейса XML.
2.4 Выбор используемого типового алгоритма визуализации
Для решения задачи предоставляемым программным проектом был выбран
алгоритм «Планирование». Данный алгоритм позволяет осуществить простое
переключение между состояниями сортировок записанных в массиве состояний. Так
же это позволит хранить информацию о каждом шаге и генерировать её на этапе
установки или добавления новых элементов в массив объектов.
2.5 Проектирование иерархии классов
Раздел отвечающий за представление о проектировании классов в общем
процессе разработки.
Рис.9. Класс «ArrayOfCube»
Класс «ArrayOfCube», отвечающий за хранение
определенного состояния. Содержит члены необходимые для реализации данной
функциональности.
Класс «ConstraintArray», отвечающий за хранение состояний,
которые являются объектами класса «ArrayOfCube». Содержит члены необходимые для реализации данной
функциональности.
Более точное описание находиться в Приложении Ж.
Рис.10. Класс «ConstraintArray».
Более точное описание находиться в Приложении З.
2.6 Первичная разработка алгоритма работы программы
Запуск.
Приложение запускается и сразу попадает на страницу настройки, где
выбирается вариант разрешения экрана и графические настройки.
После выбора настроек приложение переключается на стартовый экран.
Рис.11. Начальный экран запуска.
Рис.12. Стартовый экран приложения.
Где предоставляется пользователю выбрать действия: Старт («Start»), Информация («Info»), Настройки(«Option»), Выйти («Quit»).
Основная часть.
После нажатия на кнопку «Старт»(Start) на стартовом экране приложение переключается на экран выбора алгоритма
сортировки.
Рис.13. Экран выбора сортировки.
На экране находиться варианты алгоритмов, стоит выбрать «Пузырьковый
метод сортировки» т.к. скорее всего остальные еще не поддерживаются.
Далее приложение попадает на главный экран приложения.
Рис.14. Главный экран приложения.
На экране расположен интерфейс взаимодействия, для диалога с
пользователем, так же рабочее пространство, в котором будет происходить все
действие.
Далее следует добавить на сцену и в массив элементов несколько элементов,
для содержания массива сортировки.
После добавления нужных нам элементов алгоритм работы программы
автоматически заполняет объект «ConstraintArray», который включает в себя массив элементов«ArrayOfCube».
После добавления элементом можно сразу переходить к шагам по массиву
состояний. Для этого можно воспользоваться: авто шаг(«Play»), шаг вперед(«Next»), шаг назад(«Prev»).
Завершение.
При нажатии на клавишу «Esc»
происходит выход на начальный экран. Перед завершением программы можно
посмотреть количество раз просматриваемых алгоритмов. При нажатии на кнопку
выхода(«Quit») произойдет выход из приложения и
потеря всей информации.
3. Реализация ПП
Конечная реализация программного продукта представлена это программа
решающая задачу и взаимодействующая с пользователем по средствам интерфейса
приложения.
.1 Особенности реализации системы
К особенностям реализации следовало бы отнести особый вид
программирования. Программирование, в основе которого лежит взаимодействие с
игровым движком.
Рис.15. Цикл работы игрового движка.
Процесс работы жизненного цикла «Initialization» . Заключается в начальной установке
объектов и инициализации переменных. Чаще всего используется для установки
объектов дальнейшего использования, но в зависимости от типа инициализируемого
объекта(в котором запущен Initialization).
Процесс работы жизненного цикла «Programinput». Заключается в считывании
информации с полей «input» и
клавиатуры.
Процесс работы жизненного цикла «Update». Заключается в постоянном обновлении состояния
программы, что позволяет реагировать на действия пользователя и изменение
переменных. Фактически данный процесс осуществляет весь процесс взаимодействия,
т.к. в нем есть и скрытые действия, т.е. действия наследуемые от супер класса.
Процесс работы жизненного цикла «Render». Заключается в отрисовке статичных объектов которые
были заданы в инициализации, так же он отвечает за отрисовку вследствие
изменений, произведенных в «Update».
Процесс работы жизненного цикла «Shutdown». Заключается в удалении и
сохранении переменных и временной информации для дальнейшего использования в
следующем запуске.
3.2 Реализация визуализации простейшего алгоритма
Создание алгоритма визуализации подразумевает разработку метода
заполняющего массив состояний, который хранит внутри себя историю перемещений
во время визуализации сортировки.
В качестве массива для хранения был разработан класс «ConstraintArray».
Внутри себя он содержит члены для хранения информации о состояниях, а так же
массив содержащий элементы класса «ArrayOfCube», который содержит информацию об определенном состоянии. Так
же «ConstraintArray» содержит метод, отвечающий за заполнение массива
состояний. Пояснение разработанного алгоритма заполнения и его блок схема
приведен в Приложении А. Код класса «ConstraintArray» приведен в Приложении Б.
Код класса «ArrayOfCube» приведен в Приложении В.
Для отображения элементов на сцене был разработан класс «MyBox», который содержит члены, отвечающие
за создание и хранение элемента сцены. Каждый элемент этого класса так же
содержит и определенное значение, относительно которого происходит сортировка.
Код класса «MyBox» приведен в Приложении Г.
Вся логика отображения сцены записана в классе-контроллере «MyStartScreen»,
который наследуется от класса «AbstractAppState» и принадлежит к классам
«ScreenController», что позволяет получить доступ к нему из XML-файла, для реализации кнопок и
других интерактивных действий во время выполнения приложения. Сам же код XMLфайла приведен в Приложении Е. Код
класса «MyStartScreen» приведен в Приложении Д.
3.3 Выделение типового приема визуализации
Типовой прием заключается в использовании приема «Планирование» и
основного принципа построения состояний через перенос и смещение.
Построение состояния заключается:
) Создать состояние из предыдущего.
) Сделать изменение
согласно алгоритму.. Найти необходимый элемент перемещения.. Переместить
по координате у(вертикально).. Переместить по координате х (в право).. Переместить
по координате z (на нас).. Сделать изменения согласно цвету.. Переместить
контроллер.
) Увеличить количество
сделанных шагов.
) Вернуться.
.4 Разработка интерфейса программы
Разработка интерфейса проводилась во встроенном редакторе движка с
помощьюXML разметки.
При разработке интерфейса был использован инструмент предоставляемый
непосредственно с движком.
Всего было сформировано 3 XML
экрана:
) Стартовый экран.
) Выбор алгоритма сортировки.
) Главный экран отвечающий за основной алгоритм работы программы,
а именно реализация визуализации сортировки.
Далее приведено описание каждого из экранов.
Стартовый экран.
Разработка данного элемента интерфейса происходила из необходимых функций
начального экрана. Вначале был создан начальный шаблон, реализующий примерное
расположение.
Следующим шагом был сделан конечный вид, который включает в себя надписи
(Text), кнопки (Button). Экран был разделен на 3 панели. Верхняя панель была
отдана названию приложения с визуальным эффектом выпада из верхней области. В
средней панели расположена информация о разработчике и служебная информация.
Нижняя панель отвечает за четыре кнопки взаимодействия с объектом.
Выбор алгоритма сортировки.
Разработка данного элемента осуществлялось из необходимости разделять
каждый из сортировок в отдельные сцены.
В течении разработки был сформирован шаблон для начального расположения
данных. Далее были добавлены панели для разделения и корректного расположения
кнопок. Каждой кнопке своя панель, чтобы кнопки не соприкасались.
Главный экран.
Разработка данного элемента осуществлялась из требований, обговоренных с
заказчиком.
В течении разработки был добавлен шаблон для расположения элементов GUI. Данное расположение позволило
поделить горизонтальную часть для расположения элементов.
Следующим шагом был создан набор панелей для вертикального расположения
относительно каждого столбца. Каждая панель не обязательно должна совпадать с
другой по размеру. Для введения функциональности в главный экран было добавлены
в ХМL файл контроллеры в виде кнопок:
· «Next» - перейти к следующему состоянию.
· «Play» -
переключить на авто шаг.
· «Prev» - перейти к
предыдущему состоянию.
· «AddBox» - добавить
новый элемент сортировки.
Добавлены элементы текстового поля ввода:
· «TextInfo» - поле, отвечающее за информацию о
состоянии сортировки.
· «TextAddBox» -
поле, отвечающее за ввод информации, а именно за значение объекта сортировки.
Добавлены элементы текстового поля:
· «Editvalue:» - текст поле для информации о
расположении поля ввода.
· «Label_Condition» - поле для отображения текущем номере шаге
из максимального их количества.
Разработка контроллера экранов.
Для управления экранами был создан контроллер, который запускает методы,
которые записаны в его теле класса. Вызов методов выполняется при нажатии
кнопок на GUI интерфейсе. Контроллер наследует «SimpleAplication», что позволяет ему получить доступ
к полям «app»(ссылка на приложение), nifity(ссылка на GUI интерфейс), однако следует убедиться что они будут
переданы и присвоить эти значения в конструкторе. Фактически контроллер это тот
же Main-файл, но который присоединен к
локальному узлу, который можно будет отсоединить при необходимости. Таким
образом, мы можем разделить всю программу на разные локальные файлы.
4. Тестирование П.П.
Тестирование проводиться с целью выявления отсутствия ошибок в основном
алгоритме программы. Обычно проходит на заранее подготовленном наборе тестов,
которые составлены с разработчиком, либо самим разработчиком.
.1 Методика тестирования правильности работы П.О.
Тестирование должно происходить для данного программного продукта с
набором чисел, а именно: 5, 4, 1, 3, 2.
Рис 16. Начальное состояние объектов.
) Начальное состояние все кубы на своих начальных местах.
) Алгоритм последовательным перебором находит минимальный элемент. На
начальном шаге он равен первому элементу.
) Сравнивание последовательно находит минимальный элемент (1).
) Перенос «1» в начало со смешением для освобождения места под целевой
элемент.
Рис 17. Состояние первый шаг.
Рис 18. Состояние второй шаг.
) Следующий шаг. Алгоритм находит минимальный элемент из не
отсортированной части (2).
) Перенос «2» в конец отсортированной части.
) Следующий шаг. Алгоритм находит минимальный элемент из не
отсортированных элементов (3).
) Перенос «3» в конец отсортированной части.
Рис.19. Состояние третьего шага.
) Следующий шаг. Алгоритм находит минимальный элемент из не
отсортированных элементов (4).
Рис.20. Состояние пред последнее.
) Алгоритм находит минимальный, и это оказывается последний и
единственный элемент из не отсортированной части. Следовательно, перенос не
требуется.
Рис 21. Состояние конца сортировки.
) Сортировка завершена.
.2 Целевое тестирование
Целевое тестирование должно проходить непосредственно на возможных
пользователях. В качестве пользователя был выбран обычный студент кафедры АВТ.
Целью данного тестирования является выявление реакции на данный продукт.
4.3 Результаты тестирования
В результате тестирования было получены результаты:
) Алгоритм корректно работает с набором чисел:. 5, 4, 1, 3, 2.. 1,3,2,4.
c. 1.
) Выполнение программы корректно на протяжении всего цикла.
) Целевое тестирование на студенте выявило что:
«Результат не был достаточным и дальнейшая подкрутка графики и
визуального оформления может исправить этот недостаток».
визуализация программа алгоритм
5. Внедрение П.П.
Внедрение будет производиться на кафедре АВТ. для использования в
процессе обучения. Программный продукт не будет использоваться всеми
преподавателями, а лишь изъявившими желание.
.1 Руководство пользователя
Набор инструкций для овладения данной программой.
1. Стартовый экран.
Данный экран имеет четыре управляющих компонента.
) Для того, чтобы перейти к выбору алгоритма сортировки нажмите
кнопку «Start».
) Для того чтобы получить информацию о пользователе и информацию
собираемую в процессе работы программы нажмите «Info».
) Для того чтобы изменить настройки экрана и приложения нажмите на
кнопку «Option».
) Для того чтобы выйти из приложения нажмите на кнопку «Quit».
. Экран выбора сортировки.
Данный экран имеет три управляющих компонента.
) Для выбора «Пузырьковой сортировки» нажмите на кнопку «BubbleSort»
) Для выбора «Сортировки Шелла» нажмите на кнопку
«ShellSort».
) Для выбора «Сортировки Хоара» нажмите на кнопку
«QuickSort».
. Главный экран.
Данный экран имеет четыре управляющих компонента.
) Чтобы добавить объект для сортировки . Введите число,
равное значению объекта( вес) который вы хотите добавить. Нажмите на кнопку
«AddBox».
) Чтобы запустить авто шаг нажмите на кнопку «Play».
) Чтобы перейти к следующему состоянию в ручном режиме нажмите на
кнопку «Next».
) Чтобы перейти к предыдущему состоянию в ручном режиме нажмите на
кнопку «Prev».
) Чтобы выйти из главного экрана на стартовый нажмите кнопку на
клавиатуре «Esc».
.2 Результаты опытной эксплуатации
В результате опытной эксплуатации была установлена программа на целевую
машину кафедры АВТ. Ошибок при установке обнаружено не было.
Результат использования на студентах будет известен после ряда изменений,
которым подвергнется интерфейс.
Заключение
На данный момент нет четких лидеров в области визуализации для обучения,
существуют небольшие объединения людей выпускающих программы нацеленные на
детей и на школьный возраст, однако на более взрослый контингент нет.
Следственно как цель можно занять эту нишу и предложить рынку достаточно
качественный продукт, однако, с другой направленностью, более широкой.
Необходимо создать программу, которую можно будет использовать непосредственно
в процессе обучения как замена, либо дополнение, нужно определить целевую
аудиторию и повысить время разработки.
Разработка визуализатора включает в себя анализ данных, проектирование
структуры программы, проектирование алгоритма программы, разработка
интерактивного интерфейса, тестирование и правка ошибок.
Анализ данных - процесс, включающий в себя изучение визуализируемого
метода, области реализации, инструментов для реализации. Данный процесс
занимает большое количество времени, если до этого момента анализируемые данные
и изучаемые инструменты были не знакомы.
Проектирование алгоритма программы - процесс занимающий большую часть
разработки, целью которого является выявление целевых процессов и составление
алгоритма визуализации.
Разработка интерфейса - процесс, занимающий большую часть от всей
разработки, т.к. включает визуальное оформление и интерактивное взаимодействие.
В ходе работы была разработан П.П. для обучения студентов через
визуализацию алгоритмов сортировки и демонстрацию его работы.
Список использованных источников
1. «Nifty GUI» the Missing Manual (28.12.2011). Авторы: JensHohmuth (void) Martin Karing
(mkaring) (Slick2D chapter)
. «jMonkeyEngine 3.0 Beginner’s Guide» (June
2013 Packt Publishing) Автор: Ruth Kusterer.
3. «Современные силовые алгоритмы для визуализации
информации большого объема» (2002) Автор: З.В. Апанович.
Приложение А
Пояснение алгоритма работы метода «setConstraints»:
) Установка первого состояния из массивов начальных координат
значений, координат. Установка контроллера из начального состояния.
addFirstState(this.defControllerLocation);
2) Пока не закончиться сортировка, зациклить.
.1) Если предыдущий элемент был последним из массива, значит записать
состояние «Complite», сортировку закончить и выйти из
метода.
.2) Запомнить первое число из не отсортированных.
.3) Запомним устойчивое состояние(вне процессов переносов).
.4) Добавить состояние, в котором минимальный элемент это первый элемент,
добавив отличие в виде цвета элемента (минимальный это красный).
.5) Зациклить пока номер цикла не будет равен длине
.5.1)Сделать состояние, в котором цвет текущего элемента с номером равном
номеру цикла.
.5.2)Проверить значение элемента массива с номером цикла в сравнение с
минимальным числом
.5.2.1) Если минимальное число больше, то запомнить это число как
минимальное. Сделать состояние в котором предыдущее минимальное число
становиться стандартным(стандартного цвета), а новое становиться минимальным
(окрашивается в минимальный цвет).
.5.3)Если минимальное число это то, что было выбрано автоматом в начале
цикла, тогда сделать состояние в котором происходит пояснение этого и далее не
делать перенос, а лишь поменять цвет минимального на завершенный. Перейти к
началу цикла с увеличенным номером цикла.
.5.4) Наше минимальное число это не то, стандартное, которое было
поставлено автоматом, значит между минимальным числом и концом отсортированной
части существуют объекты не отсортированные, значит нужно перенести.
.5.5) Перенести минимальный элемент вверх по координате.
.5.6) Перенести минимальный элемент в лево над элементом которой является
началом не отсортированного списка.
.5.7) Перенести все объекты между прошлым местом минимального и началом
не отсортированного списка вправо на ширину объекта сортировки и расстояния
между ними.
.5.8) Перенести минимальный элемент вниз на высоту элемента + расстояние
между элементами сортировки, т.е. на место где он должен стоять.
.5.9) Сделать минимальный элемент завершенным.
.6) Перенести контроллер на элемент первый из не отсортированных.
.7) Вернуться в начало цикла.
3) Элементы стоят на своих местах. Сделать состояние поясняющее о
окончании сортировки. Закончить заполнение массива состояний сортировки.
Рис. Блок схема метода «setConstraint».
Приложение Б
Класс
ConstraintArray.
mygame.sorting;com.jme3.math.Vector3f;java.util.ArrayList;
/**
*
* @author semifoll
*/class ConstraintArray {ArrayList<ArrayOfCube>
constArrayCube;
//varible of size.float heightObject;float wightObject;float
between;boolean notFinish;int prevConstraint;ArrayList<Integer>
defArrayValue;ArrayList<Vector3f> defArrayVector; //point to
//displayArrayCoordinateVector3f defControllerLocation;
//point to controller locationConstraintArray(){.heightObject = 3;.between =
1;.wightObject = 3;.notFinish = true;.prevConstraint = 0;.defArrayValue = new
ArrayList<Integer>();.defArrayVector = new ArrayList<Vector3f>();.defControllerLocation
= new Vector3f(-3,0,-3);.constArrayCube = new ArrayList<ArrayOfCube>();
}ConstraintArray(ArrayList<Vector3f> defArray ,
ArrayList<Integer>){.heightObject = 0;.between = 0;.wightObject =
0;.notFinish = true;.prevConstraint = 0;.defArrayVector = new
ArrayList<Vector3f>(defArray);.defArrayValue = new
ArrayList<Integer>();.defArrayValue.addAll(defValue);.constArrayCube =
new ArrayList<ArrayOfCube>();
}void addDefVector3f(Vector3f
newVec){(!this.constArrayCube.isEmpty()){.constArrayCube = new
ArrayList<ArrayOfCube>();
}.defArrayVector.add(newVec);
}void addDefValue(Integer
newVal){(!this.constArrayCube.isEmpty()){.constArrayCube = new
ArrayList<ArrayOfCube>();
}.defArrayValue.add(newVal);
}int sizeVal(){this.defArrayValue.size();
}void setDefArrays(ArrayList<Vector3f> newVec,
ArrayList<Integer>){.constArrayCube.clear();.constArrayCube = new
ArrayList<ArrayOfCube>();.defArrayValue = new
ArrayList<Integer>(newVal);.defArrayVector = new ArrayList<Vector3f>(newVec);
}void setHeight(float h){.heightObject = h;
}float getHeight(){this.heightObject;
}void setWight(float w){.wightObject = w;
}float getWight(){this.wightObject;
}void setBetween(float b){.between = b;
}float getBetween(){this.between;
}void setController(Vector3f newControllerLocation){.defControllerLocation
= newControllerLocation;
}Vector3f getController(){this.defControllerLocation;
}boolean setConstraints(){ .constArrayCube = new
ArrayList<ArrayOfCube>();.notFinish = true;prevSort = 0;.prevConstraint =
0;(this.defControllerLocation); = 0; //плавающее число. номер от куда идут не
//отсортированные.(notFinish){(prevSort ==
this.defArrayVector.size()){.notFinish =
false;.constArrayCube.add(ArrayOfCube(this.constArrayCube.get(this.prevConstraint))
);.constArrayCube.get(this.prevConstraint+1).("Sorting
is complete ");.prevConstraint++;
//добавить состояние сортировка завершена
continue;
}
//первое число из не отсортированных
Integermin = this.constArrayCube.get(this.prevConstraint).getValueByNum(prevSort);
//номер первого числа из не отсортированных
IntegernumMin = prevSort;
//сохранение номера устойчивого состояния(вне процесса
//перемещения)
IntegersteadyState = this.prevConstraint;
//добавитьцветминимума
//////////////////////////////////////////////
this.setMinFirsOfNotSort(numMin);
/////////////////////////////////////////////(int i =
prevSort + 1; i!= this.defArrayVector.size(); ++i){
////////////////////////////////////////////////////////////////////.setSelectColor(i,
numMin);
///////////////////////////////////////////////////////////////////////(min
> this.constArrayCube.get(this.prevConstraint).(i)){
//добавить цвет минимума
////////////////////////////////////////////////////////////////////
this.setCurrentMin(i, numMin);
////////////////////////////////////////////////////////////////////
= .constArrayCube.get(this.prevConstraint).(i);= i;
}
}(numMin == prevSort){
//минимальный тот кого выбирали автоматом.
//добавить состояние из информационного состояния.
this.constArrayCube.add(ArrayOfCube(this.constArrayCube.get(this.prevConstraint))
);.constArrayCube.get(this.prevConstraint+1).(this.constArrayCube.get(this.prevConstraint
+ 1)..size() - 1,
"standart");.constArrayCube.get(this.prevConstraint+1).setColorByNum(num,"complete");//complete.constArrayCube.get(this.prevConstraint+1).("The
minimal element stand in right location. "
+ "The number is "+numMin+"
...");.prevConstraint++;++;
continue;
}
//сделать перенос в начало.
this.backToBegin(numMin);
//1) перенесте в верх y+hight+2 предмета.
this.setMoving(numMin, new
Vector3f(.constArrayCube.get(this.prevConstraint).getLocalByNum(nu).x,.constArrayCube.get(this.prevConstraint).(numMin).y
+ this.heightObject + .between,.constArrayCube.get(this.prevConstraint).(numMin).z
)
);
//2) перенести в х элемента по положению(там где должен стоять)
this.setMoving(numMin, new
Vector3f(*(this.between+this.wightObject),.constArrayCube.get(this.prevConstraint).(numMin).y,.constArrayCube.get(this.prevConstraint).(numMin).z
)
);
//3) сделать "релаксацию"(перенос всех остальных в ту область
//где требуется
//prevSort - номер с которого началось текущее
сортирование
this.relaxLocation(prevSort, numMin);
//4) перенести наш элемент в низ на уровень всех.
this.setMoving(numMin, Vector3f( .constArrayCube.get(this.prevConstraint).(numMin).x,.constArrayCube.get(this.prevConstraint).(numMin).y
- this.heightObject
-.between,.constArrayCube.get(this.prevConstraint).(numMin).z
)
);.constArrayCube.get(this.prevConstraint).(numMin,"complete");//complete(prevSort,
min, numMin, steadyState);(prevSort);++;
}true;
}void mainChanging(int prevSort, Integer min, Integer numMin,
) {
//5) перенести элемент минимальный в истинном массиве и //вернуть все
векторы в состояние до сортировки.
this.constArrayCube.add(ArrayOfCube(this.constArrayCube.get(this.prevConstraint))
);.constArrayCube.get(this.prevConstraint+1).arrayListValue.add(,.constArrayCube.get(this.prevConstraint+1)..get(numMin)
);.constArrayCube.get(this.prevConstraint+1)..remove(numMin +
1);.constArrayCube.get(this.prevConstraint +
1).(.constArrayCube.get(steadyState).arrayListCube
);.constArrayCube.get(this.prevConstraint).("Moving
complete...");.prevConstraint++;
}void moveConrtoller(int prevSort) {
//6) перенести контроллер на первый элемент не отсортированных
this.constArrayCube.get(this.prevConstraint).setControllerLocate(Vector3f(.constArrayCube.get(this.prevConstraint).(prevSort).x,.constArrayCube.get(this.prevConstraint).(prevSort).y,.constArrayCube.get(this.prevConstraint).(prevSort).z
-3
)
);
}void relaxLocation(int prevSort, Integer numMin)
{.constArrayCube.add(ArrayOfCube(this.constArrayCube.get(this.prevConstraint))
);(int i = prevSort; i!= numMin;
++i){.constArrayCube.get(this.prevConstraint+1).setLocalByNum(i,
Vector3f(.constArrayCube.get(this.prevConstraint+1).(i).x + this.wightObject +
this.between,
.constArrayCube.get(this.prevConstraint+1).(i).y,.constArrayCube.get(this.prevConstraint+1).(i).z
)
);
}.constArrayCube.get(this.prevConstraint+1).("Relax the
location...");.prevConstraint++;
}void backToBegin(Integer numMin)
{.constArrayCube.add(ArrayOfCube(this.constArrayCube.get(this.prevConstraint))
);.constArrayCube.get(this.prevConstraint+1).(numMin,
"moving");.constArrayCube.get(this.prevConstraint+1).(.constArrayCube.get(this.prevConstraint
+ 1)..size() - 1,
"standart");.constArrayCube.get(this.prevConstraint+1).setControllerLocate(Vector3f(.constArrayCube.get(this.prevConstraint+1).(numMin).x,.constArrayCube.get(this.prevConstraint+1).(numMin).y,.constArrayCube.get(this.prevConstraint+1).(numMin).z
- 3
)
);.constArrayCube.get(this.prevConstraint+1).("Start to
moving object...");.prevConstraint++;
}void addFirstState(Vector3f
controllerLocation){.constArrayCube.add(new
ArrayOfCube(.defArrayVector,this.defArrayValue, controllerLocation));
//инициализировать массив начального положения (в 0-м положении)
this.constArrayCube.get(this.prevConstraint).("Start
install. Every box on his location...");
}void setMinFirsOfNotSort(Integer
numMin){.constArrayCube.add(ArrayOfCube(this.constArrayCube.get(this.prevConstraint))
);.constArrayCube.get(this.prevConstraint+1).(numMin,
"minimal");.constArrayCube.get(this.prevConstraint+1).("Controller
choose min element is "
+ "first element of not sorters collection, "
+ "who start in "+numMin+" element...");
//закрасить минимальный
цветом..constArrayCube.get(this.prevConstraint+1).setControllerLocate(Vector3f(.constArrayCube.get(this.prevConstraint+1).(numMin).x,.constArrayCube.get(this.prevConstraint+1).(numMin).y,.constArrayCube.get(this.prevConstraint+1).(numMin).z
- 3
)
);.prevConstraint++;
}void setSelectColor(int objnumi, Integer
numMin){.constArrayCube.add(ArrayOfCube(this.constArrayCube.get(this.prevConstraint))
);(objnumi>0){((objnumi-1)!=
numMin){.constArrayCube.get(this.prevConstraint+1).(objnumi - 1, "standart");
}
}.constArrayCube.get(this.prevConstraint+1).(objnumi,
"select");.constArrayCube.get(this.prevConstraint+1).("Select
element for compare whith number”+
+“is"+objnumi+"
...");.constArrayCube.get(this.prevConstraint+1).(Vector3f(.constArrayCube.get(this.prevConstraint+1).(objnumi).x,.constArrayCube.get(this.prevConstraint+1).(objnumi).y,.constArrayCube.get(this.prevConstraint+1).(objnumi).z
- 3
)
);.prevConstraint++;
}void setCurrentMin(int currentObject, Integer
numMin){.constArrayCube.add(ArrayOfCube(this.constArrayCube.get(this.prevConstraint))
);.constArrayCube.get(this.prevConstraint+1).(numMin,
"standart");.constArrayCube.get(this.prevConstraint+1).(currentObject,
"min");.constArrayCube.get(this.prevConstraint+1).("Selected element
now is min, and the number”
+“is"+currentObject+"
...");.constArrayCube.get(this.prevConstraint+1).setControllerLocate(Vector3f(.constArrayCube.get(this.prevConstraint+1).(currentObject).x,.constArrayCube.get(this.prevConstraint+1).(currentObject).y,.constArrayCube.get(this.prevConstraint+1).(currentObject).z
- 3
)
);.prevConstraint++;
}void setMoving(Integer numObject,Vector3f
newLocetionObj){.constArrayCube.add(ArrayOfCube(this.constArrayCube.get(this.prevConstraint))
);.constArrayCube.get(this.prevConstraint+1).(numObject,
);.constArrayCube.get(this.prevConstraint+1).setControllerLocate(Vector3f(.constArrayCube.get(this.prevConstraint+1).(numObject).x,.constArrayCube.get(this.prevConstraint+1).(numObject).y,.constArrayCube.get(this.prevConstraint+1).(numObject).z
- 3
)
);.constArrayCube.get(this.prevConstraint+1).("Move
object on new location...");.prevConstraint++;
}
}
Приложение В
КлассArrayOfCube.mygame.sorting;java.util.ArrayList;com.jme3.math.Vector3f;
/**
*
* @author semifoll
*/class ArrayOfCube {int sizeArray;ArrayList<Integer>
arrayListValue; ArrayList<Vector3f> arrayListCube;
ArrayList<String> arrayListColor;String textInfo;Vector3f
locateController;ArrayOfCube(){.arrayListValue = new
ArrayList<Integer>();.arrayListColor = new ArrayList<String>();.arrayListCube
= new ArrayList<Vector3f>();.locateController = new
Vector3f(-3,0,0);.sizeArray = 0;.textInfo = new String();
}ArrayOfCube( <Vector3f> newArray, <Integer>
newValues)
{.sizeArray = 0;.arrayListCube = new
ArrayList<Vector3f>();.arrayListColor = new
ArrayList<String>();.arrayListValue = new ArrayList<Integer>();(int
i = 0; i!= newArray.size();
++i){.arrayListCube.add(newArray.get(i));.arrayListValue.add(newValues.get(i));.arrayListColor.add("standart");.sizeArray++;
}.locateController = new Vector3f(-3,0,0);.textInfo =
"";
} ArrayOfCube(<Vector3f> newArray, <Integer>
newValues, f newLocationController)
{.textInfo = "";.sizeArray = 0;.arrayListCube = new
ArrayList<Vector3f>();.arrayListColor = new
ArrayList<String>();.arrayListValue = new ArrayList<Integer>();(int
i = 0; i!= newArray.size();
++i){.arrayListCube.add(newArray.get(i));.arrayListValue.add(newValues.get(i));.arrayListColor.add("standart");.sizeArray++;
}.locateController = new Vector3f(newLocationController);
}ArrayOfCube(ArrayOfCube base){.sizeArray = 0;.arrayListCube
= new ArrayList<Vector3f>();.arrayListColor = new
ArrayList<String>();.arrayListValue = new
ArrayList<Integer>();.textInfo = base.textInfo;(int i = 0; i!=
base.arrayListCube.size(); ++i){.arrayListCube.add(base.arrayListCube.get(i));.arrayListValue.add(base.arrayListValue.get(i));.arrayListColor.add(base.arrayListColor.get(i));.sizeArray++;
}.locateController = new Vector3f(base.locateController);
}void setTextInfo(String str){.textInfo = str;
}String getTextInfo(){this.textInfo;
}void setLocalByNum(int num, Vector3f
newVec){.arrayListCube.set(num, newVec);
}Vector3f getLocalByNum(int num){this.arrayListCube.get(num);
}int GetSize(){sizeArray;
}int addToArray(Vector3f location, Integer value){.arrayListCube.add(new
Vector3f(location));.arrayListValue.add(value);.arrayListColor.add("standart");.sizeArray++;sizeArray;
}int getValueByNum(int num){this.arrayListValue.get(num);
}String getColorByNum(int num){this.arrayListColor.get(num);
}void setControllerLocate(Vector3f
newLocate){.locateController = new Vector3f(newLocate);
}void setColorByNum(int num, String newColor){(num <
this.arrayListColor.size()){.arrayListColor.set(num, newColor);
}
}void setDefColor(){(int i =0; i!=
this.arrayListColor.size(); ++i){.arrayListColor.set(i, "standart");
}
}void setArray(ArrayList<Vector3f>
newArray,<Integer> newValues){.arrayListCube = new
ArrayList<Vector3f>();.arrayListValue = new
ArrayList<Integer>();.arrayListColor = new
ArrayList<String>();.sizeArray = 0;(int i = 0; i!= newArray.size();
++i){.arrayListCube.add(newArray.get(i));.arrayListValue.add(newValues.get(i));.arrayListColor.add("standart");.sizeArray++;
}
}void setArrayVectors(ArrayList<Vector3f>
newArray){.sizeArray = 0;.arrayListCube = new ArrayList<Vector3f>();(int
i = 0; i!= newArray.size(); ++i){.add(newArray.get(i));
}
}void setValByNum(int num, int
val){(num<this.arrayListValue.size()).arrayListValue.set(num, val);
}
}
Приложение Г
Класс
MyBox.
mygame;com.jme3.asset.AssetManager;com.jme3.material.Material;com.jme3.math.ColorRGBA;com.jme3.math.Vector3f;com.jme3.scene.Geometry;com.jme3.scene.Node;com.jme3.scene.shape.Box;com.jme3.scene.shape.Quad;com.jme3.texture.Texture;java.util.Random;
/**
*
* @author semifoll
*/class MyBox {Geometry box;Geometry valTexGeom;Integer
value;Random random;ColorRGBA color;Texture valTexure;final AssetManager
assetManager;MyBox(AssetManager assetManager,String name , Integer newVal,f
newVec, ColorRGBA newCol){.assetManager = assetManager;= new Random();(newVal<0
|| newVal>9){= 0;
}.value = newVal;.color = newCol;(this.value) {1:
this.valTexure =
assetManager.loadTexture("Textures/1.png");;2:
this.valTexure =
assetManager.loadTexture("Textures/2.png");;3:
this.valTexure = assetManager.loadTexture("Textures/3.png");;4:
this.valTexure =
assetManager.loadTexture("Textures/4.png");;5:
this.valTexure =
assetManager.loadTexture("Textures/5.png");;6:
this.valTexure =
assetManager.loadTexture("Textures/6.png");;7:
this.valTexure = assetManager.loadTexture("Textures/7.png");;8:
this.valTexure =
assetManager.loadTexture("Textures/8.png");;9:
this.valTexure =
assetManager.loadTexture("Textures/9.png");;0:
this.valTexure =
assetManager.loadTexture("Textures/0.png");;
}= createBox(name,newVec, newCol);.valTexGeom = this.createValTexture(name,
newVec);
}Geometry getValTextureGeom(){this.valTexGeom;
}Geometry createValTexture(String name, Vector3f
loc){.valTexure.setMagFilter(Texture.MagFilter.Nearest);.valTexure.setMinFilter(Texture.MinFilter.NearestNoMipMaps);.valTexure.setAnisotropicFilter(16);mat
= new Material(assetManager,
"Common/MatDefs/Misc/Unshaded.j3md");.setTexture("ColorMap",
this.valTexure);q = new Quad(1, 1);g = new Geometry(name,
q);.setLocalTranslation(loc.x-0.5f, loc.y - 0.5f, loc.z + 1.2f);.setMaterial(mat);
g;
}Geometry createBox(String name, Vector3f loc, ColorRGBA
color)
{mesh = new Box(Vector3f.ZERO,1,1,1);geom = new
Geometry(name, mesh);mat2 = new Material(assetManager,
"Common/MatDefs/Misc/Unshaded.j3md");.setColor("Color",
color);mat1 = new Material(assetManager,
"Common/MatDefs/Light/Lighting.j3md");.setColor("Ambient",ColorRGBA.Blue);.setColor("Diffuse",ColorRGBA.Blue);.setColor("Specular",ColorRGBA.Green);.setBoolean("UseMaterialColors",true);.setFloat("Shininess",
5);.setMaterial(mat2);.setLocalTranslation(loc);geom;
}Geometry getBox(){this.box;
} Integer getVal(){this.value;
}ColorRGBA getColor(){this.color;
}Vector3f getVector3f(){this.box.getLocalTranslation();
}void setValue(Integer newVal){.value = newVal;
}void setVector3f(Vector3f newVec){.box.getLocalTransform().setTranslation(newVec);
}void setColor(ColorRGBA newCol){.color = newCol;newBox =
this.createBox(.box.getName(),.box.getLocalTranslation(), );.box = newBox;
}
}
Приложение Д
Класс
управления экраном. MyStartScreen.
mygame.GUI;com.jme3.app.Application;com.jme3.app.state.AbstractAppState;com.jme3.app.state.AppStateManager;com.jme3.asset.AssetManager;com.jme3.font.BitmapFont;com.jme3.font.BitmapText;com.jme3.font.Rectangle;com.jme3.material.Material;com.jme3.math.ColorRGBA;com.jme3.math.Vector3f;com.jme3.renderer.queue.RenderQueue;com.jme3.scene.Geometry;com.jme3.scene.Node;com.jme3.scene.shape.Box;com.jme3.scene.shape.Quad;com.jme3.system.AppSettings;com.jme3.texture.Image;com.jme3.texture.Texture;com.jme3.texture.Texture2D;de.lessvoid.nifty.Nifty;de.lessvoid.nifty.controls.Label;de.lessvoid.nifty.controls.TextField;de.lessvoid.nifty.elements.Element;de.lessvoid.nifty.elements.render.TextRenderer;de.lessvoid.nifty.screen.Screen;de.lessvoid.nifty.screen.ScreenController;java.util.ArrayList;java.util.Random;java.util.Vector;javafx.scene.text.Font;mygame.Main;mygame.MyBox;mygame.sorting.ConstraintArray;
public class MyStartScreen extends AbstractAppState
implements ScreenController {
private Application app;AppStateManager stateManager;Nifty
nifty;Screen screen;int step;int totalStep;ArrayList<MyBox>
vecBox;Geometry controllerGeom;Vector3f controllerVec3f;boolean auto;long
prevTime;
//!!!!!!!!!!ConstraintArray constr;Random random;ColorRGBA
standart = ColorRGBA.Gray;ColorRGBA select = ColorRGBA.Blue;ColorRGBA minimal =
ColorRGBA.Red;ColorRGBA complete = ColorRGBA.LightGray;ColorRGBA moving =
ColorRGBA.Pink;float speed = 10;boolean moveCompliteX = true;boolean
moveCompliteY = true;boolean moveCompliteZ = true;boolean movingComplete = false;
//////////////float hightBox = 3;float weightBox = 3;float
betweenBox = 1;
///////////////
//private ViewPort viewPort;final Node rootNode;final Node
guiNode;final AssetManager assetManager;final Node localRootNode = new
Node("Start Screen RootNode");final Node localGuiNode = new
Node("Start Screen GuiNode");
//private final ColorRGBA backgroundColor =
ColorRGBA.Gray;int distance=0; BitmapText distanceText;AppSettings
settings;MyStartScreen(Main app, AppSettings settings){.app = app;.stateManager
= app.getStateManager();.rootNode = app.getRootNode();
//this.viewPort = app.getViewPort();.guiNode =
app.getGuiNode();.assetManager = app.getAssetManager();.settings = settings;
}Geometry createController(Vector3f loc){mesh = new
Box(Vector3f.ZERO,1,2,1);geom = new Geometry("controller", mesh);mat2
= new Material(assetManager,
"Common/MatDefs/Misc/Unshaded.j3md");.setColor("Color",
ColorRGBA.Brown); mat1 = new Material(assetManager,
"Common/MatDefs/Light/Lighting.j3md");.setColor("Ambient",ColorRGBA.Blue);.setColor("Diffuse",ColorRGBA.Blue);.setColor("Specular",ColorRGBA.Green);.setBoolean("UseMaterialColors",true);.setFloat("Shininess",
5);.setMaterial(mat2);.setLocalTranslation(loc);geom;
}
@Overridevoid initialize(AppStateManager stateManager,
Application app) {.initialize(stateManager, app);
.getInputManager().setCursorVisible(true);.vecBox = new
ArrayList<MyBox>();
//TODO: initialize your AppState, e.g. attach spatials to
rootNode
//this is called on the OpenGL thread after the AppState has
been
//attached= new
Random();.attachChild(localRootNode);.attachChild(localGuiNode);
//viewPort.setBackgroundColor(backgroundColor);= 0;=
0;.constr = new ConstraintArray();.prevTime = System.currentTimeMillis();
.controllerVec3f = new Vector3f(-3,0,0);.controllerGeom = this.createController(this.controllerVec3f);.rootNode.attachChild(this.controllerGeom);
}
@Overridevoid update(float tpf) {
//TODO: implement behavior during runtime(this.auto
&& (System.currentTimeMillis() - this.prevTime)>1000
&&.movingComplete){(this.step < this.totalStep).step++;
}(this.moveCompliteX == false &&.moveCompliteY ==
false &&.moveCompliteZ == false)
{.movingComplete = false;
}(this.moveCompliteX == true &&.moveCompliteY == true
&&.moveCompliteZ == true)
{.movingComplete = true;
}(this.step < this.totalStep){
//проверканакоординаты.(int i =
this.constr.sizeVal()-1; i > -1; i-- ){(this.vecBox.get(i).getVector3f().x
>.constr.constArrayCube.(this.step).arrayListCube.get(i).x)
{.vecBox.get(i).setVector3f( Vector3f(
(float)(this.vecBox.get(i).getVector3f().x
-speed*tpf),.vecBox.get(i).getVector3f().y,.vecBox.get(i).getVector3f().z
)
);
}(this.vecBox.get(i).getVector3f().x
<.constr.constArrayCube.get(this.step).arrayListCube.get(i).x
)
{.vecBox.get(i).setVector3f( Vector3f(
(float)(this.vecBox.get(i).getVector3f().x
+speed*tpf),.vecBox.get(i).getVector3f().y,.vecBox.get(i).getVector3f().z
)
);
}(this.vecBox.get(i).getVector3f().x
==.constr.constArrayCube.get(this.step).arrayListCube.get(i).x
)
{ .moveCompliteX = true;
} (this.vecBox.get(i).getVector3f().y
>.constr.constArrayCube.get(this.step).arrayListCube.get(i).y
)
{.vecBox.get(i).setVector3f(
Vector3f(.vecBox.get(i).getVector3f().x ,
(float)(this.vecBox.get(i).getVector3f().y-speed*tpf),.vecBox.get(i).getVector3f().z
)
);
}(this.vecBox.get(i).getVector3f().y
<.constr.constArrayCube.get(this.step).arrayListCube.get(i).y
)
{.vecBox.get(i).setVector3f(
Vector3f(.vecBox.get(i).getVector3f().x ,
(float)(this.vecBox.get(i).getVector3f().y+speed*tpf),.vecBox.get(i).getVector3f().z
)
);
}(this.vecBox.get(i).getVector3f().y
==.constr.constArrayCube.get(this.step).arrayListCube.get(i).y
)
{ .moveCompliteY = true;
}(this.vecBox.get(i).getVector3f().z
>.constr.constArrayCube.get(this.step).arrayListCube.get(i).z
)
{.vecBox.get(i).setVector3f( Vector3f(.vecBox.get(i).getVector3f().x
,.vecBox.get(i).getVector3f().y ,
(float)(this.vecBox.get(i).getVector3f().z +speed*tpf)
)
);
}(this.vecBox.get(i).getVector3f().z
<.constr.constArrayCube.get(this.step).arrayListCube.get(i).z
)
{.vecBox.get(i).setVector3f(
Vector3f(.vecBox.get(i).getVector3f().x ,.vecBox.get(i).getVector3f().y ,
(float)(this.vecBox.get(i).getVector3f().z +speed*tpf)
)
);
}(this.vecBox.get(i).getVector3f().z
==.constr.constArrayCube.get(this.step).arrayListCube.get(i).z
)
{ .moveCompliteZ = true;
}
//проверкацвета(this.constr.constArrayCube.get(this.step).getColorByNum(i).("standart")){(this.vecBox.get(i).getColor()!=this.standart){.get(i).setColor(this.standart);
}
}(this.constr.constArrayCube.get(this.step).getColorByNum(i).("select")){(this.vecBox.get(i).getColor()!=this.select){.get(i).setColor(this.select);
}
}(this.constr.constArrayCube.get(this.step).getColorByNum(i).("minimal")){(this.vecBox.get(i).getColor()!=this.minimal){.get(i).setColor(this.minimal);
}
}(this.constr.constArrayCube.get(this.step).getColorByNum(i).("moving")){(this.vecBox.get(i).getColor()!=this.moving){.get(i).setColor(this.moving);
}
}(this.constr.constArrayCube.get(this.step).getColorByNum(i).("complete")){(this.vecBox.get(i).getColor()!=this.complete){.get(i).setColor(this.complete);
}
}
}
//Controller(this.controllerVec3f.x
>.constr.constArrayCube.get(this.step).locateController.x
)
{.controllerVec3f = ( Vector3f(
(float)(this.controllerVec3f.x - speed*tpf)
,.controllerVec3f.y,.controllerVec3f.z
)
);
}(this.controllerVec3f.x
<.constr.constArrayCube.get(this.step).locateController.x
)
{.controllerVec3f = ( Vector3f(
(float)(this.controllerVec3f.x + speed*tpf)
,.controllerVec3f.y,.controllerVec3f.z
)
);
}(this.controllerVec3f.y
>.constr.constArrayCube.get(this.step).locateController.y
)
{.controllerVec3f = ( Vector3f(.controllerVec3f.x ,
(float)(this.controllerVec3f.y-speed*tpf),.controllerVec3f.z
)
);
}(this.controllerVec3f.y
<.constr.constArrayCube.get(this.step).locateController.y
)
{.controllerVec3f = ( Vector3f(.controllerVec3f.x ,
(float)(this.controllerVec3f.y+speed*tpf),.controllerVec3f.z
)
);
}(this.controllerVec3f.z
<.constr.constArrayCube.get(this.step).locateController.z
)
{.controllerVec3f = ( Vector3f(.controllerVec3f.x
,.controllerVec3f.y,
(float)(this.controllerVec3f.z+speed*tpf)
)
);
}(this.controllerVec3f.z
>.constr.constArrayCube.get(this.step).locateController.z
)
{.controllerVec3f = ( Vector3f(.controllerVec3f.x
,.controllerVec3f.y,
(float)(this.controllerVec3f.z-speed*tpf)
)
);
}
}
}
@Overridevoid cleanup() {.cleanup();
//TODO: clean up what you initialized in the initialize
method,
//e.g. remove all spatials from rootNode
//this is called on the OpenGL thread after the AppState has
been detached.detachChild(localRootNode);.detachChild(localGuiNode);.app =
null;.stateManager = null;
}void bind(Nifty nifty, Screen screen) {.nifty =
nifty;.screen = screen;
}void onStartScreen() {
// throw new UnsupportedOperationException("Not
supported yet.");
}void onEndScreen() {
//throw new UnsupportedOperationException("Not supported
yet.");
}void Start(String nextScreen) {.gotoScreen(nextScreen); //
switch to another screen
// start the game and do some more stuff...
}void Info(){
}void Option(){
}void Quit() {.stop();
}void Next(){(auto){.auto = false;
}(this.movingComplete == false){;
}(this.step < this.totalStep)
{.movingComplete =
false;.step++;.getCurrentScreen().findNiftyControl("Label_Condition",
TextField.class).setText(this.step+"/"+this.totalStep);
}else{ .getCurrentScreen().findNiftyControl("TextInfo",
Label.class).setText("Can't go top maximal");
}
}void Prev(){(auto){.auto = false;
}(this.movingComplete == false){;
}(this.step > -1)
{.movingComplete = false;.step--;.moveCompliteX =
false;.moveCompliteY = false;.moveCompliteZ = false;
.getCurrentScreen().findNiftyControl("Label_Condition",
TextField.class).setText(this.step+"/"+this.totalStep);
}else{.getCurrentScreen().findNiftyControl("TextInfo",
Label.class).setText("Can't go below minimal");
}
}void Play(){.auto = true;
}void AddBox(){(this.moveCompliteX == false
&&.moveCompliteY == false &&.moveCompliteZ == false){;
}(auto){.auto = false;
}valText =
.getCurrentScreen().findNiftyControl("TextField_BoxValue",
TextField.class).getRealText();.getScreen("hud").findElementById("TextField_BoxValue").getRenderer(TextRenderer.class).getOriginalText();f
newLocation = Vector3f(this.vecBox.size()*(this.weightBox
+ this.betweenBox),0,-10);newBox = new MyBox(,
"Cube"+this.vecBox.size(),.parseInt(valText),,.standart
);.constr.addDefValue(Integer.parseInt(valText));.constr.addDefVector3f(newLocation);.constr.setConstraints();.totalStep
=
this.constr.constArrayCube.size();.vecBox.add(newBox);.rootNode.attachChild(newBox.getBox());.rootNode.attachChild(newBox.getValTextureGeom());
}void AddBoxRandom(){(this.moveCompliteX == false
&&.moveCompliteY == false &&.moveCompliteZ == false){;
}(auto){.auto = false;
}val = this.random.nextInt(9);f newLocation =
Vector3f(this.vecBox.size()*(this.weightBox
+ this.betweenBox),0,-10);newBox = new MyBox(,
"Cube"+this.vecBox.size(),,,.standart
);.constr.addDefValue(val);.constr.addDefVector3f(newLocation);.constr.setConstraints();.totalStep
=
this.constr.constArrayCube.size();.vecBox.add(newBox);.localRootNode.attachChild(newBox.getBox());.rootNode.attachChild(newBox.getValTextureGeom());
}String
getPlayerName(){System.getProperty("user.name");
}void setTotalStep(int totStep){.totalStep = totStep;
}
}
Приложение Е
Разработанный XML документ,
отвечающий за интерфейс программы.
<?xml version="1.0" encoding="UTF-8"
standalone="yes"?>
<nifty
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
="http://nifty-gui.lessvoid.com/nifty-gui"
:schemaLocation="https://raw.githubusercontent.com/void256/nifty-gui/1.4/nifty-core/src/main/resources/nifty.xsd
://raw.githubusercontent.com/void256/nifty-gui/1.4/nifty-core/src/main/resources/nifty.xsd">
<useControls
filename="nifty-default-controls.xml"/>
<useStyles
filename="nifty-default-styles.xml"/>
<screen id="start"
controller="mygame.GUI.MyStartScreen">
<layer id="background"
childLayout="center" >
<image id="GImage0"
filename="Interface/startBackground.png" ="100%"
imageMode="normal" height="100%" />
</layer>
<layer id="foreground"
childLayout="vertical" >
<panel id="panel_top" childLayout="center"
="75%" align="center" height="25%">
<text text=" Hello ${CALL.getPlayerName()}'s "
="Interface/Fonts/Default.fnt" width="100%"
="100%">
<effect>
<onStartScreen name="move" mode="in"
="top" length="300" ="0"
inherit="true"/>
</effect>
</text>
</panel>
<panel id="panel_mid"
childLayout="center" width="75%" ="center"
valign="center" height="50%">
<text text="This visual instruction for
sorting." ="Interface/Fonts/Default.fnt" width="50%"
="50%" />
</panel>
<panel id="panel_bottom"
childLayout="horizontal" ="75%" align="center"
valign="center" ="25%">
<panel id="panel_bottom_right"
height="50%" ="25%" valign="center"
childLayout="center">
<control name="button"
id="Button_Start" = "Start" align="center"
="center" width="50%" height="35%"
="true">
<interact onClick="Start(choose)"/>
<effect>
<onClick name="playSound"
sound="myclick"/>
</effect>
</control>
</panel>
<panel id="panel_bottom_mid1"
height="50%" width="25%" ="center"
childLayout="center">
<control name="button"
id="Button_Option" = "Option" align="center"
="center" width="50%" height="35%"
="true">
<interact onClick="Option()"/>
</control>
<panel id="panel_bottom_mid2"
height="50%" width="25%" ="center"
childLayout="center">
<control name="button"
id="Button_Info" = "Info"align="center"
="center" width="50%" height="35%"
="true">
<interact onClick="Info()"/>
</control>
</panel>
<panel id="panel_bottom_left"
height="50%" width="25%"="center"
childLayout="center">
<control name="button"
id="Button_Quit" = "Quit"align="center"
="center" width="50%" height="35%"
="true">
<interact onClick="Quit()"/>
</control>
</panel>
</panel>
</layer>
</screen>
<screen id="hud"
controller="mygame.GUI.MyStartScreen">
<layer id="background"
childLayout="center">
<image id="GImage0" ="Interface/hudBackground.png"
="100%" imageMode="normal" height="100%" />
</layer>
<layer id="foreground"
childLayout="horizontal" >
<panel id = "Panel_1" childLayout =
"vertical" ="40%" align="center"
height="100%">
<panel id = "Panel_1_1" childLayout =
"vertical"="100%" align="center"
height="70%">
<panel id = "Panel_1_1_1" childLayout =
"horizontal" = "left" valign = "top"=
"20%" height = "10%">
<control name="button"
id="Button_BoxRandom" = "Random" width="100%"
="100%"visibleToMouse="true">
<interact onClick="AddBoxRandom()"/>
</control>
</panel>
</panel>
<panel id = "Panel_1_2" childLayout =
"center" ="100%" height="30%"
align="center" >
<control id = "TextInfo" name =
"textfield" = "info" width="90%" height
="90%" = "true" visibleToMouse="true"/>
</panel>
</panel>
<panel id = "Panel_2" childLayout =
"vertical" ="10%" align="center"
height="100%">
<panel id = "Panel_2_1" childLayout =
"vertical" ="100%" align="center"
height="80%">
</panel>
<panel id = "Panel_2_2" childLayout =
"vertical" ="100%" height="20%" align="center"
>
<panel id = "Panel_2_2_1" childLayout =
"center" ="60%" height="20%"
align="center">
<text text="Edit value:"
font="Interface/Fonts/Arial2.fnt" ="70%"
height="80%" />
</panel>
<panel id = "Panel_2_2_2" childLayout =
"center" ="60%" height="20%"
align="center">
<control name="textfield"
id="TextField_BoxValue"="70%" height="80%"
visibleToMouse="true"/>
</panel >
<panel id = "Panel_2_2_3" childLayout =
"center" ="60%" height="20%"
align="center">
<control name="button"
id="Button_BoxValue" = "Add" width="70%"
="80%"visibleToMouse="true">
<interact onClick="AddBox()"/>
</control>
</panel>
</panel>
</panel>
<panel id = "Panel_3" childLayout =
"vertical" ="35%" align="center"
height="100%">
<panel id = "Panel_3_1" childLayout =
"vertical" ="100%" align="center"
height="90%">
</panel>
<panel id = "Panel_3_2" childLayout =
"horizontal" ="100%" height="10%"
align="center" >
<panel id = "Panel_3_2_0" childLayout =
"center" ="10%" height="80%"
align="center" >
</panel>
<panel id = "Panel_3_2_1" childLayout =
"center" ="25%" height="80%"
align="center" >
<control name="button"
id="Button_Prev" = "Prev" width="80%"
="80%" visibleToMouse="true">
<interact onClick="Prev()"/>
</control>
</panel>
<panel id = "Panel_3_2_2" childLayout =
"center" ="25%" height="80%"
align="center" >
<control name="button"
id="Button_Play" = "Play" width="80%"
="80%" visibleToMouse="true">
<interact onClick="Play()"/>
</control>
</panel>
<panel id = "Panel_3_2_3" childLayout =
"center" ="25%" height="80%"
align="center" >
<control name="button"
id="Button_Next" = "Next" width="80%"
="80%" visibleToMouse="true">
<interact onClick="Next()"/>
</control>
</panel>
</panel>
</panel>
<panel id = "Panel_4" childLayout =
"vertical" ="15%" align="center"
height="100%">
<panel id = "Panel_4_1" childLayout =
"vertical" ="100%" align="center"
height="10%">
<control name="label"
id="Label_Condition" ="1/0" width="25%"
height="80%" ="true">
</control>
</panel>
<panel id = "Panel_4_2" childLayout =
"vertical" ="100%" height="90%"
align="center" >
</panel>
</panel>
</layer>
</screen>
<screen id="choose"
controller="mygame.GUI.MyStartScreen">
<layer id="background"
childLayout="center" >
<image id="GImage0"
="Interface/startBackground.png" ="100%"
imageMode="normal" height="100%" />
</layer>
<layer id="foreground"
childLayout="vertical" >
<panel id="panel_top"
childLayout="center" ="75%" align="center"
height="25%">
<text text=" Choose what type sorting you want:
" ="Interface/Fonts/Default.fnt" ="100%"
height="100%">
<effect>
<onStartScreen name="move" mode="in"
="top" ="300" startDelay="0"
="true"/>
</effect>
</text>
</panel>
<panel id="panel_mid"
childLayout="vertical" ="75%" align="center"
="center" height="50%">
<panel id="panel_mid_1" height="25%"
="50%" valign="center" ="center">
<control name="button"
="Button_BubleSort" = "Buble Sort" ="center"
valign="center" ="50%" height="35%"
="true">
<interact onClick="Start(hud)"/>
<effect>
<onClick name="playSound"
sound="myclick"/>
</effect>
</control>
</panel>
<panel id="panel_mid_2" height="25%"
="50%" valign="center" ="center">
<control name="button"
="Button_HoarSort" = "Hoar Sort" ="center"
valign="center" ="50%" height="35%"
="true">
<effect>
<onClick name="playSound"
="myclick"/>
</effect>
</control>
</panel>
<panel id="panel_mid_3" height="25%"
="50%" valign="center" ="center">
<control name="button"
="Button_FastSort" = "Fast Sort" ="center"
valign="center" ="50%" height="35%"
="true">
<effect>
<onClick name="playSound"
="myclick"/>
</effect>
</control>
</panel>
</panel>
</layer>
</screen>
</nifty>
Приложение Ж
Описание класса «ClassArrayOfCube».
Класс для хранения информации о элементах состояния сортировки. Имеет ряд
членов:
)Переменная размер сортируемого массива.Используется для быстрого доступа
внутри массива.
intsizeArray
) Массив из чисел, отвечающих за значение объекта в сортируемом массиве.
ArrayList<Integer>arrayListValue.
)Массив из чисел, отвечающих за координаты объекта в сортируемом массиве
ArrayList<Vector3f>arrayListCube.
)Массив из чисел, отвечающих за цвет объекта в сортируемом массиве
ArrayList<String>arrayListColor.
)Переменная строка, отвечающая за пояснение шага сортировки
StringtextInfo.
)Переменная - координата, состоящая из трех не целых чисел. Отвечает за
координаты контроллера в этот шаг сортировки (Vector3flocateController).
Так же класс имеет ряд методов:
) Метод - конструктор. Отвечает за построение состояния при
передаче данных с отсутствием аргументов
ArrayOfCube()
) Метод - конструктор. Отвечает за построение состояния при
передаче данных с аргументами: 1) Массив координат; 2) Массив значений.
ArrayOfCube(ArrayList<Vector3f> newArray,
ArrayList<Integer>)
3) Метод - конструктор. Отвечает за построение состояния при
передаче данных с аргументами: 1)Массив координат; 2) Массив значений;
3)Координаты контроллера.
ArrayOfCube(ArrayList<Vector3f> newArray,
<Integer> newValues, f newLocationController)
4) Метод - конструктор копирования. Отвечает за построение состояния
при передаче данных с аргументом - указателем на другой объект аналогичный
создаваемому.
ArrayOfCube(ArrayOfCubebase)
) Метод для задания информации о шаге сортировки.
setTextInfo(Stringstr) Метод для получения информации о
шаге сортировки.
getTextInfo()
) Метод для задания координаты элемента по номеру.
setLocalByNum(int num, Vector3f newVec)
7) Метод для получения координаты по номеру.
getLocalByNum(int num)
) Метод для получения размера сортируемого массива.
GetSize()
9) Метод для добавления элемента в массив.
addToArray(Vector3f location, Integer value)
10) Метод для получения значения объекта сортируемого массива по
номеру.
getValueByNum(int num)
11) Метод для получения цвета объекта сортируемого массива по номеру.
getColorByNum(int num)
12) Метод для задания координат контроллера.
setControllerLocate(Vector3f newLocate)
13) Метод для задания цвета элемента сортируемого массива по номеру.
setColorByNum(int num, String newColor)
14) Метод для задания всем элементам массива стандартного цвета.
setDefColor()
15) Метод для задания массивов с переданных аргументов.
setArray(ArrayList<Vector3f> newArray,
ArrayList<Integer> newValues)
16) Метод для задания массива координат объектов сортируемого массива.
setArrayVectors(ArrayList<Vector3f> newArray)
17) Метод для задания значения объекта сортируемого массива по номеру
этого объекта.
setValByNum(int num, int val)
Приложение З
Описание класса «ClassConstraintArray»
Класс для хранения набора состояний. Имеет ряд членов:
1) Массив состояний .
constArrayCube;
) Переменные, отвечающие за хранение размеров сортируемых объектов.
- Высота (heightObject).
Ширина (wightObject).
Расстояние между объектами (between).
) Переменная, отвечающая за хранение информации об окончании построения
массива состояний.
notFinish.
4) Переменная, отвечающая за хранение информации о номере предыдущего
состояния при построении массива состояний.
prevConstraint.
) Массив значений, хранящий начальные значения массива.
defArrayValue.
) Массив координат, хранящий начальные координаты массива.
defArrayVector.
7) Переменная, отвечающая за хранение начальной координаты
контроллера.
defControllerLocation.
Так же существует ряд методов:
) Метод - конструктор, отвечающий за создание экземпляра класса
при передаче данных без аргументов. Задает стандартные значения.
ConstraintArray().
2) Метод - конструктор, отвечающий за создание экземпляра класса при
передаче данных с аргументами стандартных массивов координат, значений.
ConstraintArray(<Vector3f> defArray ,<Integer>
defValue).
3) Метод для добавления элемента стандартного значения координат в
набор координат.
addDefVector3f(Vector3f newVec).
4) Метод для добавления элемента в массив хранящихся стандартных
значений сортируемого массива.
addDefValue(IntegernewVal).
5) Метод для получения размера стандартного начального массива значений.
sizeVal().
6) Метод для задания начальных массивов. setDefArrays (ArrayList<Vector3f> newVec,
ArrayList<Integer> newVal).
7) Метод для заданий высоты сортируемого объекта.
setHeight(float h).
) Метод для получения значения высоты сортируемого объекта.
getHeight().
) Метод для задания высоты сортируемого объекта.
setWight(floatw)
) Метод для получения значения ширины сортируемого объекта.
getWight().
) Метод для задания расстояния между сортируемыми объектами.
setBetween(floatb).
) Метод для получения значения расстояния между сортируемыми объектами
заданном в этом объекте.
getBetween().
) Метод для задания координат начального положения контроллера.
setController(Vector3fnewControllerLocation).
) Метод для задания массива состояний. Является сердцем программы.
setConstraints()
) Метод, отвечающий за изменения связанные с перемещением элементов в
массиве значений во время построения массива состояний.
mainChanging(int prevSort, Integer min, Integer numMin,
Integer steadyState).
16) Метод, отвечающий за перенос контроллера за элемент с номером.
moveConrtoller(intprevSort).
) Метод, отвечающий за смещение объектов для освобождения места.
relaxLocation(int prevSort, Integer numMin).
18) Метод, отвечающий за действия подготовки к перемещению в начало.
backToBegin(IntegernumMin).
) Метод, отвечающий за добавление начального состояния в массив
состояний.
addFirstState(Vector3fcontrollerLocation).
) Метод, отвечающий за присвоение минимального числа первому элементу из
не отсортированной части массива.
setMinFirsOfNotSort(IntegernumMin).
) Метод, отвечающий за создание состояния в котором текущий элемент (тот
который по номеру равен номеру цикла) становиться выбранным на проверку. Этот
элемент становиться цвета «Select».
setSelectColor(int objnumi, Integer numMin).
) Метод, отвечающий за создание состояния в котором текущий элемент (тот,
что с номером цикла) становиться минимальным.
setCurrentMin(int currentObject, Integer numMin).
23) Метод, отвечающий за перемещение объекта с номером в новые координаты
которые передаются в аргументе.
setMoving(Integer numObject,Vector3f newLocetionObj).
Приложение И
Описание класса «ClassMain».
package
mygame;com.jme3.app.SimpleApplication;com.jme3.font.BitmapFont;com.jme3.font.BitmapText;com.jme3.math.Vector3f;com.jme3.niftygui.NiftyJmeDisplay;com.jme3.renderer.RenderManager;de.lessvoid.nifty.Nifty;mygame.GUI.MyStartScreen;class
Main extends SimpleApplication {MyStartScreen myMainMenuController;static void
main(String[] args) {app = new Main();.start();
}
@Overridevoid simpleInitApp()
{(false);(false);.setMoveSpeed(10f);.setDragToRotate(true);.setCursorVisible(true);=
new MyStartScreen(this,
this.settings);.attach(myMainMenuController);niftyDisplay = new
NiftyJmeDisplay(assetManager,, audioRenderer, guiViewPort);nifty =
niftyDisplay.getNifty();.addProcessor(niftyDisplay);.fromXml("Interface/StartScreen.xml",
"start", myMainMenuController);
//nifty.setDebugOptionPanelColors(true);.setDragToRotate(true);.getApplication().getCamera().(new
Vector3f(10,1,20));
}
@Override
public void simpleUpdate(float tpf) {}
@Overridevoid simpleRender(RenderManager rm) {}
}