Разработка программного продукта "Разноцветные кубики"

Применение языка Delphi в качестве языка программирования для реализации игры "Разноцветные кубики". Методы заполнения квадратной матрицы. Разработка алгоритма решения задачи, структурная организация данных. Характеристика программного средства.

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

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

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

Размещено на http://www.allbest.ru

Размещено на http://www.allbest.ru

КУРСОВОЙ ПРОЕКТ

по дисциплине:

Технология разработки программных продуктов

на тему: «Разработка программного продукта «Разноцветные кубики»

Брянск

2012

Содержание

Аннотация

Введение

1. Общие сведения о программном средстве

1.1 Основное функциональное назначение программного средства

1.2 Полное наименование программного средства

1.3 Условное обозначение программного средства

1.4 Разработчики программного средства

2. Техническое задание

2.1 Основание для разработки

2.2 Назначение разработки

2.3 Требования к программному средству

2.4 Требования к программной документации

2.5 Стадии и этапы разработки

2.6. Требования к эргономике и технической эстетике

3. Технические сведения программного средства

3.1 Общая архитектура программного средства

3.2 Реализация функционального назначения программного средства

3.3 Разработка алгоритма решения задачи

3.4. Структурная организация данных

3.5 Разработка интерфейса ПС

4. Руководство пользователя

4.1 Назначение и условия применения программного средства

4.2 Характеристика программного средства

4.3 Работа с программным средством

4.4. Эксплуатация программного средства

Заключение

Список использованной литературы

Приложение

Аннотация

Данный курсовой проект разработал студент группы 5П-08 по специальности Профессиональное обучение (по отраслям) профиля подготовки «Программное обеспечение вычислительной техники и автоматизированных систем» Брянского профессионально-педагогического колледжа.

Целью данного курсового проекта является разработка и создание программы «Разноцветные кубики».

Основное назначение программного продукта «Разноцветные кубики» развивать логическое мышление, позволяет отвлечься от работы.

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

Введение

Тема моего курсового проекта «Разработка программного продукта «Разноцветные кубики»». Передо мной встали две проблемы: 1) методы заполнения квадратной матрицы; 2) выбор языка программирования для реализации игры. Над второй пришлось поработать. Был выбран язык программирования Delphi. Изучалась специальная литература, оказали помощь интернет-ресурсы по некоторым вопросам.

Объектом исследования является программирование на языке Delphi.

Предмет исследования - разработка программ-игр на языке программирования Delphi.

Целью исследования было:

теоретическое обоснование и разработка программы «Разноцветные кубики».

Гипотеза исследования:

Если

v проанализировать содержание понятия «Разноцветные кубики»;

v проанализировать назначение и возможности Delphi;

v проанализировать пути решения проблем создания игр на языке Delphi;

v разработать программу игры «Разноцветные кубики».

То это обеспечит

Ш развитие и прикладное применение навыков программирования;

Ш получение навыков программирования в интегрированной среде программирования Delphi;

В соответствии с целью и гипотезой ставились и решались следующие задачи:

Написать программу «Разноцветные кубики», которая, во-первых, генерирует поле квадратов с некоторыми пустыми клетками; во-вторых, заполняется ли квадратная матрица.

1. Общие сведения о ПС

1.1 Основное функциональное назначение программного средства

Данная программа предназначена для игры Разноцветные кубики. Для работы с ней нужно запустить файл «RubiksCube.exe».

1.2 Полное наименование программного средства

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

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

Системные требования: 486 или совместимый процессор, 256 Mb RAM, ОС WindowsXP. Для работы программы требуется 128 Mb дискового пространства.

Для начала работы нужно запустить исполнимый файл «RubiksCube.exe».

1.3 Условное обозначение программного средства

Условное обозначение программного средства «Разноцветные кубики»

1.4 Разработчики программного средства

Курсовой проект на тему «Разноцветные кубики» разработан студентом Кожемяко Романом Викторовичем группы 5П-08 обучающийся в Брянском профессионально - педагогическом колледже.

2. Техническое задание

2.1 Основание для разработки

Основанием для разработки программного продукта «Разноцветные кубики» является задание «Брянского профессионально-педагогического колледжа»

2.2 Назначение разработки

Программа «Разноцветные кубики» предназначена для развития логического мышления, закрепления навыков работы с манипулятором типа мышь.

2.3 Требования к программному средству

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

Программное средство «Разноцветные кубики» применим к современным программным средствам, разработанным с использованием графического пользовательского интерфейса.

Требования к структуре ПС:

По функциональным признакам структура «Разноцветные кубики» подразделяется на следующие категории:

· Распределенная система управления

· Логические операции

· Удобный графический интерфейс

Требования к надежности:

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

1. обеспечить бесперебойное питание технических средств;

2. использование лицензионного программного обеспечения;

3. регулярным выполнением рекомендаций Министерства труда и социального развития РФ, изложенных в Постановлении от 23 июля 1998 г. «Об утверждении межотраслевых типовых норм времени на работы по сервисному обслуживанию ПЭВМ и оргтехники и сопровождению программных средств»;

4. регулярным выполнением требований ГОСТ 51188-78. испытание программных средств на наличие различных компьютерных вирусов. Защита информации.

Должна быть применена надежная защита для программного продукта «Разноцветные кубики»:

1. От несанкционированного доступа;

2. От проникновения в систему программного продукта компьютерных вирусов;

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

Условия эксплуатации:

Программа будет прекрасно работать от плюс 15 до плюс 35 °C при относительной влажности 90% и атмосферном давлении 462 мм.рт.ст., поскольку такие условия приблизительно соответствуют условиям эксплуатации современных компьютеров непромышленного исполнения.

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

Конечный пользователь программы (оператор) должен обладать практическими работы с графическим пользовательским интерфейсом операционной системы.

Персонал должен быть аттестован на II квалификационную группу по электробезопасности (для работы с конторским оборудованием).

Персонал, не имеющий II квалификационной группы по электробезопасности, не имеет права находится рядом с ПЭВМ и конторскому оборудованию.

Требования к составу и параметрам технических средств:

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

В состав технических средств должен входить IBM-совместимый персональный компьютер (ПЭВМ), включающий в себя:

1. процессор Pentium-1000 с тактовой частотой, ГГц - 8, не менее;

2. материнскую плату, ГГц - 5, не менее;

3. оперативную память объемом, Гб - 1, не менее;

4. жесткий диск объемом, ГБ - 20, не менее.

Требования к информационной и программной совместимости:

Исходный код программы был реализован на языке Borland Delphi 7. В качестве интегрированной среды разработки программы должна быть использована среда Borland Delphi 7.

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

Требования к транспортированию и хранению:

Допускается транспортирование программного изделия в транспортной таре всеми видами транспорта (в том числе в отапливаемых герметизированных отсеках самолетов без ограничения расстояний). При перевозке в железнодорожных вагонах вид отправки - мелкий малотоннажный.

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

· температура окружающего воздуха, от плюс 15 °С до плюс 30 °С;

· относительная влажность воздуха при 25 °С - 70%.

Специальные требования

Программа обеспечивает взаимодействие пользователя (оператора) посредствам графического пользовательского интерфейса, разработанного согласно рекомендациям компании-производителя операционной системы.

2.4 Требования к программной документации:

Состав программной документации предусмотрен с ГОСТ 19.101-77;

Состав программной документации включает в себя:

1. руководство системного программиста;

2. руководство пользователя;

3. ведомость эксплуатационных документов.

Программа и методика испытания соответствует требованию согласованного и утвержденного технического задания. Программная документация, входящая в предварительный перечень, соответствует требованиям ГОСТА 19.106-78.

2.5 Стадии и этапы разработки

Стадия "Формирование требований к программе «Разноцветные кубики» " включает в себя выполнение следующих этапов:

· Обследование объекта и обоснованность необходимости создания игры;

· Формирование требований заказчика к программному продукту;

· Оформление Отчета о выполненной работе, и Заявки на разработку игры.

На этапе "Обследование объекта и обоснование необходимости создания игры " в общем случае проводится:

· Сбор данных об объекте;

· Оценка качества функционирования объекта;

· Выявление проблем, решение которых возможно средствами автоматизации;

· Оценка технико-экономической целесообразности создания игрового программного продукта.

На этапе "Формирование требований Заказчика к игре" проводится:

· Подготовка исходных данных для формирования требований к игре (характеристика объекта автоматизации, описание требований к системе, допустимые затраты на разработку, ввод в действие и эксплуатацию, эффект, ожидаемый от системы, условия создания и функционирования системы);

На этапе Оформление Отчета о выполненной работе, и заявки на разработку игры производится:

· Оформление Отчета о выполненных работах на данной стадии;

· Оформление Заявки на разработку «Разноцветные кубики» (тактико-технического задания) или другого заменяющего его документа с аналогичным содержанием.

Стадия Разработка концепции игры заключается в выполнении следующих этапов:

· Изучение объекта;

· Проведение необходимых научно-исследовательских работ;

· Разработка вариантов концепции и выбор варианта концепции к игре в соответствии с требованиями Заказчика.

На этапе "Разработка вариантов концепции и выбор варианта концепции игры в соответствии с требованиями Заказчика" в общем случае проводится:

· Разработка альтернативных вариантов концепции и планов их реализации;

· Оценка необходимых ресурсов на их реализацию и функционирование;

· Оценка преимуществ и недостатков каждого варианта;

· Определение порядка оценки качества и условий приемки системы;

Стадия "Техническое задание" заключается в единственном, но чрезвычайно ответственном этапе:

· Разработка и утверждение Технического задания на создание «Разноцветные кубики».

На этапе "Разработка и утверждение Технического задания на создание игры " проводится:

· Разработка, оформление, согласование и утверждение Технического задания на создание игрового продукта.

Стадия "Эскизный проект" состоит из следующих этапов:

· Разработка предварительных проектных решений;

· Разработка документации на «программный продукт.

На этапе "Разработка предварительных проектных решений по Системе и ее частям" определяются:

· Функции игрового продукта;

· Функции и цели подсистем;

· Состав программных комплексов и отдельных задач;

· Состав комплекса технических средств;

· Функции и параметры основных программных средств и ресурсов.

· На этапе "Разработка документации на программу «Разноцветные кубики» " проводится:

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

Стадия "Технический проект" состоит из следующих этапов:

· Разработка проектных решений по Системе и ее частям;

· Разработка документации на игру и ее части;

· Разработка и оформление документации на поставку изделий для комплектования программного продукта и технических требований (технических заданий) на их разработку;

На этапе "Разработка проектных решений по Системе и ее частям" производится разработка общих решений:

· По Системе и ее частям;

· По функционально-алгоритмической структуре Системы;

· По функциям персонала и организационной структуре;

· По структуре технических средств;

· По алгоритмам решения задач и применяемым языкам;

· По программному обеспечению.

На этапе "Разработка документации на АСУТП и ее части" проводится:

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

На этапе "Разработка и оформление документации на поставку изделий для комплектования игры и технических требований (технических заданий) на их разработку" проводится:

· Подготовка и оформление документации на поставку изделий для комплектования;

· Определение технических требований или составление ТЗ на разработку несерийных изделий.

Стадия "Рабочий проект (Рабочая документация)" включает в себя следующие этапы:

· Разработка рабочей документации на программу и ее части;

· Разработка и конфигурация программного обеспечения.

На этапе "Разработка рабочей документации на игру и ее части" осуществляется:

· Разработка рабочей документации, содержащей все необходимые и достаточные сведения для обеспечения выполнения работ по вводу в действие и для её эксплуатации, а также для сохранения уровня эксплуатационных характеристик системы в соответствии с принятыми

проектными решениями;

· Оформление, согласование и утверждение рабочей документации на «Разноцветные кубики».

На этапе "Разработка и конфигурация программного обеспечения" проводится:

· Разработка прикладного программного обеспечения;

· Выбор, адаптация и привязка программных средств, разработка программной документации.

Стадия "Ввод в действие" состоит из следующих этапов:

Подготовка объекта автоматизации к вводу «Разноцветные кубики» в действие;

· Подготовка персонала;

· Пусконаладочные работы;

· Проведение Предварительных испытаний;

· Проведение Опытной эксплуатации;

· Проведение Приемочных испытаний.

На этапе "Подготовка объекта автоматизации к вводу «Разноцветные кубики» в действие" проводятся работы по организационной подготовке объекта автоматизации к вводу в действие, в том числе:

· Реализация проектных решений по организационной структуре

«Разноцветные кубики»;

· Обеспечение подразделений объекта управления инструктивно-методическими материалами.

На этапе "Подготовка персонала" проводится:

· Обучение персонала;

· Проверка его способности обеспечить функционирование программы.

На этапе "Пусконаладочные работы" проводится:

· Автономная наладка технических средств;

· Загрузка системного и прикладного программного обеспечения;

· Комплексная наладка всех средств системы.

На этапе "Проведение Предварительных испытаний" осуществляются:

· Испытания игры на работоспособность и соответствие Техническому заданию и в соответствии с Программой предварительных

испытаний;

· Устранение неисправностей и внесение изменений в документацию на игру в соответствии с Протоколом испытаний;

· Оформление Акта о приемке «Разноцветные кубики» в Опытную эксплуатацию.

На этапе "Проведение Приемочных испытаний" проводятся:

· Испытания на соответствие Техническому заданию и в соответствии с Программой приемочных испытаний;

· Анализ результатов испытаний «Разноцветные кубики» и устранение недостатков, выявленных при испытаниях;

· Оформление Протокола и Отчета по каждому объекту испытаний, определенному Программой испытаний;

2.6 Требования к эргономике и технической эстетике

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

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

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

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

недопустимыми значениями входных данных.

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

Экранные формы с проектированы с учетом требований унификации:

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

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

- внешнее поведение сходных элементов интерфейса (реакция на наведение указателя «мыши», переключение фокуса, нажатие кнопки) реализовывались одинаково для однотипных элементов.

Система соответствует требованиям эргономики и профессиональной медицины при условии комплектования высококачественным оборудованием (ПЭВМ, монитор и прочее оборудование), имеющим необходимые сертификаты соответствия и безопасности Госстандарта.

3. Технические сведения программного средства

3.1 Общая архитектура программного средства

Общая архитектура программного продукта «Разноцветные кубики» представлена на Рисунке 1.

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

3.2 Реализация функционального назначения программного средства

Функциональное назначение программного средства «Разноцветные кубики» изображено в виде схемы на Рисунке 2.

3.3 Разработка алгоритма решения задачи

Алгоритм решения задачи представлен графически в виде блок-схемы

на Рисунке 3.

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

3.4 Структурная организация данных

3.5 Разработка интерфейса ПС

Интерфейс программного средства представляет собой удобную среду для пользователя.

Эскиз графического интерфейса пользователя представлен на Рисунке 4 (Приложение 1).

4. Руководство пользователя

4.1 Назначение и условия применения программного средства

Функциональным назначением программы «Разноцветные кубики» является развитие логического мышления.

Минимальные требования к ЭВМ для работы программы «Разноцветные кубики»

Таблица 1 - Минимальные требования к ЭВМ

Технические средства:

Процессор

AMD, Athlon, Celeron

Частота процессора

1.6 ГГц или выше

Количество процессоров

1 и выше

Объем установленной памяти

256 Mb и выше

Объемы жесткого диска

20 Гб и выше

Дисковая подсистема

Интерфейс SCSI, аппаратно RAID-5

CD/DVD

DVD-ROM

Видеоадаптер

интегрированный

Звуковая карта

интегрированная

Порты

клавиатура PS/2 - 1 мышь PS/2 - 1, USB - 2

Программные средства

ОС

Windows ХР

Для использования программы необходимо выделить файл с именем «RubiksCube.exe» далее нажимаем правую кнопку мыши и выбираем открыть или копировать в нужную папку и сохраняем, открываем.

4.2 Характеристика программного средства

Данная программа предназначена для развития логического мышления, укрепления навыков работы с манипулятором мышь. Для работы с ней нужно запустить файл «RubiksCube.exe».

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

4.3 Работа с программным средством

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

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

Игра «Разноцветные кубики » загружается намного быстрее других аналогичных программ.

Инструкция по эксплуатации программы:

Загрузка игры:

Загрузите игру и она уже будет готова к использованию;

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

4.4 Эксплуатация программного средства

Стадия эксплуатации программного средства охватывает процессы хранения, внедрения и сопровождения программного средства, а также транспортировки и применения программного изделия по своему назначению. Программа будет прекрасно работать от плюс 15 до плюс 35 °C при относительной влажности 70% и атмосферном давлении 462 мм.рт.ст., поскольку такие условия приблизительно соответствуют условиям эксплуатации современных компьютеров непромышленного исполнения.

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

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

Конечный пользователь программы (оператор) должен обладать практическими навыками работы с графическим пользовательским интерфейсом операционной системы.

Персонал должен быть аттестован на II квалификационную группу по электробезопасности (для работы с конторским оборудованием).

Персонал, не имеющий II квалификационной группы по электробезопасности, не имеет права даже близко подходить к ПЭВМ и конторскому оборудованию.

Заключение

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

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

В процессе разработки программы «Разноцветные кубики» расширены навыки самостоятельной деятельности.

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

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

Программа написана на языке программирования Borland Delphi 7, которая позволяет программисту свободно ориентироваться в программе, использовать ресурсы программы на сто процентов, и делать программы доступными как для начинающего пользователя так и для профессионалов.

программный delphi разноцветный кубик

Список литературы

1. Архангельский А.Я. Программирование в Delphi 5. -- М., БИНОМ, 2007.

2. Вендров А.М. Проектирование программного обеспечения экономических информационных систем. ? М.: Финансы и статистика, 2007.

3. Вендров А.М. Проектирование программного обеспечения, 2007. ?

4. Ван Тассел. Д. Стиль, разработка, эффективность, отладка и испыта ние программ. - М.: Мир, 2005

5. Гинкул Г.П. Игровой подход к приобретению знаний и его реализация в системе КАПРИЗ. Проблемы применения экспертных систем в народном хозяйстве. Тез. докл. респ. школы-семинара. Кишинев. 2009.

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

7. Епанешников А., Епанешников В. Программирование в среде Delphi 2.0. Епанешников А., Епанешников В. Программирование в среде Delphi 2.0.

8. Жоголев. Е.А. Введение в технологию программирования (конспект лекций). - М.: "ДИАЛОГ-МГУ", 2008.

9. Минский М. Фреймы для представления знаний. -- М.: Мир, 2009.

10. Попов Э. В. Особенности разработки и использования экспертных систем// Искусственный интеллект. Кн. 1. Системы общения и экспертные системы. -- М.: Радио и связь, 2008.

11. Немнюгин С.А. Программирование на языке высокого уровня. ? М.: Просвещение, 2006.

12. Никифоров В.В. Основы разработки программных продуктов. ? М.: Просвещение, 2006.

13. Рудаков А.В. Технология разработки программных продуктов. ? М.: Академия, 2006.

14. Соммервил И. Инженерия программного обеспечения. ? М.: СПб.: Ки ев: Изд. Дом «Вильямс», 2007.

15. Соммервил И. Инженерия программного обеспечения. ? М.: СПб.: Киев: Изд. Дом «Вильямс», 2007.

16. Таунсенд К., Фохт Д. Проектирование и программная реализация экспертных систем на персональных ЭВМ. -- М.: Финансы и статистика, 2005.

17. Таунсенд К., Фохт Д. Проектирование и реализация экспертных систем на ПЭВМ. М., Финансы и статистика, 2007.

18. Хомоненко А. Гофман В. Delphi 7 в подлиннике. ? М.: Просвещение, 2006.

19. Фокс. Дж. Программное обеспечение и его разработка. - М.: Мир, 2005.

20. «Компьютерное проектирование программного обеспечения» / Издательство Московского университета, 2007.

21. Компьютерное проектирование программного обеспечения. - Изда тельство Московского университета, 2007.

22. «Объектно- ориентированное программирование» / Иванова Г.С., Ничушкина Т. Н., Пугачев Е. К.

23. «Программное обеспечение и его разработка» / Фокс. Дж../ М.: Мир / 2005 год.

24. «Разработка графических и мультемедийных приложений» / Жарков В.А.

25. «Стиль, разработка, эффективность, отладка и испытание программ» / Ван Тассел. Д. / М.: Мир /.

26. Учебное пособие. В 4-х частях. Ч.1. Описание среды. - М.:ДИАЛОГ-МИФИ, 2007.

27. Учебное пособие. В 4-х частях. Ч.2. Язык Object Pascal 9.0. - М.:ДИАЛОГ-МИФИ, 2007.

28. « Языки программирования» / О.Л. Голицына, Т. Л. Партыка, И. И. Попов / Издательство: Инфра-М, Форум / 2008 год / ISBN: 978-5-91134-171-8, 978-5-16-003200-9

Приложение 1

Рисунок 1 - Архитектура программного продукта

Рисунок 2 - Функциональное назначение программы «Разноцветные кубики»

Рисунок 3 - Блок схема программы «Разноцветные кубики»

Рисунок 4- Графический интерфейс программы

Приложение 2 Код программы

unit RubicsCube;

interface

uses Windows, Classes, OpenGL, Graphics, ComCtrls, SyncObjs, Commands, Forms,Controls;

type

TScene = class;

// Описание одной грани

TPlane = class

private

Scene: TScene; // Привязка к сцене для отображения

NIndex: integer; // Индекс нормали

Normal: TPoint3Di; // Нормаль к грани

FIColor: integer; // Индекс цвета

VColor: GLColor;

Points: array [0..3] of TPoint3Df;

RNormal: TPoint3Di;

Angle: Double;

SIndex: integer; // Индекс грани для выбора

procedure SetColor(V:integer);

protected

property Color: integer read FIColor write SetColor;

procedure Translate(x, y, z:GLFloat);

procedure Rotated(A:GLFloat; N:TPoint3Di);

procedure Draw(reflection:boolean; mode: GLenum);

public

constructor Create(NI:integer; a:GLFloat);

destructor Destroy; override;

end;

TCube = class

private

// Описание граней кубика

// Нумерация граней 1-(+X), 2-(+Y), 3-(+Z), 4-(-Z), 5-(-Y), 6-(-Z)

Planes: array [1..6] of TPlane;

protected

procedure Translate(x, y, z:GLFloat);

procedure MakeViewPlanes(Owner:TScene);

procedure Rotated(A:GLFloat; N:TPoint3Di);

procedure RotateColorIndex(A:array of integer);

public

constructor Create(a:GLFloat; dx, dy, dz:GLFloat);

destructor Destroy; override;

end;

TRubiksCube = class;

TCubePlane = class

private

FOwner: TRubiksCube; // 1 2 3

FIndex: integer; // Индекс нормали для грани 8 9 4

FCubes: array [1..9] of integer; // номера кубиков по спирали 7 6 5

procedure SetFaceColor(N:integer);

function GetCube(index:integer):TCube;

protected

property Index: integer read FIndex;

property Cubes[index:integer]:TCube read GetCube;

procedure Rotated(A:GLFloat);

procedure Rotate(A, RotateFace:boolean);

public

constructor Create(aOwner:TRubiksCube; FaceIndex:integer; Cubes:array of integer);

end;

TRubiksCube = class

private

FViewCommands: TStatusBar;

FScene: TScene;

// Описание всех кубиков

Cubes: array [1..27] of TCube;

FCubePlanes: array [1..9] of TCubePlane;

FCmdBuffer: String;

FCommand: String;

FCS: TCriticalSection;

TimerID: UINT;

FRotated: integer;

FCurCommand: byte;

FAngle: GLFloat;

procedure MakeViewPlanes;

procedure SetViewCommands(L:TStatusBar);

procedure NextStep;

function FullCommand: String;

protected

procedure Rotated(A:GLFloat; Normal:TPoint3Di);

procedure ShowCommands;

procedure StepCommand;

procedure StopRotate;

procedure Rotate(Plane, C:integer);

procedure RunCommand(C:byte);

procedure RotateColorIndex(Plane, C:integer);

public

constructor Create(aScene:TScene);

destructor Destroy; override;

procedure DoCommands(S:String);

property ViewCommands: TStatusBar read FViewCommands write SetViewCommands;

procedure BackStep;

procedure BackAll;

end;

TScene = class

private

FForm: TForm;

FStatusBar: TStatusBar;

Handle: THANDLE;

DC: HDC;

HRC: HGLRC;

FPlanes: TList;

FCube: TRubiksCube;

protected

procedure SetViewMatrix(PickX, PickY:integer);

procedure Add(P:TPlane);

procedure Remove(P:TPlane);

procedure Refresh;

procedure DrawPlanes(mode:GLenum);

function GetSelectPlane(X, Y:integer):integer;

procedure OnPaint(Sender:TObject);

procedure OnResize(Sender: TObject);

procedure OnMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

public

constructor Create(aForm:TForm; StatusBar: TStatusBar);

destructor Destroy; override;

end;

implementation

uses MMSystem, SysUtils, Dialogs;

const CSIZE = 0.2; // Половина ребра кубика

CINTERVAL = 0.45; // Расстояние между центрами кубика

const

// Нормали к граням куба

CNormals: array [0..6] of TPoint3Di =

((x: 0; y: 0; z: 0),

(x: 1; y: 0; z: 0),

(x: 0; y: 1; z: 0),

(x: 0; y: 0; z: 1),

(x: 0; y: 0; z:-1),

(x: 0; y:-1; z: 0),

(x:-1; y: 0; z: 0)

);

// Точки куба

CVertices: array [1..8] of TPoint3Di =

((x: 1; y: 1; z: 1),

(x:-1; y: 1; z: 1),

(x:-1; y: 1; z:-1),

(x: 1; y: 1; z:-1),

(x:-1; y:-1; z: 1),

(x: 1; y:-1; z: 1),

(x: 1; y:-1; z:-1),

(x:-1; y:-1; z:-1)

);

// Номера точек по граням

CPoints: array [1..6] of array [1..4] of integer =

((1, 6, 7, 4),

(1, 4, 3, 2),

(1, 2, 5, 6),

(3, 4, 7, 8),

(8, 7, 6, 5),

(2, 3, 8, 5)

);

const

// Боковые грани по часовой стрелке

WPlanes: array [1..6] of array [1..4] of integer =

((3, 2, 4, 5),

(3, 6, 4, 1),

(5, 6, 2, 1),

(2, 6, 5, 1),

(3, 1, 4, 6),

(3, 5, 4, 2)

);

var PlaneColors: array [0..6] of GLColor =

((0.3, 0.3, 0.3),

(1.0, 1.0, 1.0),

(1.0, 0.0, 0.0),

(0.0, 1.0, 0.0),

(0.0, 0.0, 1.0),

(1.0, 0.7, 0.3),

(1.0, 1.0, 0.0));

procedure RotateColors(Plane, A:integer); forward;

procedure TimeProc(uTimerID, uMessage: UINT; data, dw1, dw2: DWORD) stdcall; forward;

// NI - индекс нормали

// a - длина половины ребра

constructor TPlane.Create(NI:integer; a:GLFloat);

var i:integer;

begin

inherited Create;

NIndex:= NI;

Normal:= CNormals[NIndex];

for i:= 0 to 3 do begin

Points[i]:= Point3Df(

CVertices[CPoints[NIndex][i+1]].x * a,

CVertices[CPoints[NIndex][i+1]].y * a,

CVertices[CPoints[NIndex][i+1]].z * a

);

end;

Color:= 0;

end;

destructor TPlane.Destroy;

begin

if Scene <> nil then Scene.Remove(Self);

inherited Destroy;

end;

procedure TPlane.SetColor(V:integer);

begin

FIColor:= V;

VColor:= PlaneColors[V];

end;

procedure TPlane.Translate(x, y, z:GLFloat);

var i:integer;

begin

for i:= 0 to 3 do Points[i].Translate(x, y, z);

end;

procedure TPlane.Rotated(A:GLFloat; N:TPoint3Di);

begin

Angle:= A;

RNormal:= N

end;

constructor TCube.Create(a:GLFloat; dx, dy, dz:GLFloat);

var i:integer;

begin

inherited Create;

for i:= 1 to 6 do

Planes[i]:= TPlane.Create(i, a);

Translate(dx, dy, dz);

end;

destructor TCube.Destroy;

var i:integer;

begin

for i:= 1 to 6 do Planes[i].Free;

inherited Destroy;

end;

procedure TCube.Translate(x, y, z:GLFloat);

var i:integer;

begin

for i:= 1 to 6 do Planes[i].Translate(x, y, z);

end;

procedure TCube.MakeViewPlanes(Owner:TScene);

var i:integer;

begin

for i:= 1 to 6 do Owner.Add(Planes[i]);

end;

procedure TCube.Rotated(A:GLFloat; N:TPoint3Di);

var i:integer;

begin

for i:= 1 to 6 do Planes[i].Rotated(A, N);

end;

// A - массив соответствия индексво цветов

// индексу i после преобразования соответствует индекс A[i]

procedure TCube.RotateColorIndex(A:array of integer);

var i:integer;

begin

for i:= 1 to 6 do Planes[i].Color:= A[Planes[i].Color];

end;

function TCubePlane.GetCube(index:integer):TCube;

begin

result:= FOwner.Cubes[FCubes[index]];

end;

procedure TCubePlane.Rotated(A:GLFloat);

var i:integer;

begin

for i:= 1 to 9 do Cubes[i].Rotated(A, CNormals[Index]);

end;

procedure TCubePlane.Rotate(A, RotateFace:boolean);

const

CI: array [boolean] of array [1..4*3] of integer =

((1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 1),

(7, 8, 1, 5, 6, 7, 3, 4, 5, 1, 2, 3));

var N, N1:integer;

t1, t2, t3, i, k, kn:integer;

begin

if A then k:= 4 else k:= 1;

N:= WPlanes[FIndex][k];

t1:= Cubes[ CI[A][1] ].Planes[N].Color;

t2:= Cubes[ CI[A][2] ].Planes[N].Color;

t3:= Cubes[ CI[A][3] ].Planes[N].Color;

for i:= 0 to 2 do begin

if A then dec(k) else inc(k);

N1:= WPlanes[FIndex][k];

kn:= i*3;

Cubes[ CI[A][kn+1] ].Planes[N].Color:= Cubes[ CI[A][kn+4] ].Planes[N1].Color;

Cubes[ CI[A][kn+2] ].Planes[N].Color:= Cubes[ CI[A][kn+5] ].Planes[N1].Color;

Cubes[ CI[A][kn+3] ].Planes[N].Color:= Cubes[ CI[A][kn+6] ].Planes[N1].Color;

N:= N1;

end;

kn:= 3*3;

Cubes[ CI[A][kn+1] ].Planes[N].Color:= t1;

Cubes[ CI[A][kn+2] ].Planes[N].Color:= t2;

Cubes[ CI[A][kn+3] ].Planes[N].Color:= t3;

if not RotateFace then exit;

// 7 5 3 1 - против часовой, 1 3 5 7 - по часовой

if A then k:= 7 else k:= 1;

kn:= k;

t1:= Cubes[ k ].Planes[FIndex].Color;

t2:= Cubes[ k+1 ].Planes[FIndex].Color;

for i:= 0 to 2 do begin

if A then dec(kn, 2) else inc(kn, 2);

Cubes[ k ].Planes[FIndex].Color:= Cubes[ kn ].Planes[FIndex].Color;

Cubes[ k+1 ].Planes[FIndex].Color:= Cubes[ kn+1 ].Planes[FIndex].Color;

k:= kn;

end;

Cubes[ k ].Planes[FIndex].Color:= t1;

Cubes[ k+1 ].Planes[FIndex].Color:= t2;

end;

constructor TCubePlane.Create(aOwner:TRubiksCube; FaceIndex:integer; Cubes:array of integer);

var i:integer;

begin

inherited Create;

FOwner:= aOwner;

FIndex:= FaceIndex;

for i:= 1 to 9 do FCubes[i]:= Cubes[i-1];

end;

constructor TRubiksCube.Create(aScene:TScene);

var a:GLFloat;

x, y, z, i:integer;

begin

inherited Create;

FCS:= TCriticalSection.Create;

FScene:= aScene;

FScene.FCube:= Self;

a:= CINTERVAL;

for x:= -1 to 1 do

for y:= -1 to 1 do

for z:= -1 to 1 do

Cubes[(z+1)*9+(y+1)*3+(x+1)+1]:= TCube.Create(CSIZE, x*a, y*a, z*a);

FCubePlanes[1]:= TCubePlane.Create(Self, 1, [21, 24, 27, 18, 9, 6, 3, 12, 15]);

FCubePlanes[2]:= TCubePlane.Create(Self, 2, [27, 26, 25, 16, 7, 8, 9, 18, 17]);

FCubePlanes[3]:= TCubePlane.Create(Self, 3, [21, 20, 19, 22, 25, 26, 27, 24, 23]);

FCubePlanes[4]:= TCubePlane.Create(Self, 4, [ 9, 8, 7, 4, 1, 2, 3, 6, 5]);

FCubePlanes[5]:= TCubePlane.Create(Self, 5, [19, 20, 21, 12, 3, 2, 1, 10, 11]);

FCubePlanes[6]:= TCubePlane.Create(Self, 6, [25, 22, 19, 10, 1, 4, 7, 16, 13]);

FCubePlanes[7]:= TCubePlane.Create(Self, 1, [20, 23, 26, 17, 8, 5, 2, 11, 14]);

FCubePlanes[8]:= TCubePlane.Create(Self, 2, [24, 23, 22, 13, 4, 5, 6, 15, 14]);

FCubePlanes[9]:= TCubePlane.Create(Self, 3, [12, 11, 10, 13, 16, 17, 18, 15, 14]);

for i:= 1 to 6 do FCubePlanes[i].SetFaceColor(i);

MakeViewPlanes;

TimerID:= timeSetEvent(5, 0, @TimeProc, Cardinal(Self), TIME_PERIODIC);

end;

procedure TRubiksCube.MakeViewPlanes;

var i:integer;

begin

for i:= 1 to 27 do

if Cubes[i] <> nil then Cubes[i].MakeViewPlanes(FScene);

end;

procedure TRubiksCube.SetViewCommands(L:TStatusBar);

begin

FViewCommands:= L;

if L = nil then exit;

end;

function TRubiksCube.FullCommand: String;

begin

result:= FCommand;

if FCurCommand <> 0

then result:= result + chr(FCurCommand);

result:= result + FCmdBuffer;

end;

procedure TRubiksCube.NextStep;

var C:byte;

begin

FCS.Enter;

try

if length(FCmdBuffer) = 0 then exit;

C:= ord(FCmdBuffer[1]);

if length(FCmdBuffer) = 1

then FCmdBuffer:= ''

else FCmdBuffer:= copy(FCmdBuffer, 2);

// Команда x2 заменяется на две xx

if (C and $0F) = 2 then begin

C:= (C and $F0)+1;

FCmdBuffer:= Chr(C) + FCmdBuffer;

end;

FCurCommand:= C;

FAngle:= 0;

if C and $0F = 1 then FRotated:= 1 else FRotated:= -1;

finally

FCS.Leave;

end;

end;

procedure TRubiksCube.ShowCommands;

begin

if FViewCommands = nil then exit;

FViewCommands.Panels[0].Text:=

'('+IntToStr(CountCommands(FCommand))+') '+

CommandToString(FCommand);

FViewCommands.Refresh;

end;

procedure TRubiksCube.StepCommand;

var Plane: byte;

begin

FAngle:= FAngle + 2;

if FAngle >= 90 then begin

StopRotate;

exit;

end;

Plane:= (FCurCommand and $F0) shr 4;

if Plane > 6

then Rotated(-FAngle*FRotated, CNormals[Plane-10])

else FCubePlanes[Plane].Rotated(-FAngle*FRotated);

FScene.Refresh;

end;

procedure TRubiksCube.StopRotate;

begin

FAngle:= 0;

FRotated:= 0;

Rotated(0, CNormals[0]);

RunCommand(FCurCommand);

FCS.Enter;

try

if ((FCurCommand and $F0) shr 4) <= 6

then FCommand:= ConcatCommands(FCommand, chr(FCurCommand));

FCurCommand:= 0;

finally

FCS.Leave;

end;

ShowCommands;

FScene.Refresh;

end;

procedure TRubiksCube.Rotated(A:GLFloat; Normal:TPoint3Di);

var i:integer;

begin

for i:= 1 to 27 do Cubes[i].Rotated(A, Normal);

end;

procedure TRubiksCube.Rotate(Plane, C:integer);

begin

FCubePlanes[Plane].Rotate((4-C) = 1, true); // Указанная грань

FCubePlanes[7-Plane].Rotate(C = 1, true); // Противоположная грань

FCubePlanes[Plane+6].Rotate((4-C) = 1, false); // Средняя грань

RotateColors(Plane, C);

RotateColorIndex(Plane, C);

FCommand:= RotateCommand(FCommand, Plane, C=3);

end;

procedure TRubiksCube.RunCommand(C:byte);

var Plane: byte;

begin

Plane:= (FCurCommand and $F0) shr 4;

if Plane > 6

then Rotate(Plane-10, 4-(C and $0F))

else FCubePlanes[Plane].Rotate((C and $0F) = 1, true);

end;

// X, X', Y, Y', Z, Z',

// L, R, T, F, B, D L', L2

procedure TRubiksCube.DoCommands(S:String);

begin

FCS.Enter;

try

FCmdBuffer:= FCmdBuffer + StringToCommand(S);

finally

FCS.Leave;

end;

end;

procedure TRubiksCube.BackStep;

var S:String;

C:Char;

begin

FCS.Enter;

try

S:= FullCommand;

if length(S) = 0 then exit;

C:= S[length(S)];

FCmdBuffer:= FCmdBuffer + InverCommand(C);

finally

FCS.Leave;

end;

end;

procedure TRubiksCube.BackAll;

begin

FCS.Enter;

try

FCmdBuffer:= FCmdBuffer + InvertCommands(FullCommand);

finally

FCS.Leave;

end;

end;

procedure RotateColors(Plane, A:integer);

var t:GLColor;

begin

if A = 1 then begin

t:= PlaneColors[WPlanes[Plane][1]];

PlaneColors[WPlanes[Plane][1]]:= PlaneColors[WPlanes[Plane][2]];

PlaneColors[WPlanes[Plane][2]]:= PlaneColors[WPlanes[Plane][3]];

PlaneColors[WPlanes[Plane][3]]:= PlaneColors[WPlanes[Plane][4]];

PlaneColors[WPlanes[Plane][4]]:= t;

end else begin

t:= PlaneColors[WPlanes[Plane][4]];

PlaneColors[WPlanes[Plane][4]]:= PlaneColors[WPlanes[Plane][3]];

PlaneColors[WPlanes[Plane][3]]:= PlaneColors[WPlanes[Plane][2]];

PlaneColors[WPlanes[Plane][2]]:= PlaneColors[WPlanes[Plane][1]];

PlaneColors[WPlanes[Plane][1]]:= t;

end;

end;

procedure TRubiksCube.RotateColorIndex(Plane, C:integer);

var A:array [0..6] of integer;

i:integer;

begin

A[0]:= 0;

A[Plane]:= Plane;

A[7-Plane]:= 7-Plane;

if C = 3 then begin

A[ WPlanes[Plane][1] ]:= WPlanes[Plane][2];

A[ WPlanes[Plane][2] ]:= WPlanes[Plane][3];

A[ WPlanes[Plane][3] ]:= WPlanes[Plane][4];

A[ WPlanes[Plane][4] ]:= WPlanes[Plane][1];

end else begin

A[ WPlanes[Plane][1] ]:= WPlanes[Plane][4];

A[ WPlanes[Plane][4] ]:= WPlanes[Plane][3];

A[ WPlanes[Plane][3] ]:= WPlanes[Plane][2];

A[ WPlanes[Plane][2] ]:= WPlanes[Plane][1];

end;

for i:= 1 to 27 do Cubes[i].RotateColorIndex(A);

end;

destructor TRubiksCube.Destroy;

var i:integer;

begin

timeKillEvent(TimerID);

for i:= 1 to 27 do begin

if Cubes[i] <> nil then Cubes[i].Free;

end;

for i:= 1 to 9 do begin

if FCubePlanes[i] <> nil then FCubePlanes[i].Free;

end;

FCS.Free;

inherited Destroy;

end;

procedure TimeProc(uTimerID, uMessage: UINT; data, dw1, dw2: DWORD) stdcall;

var RubiksCube: TRubiksCube;

begin

RubiksCube:= TRubiksCube(data);

if RubiksCube = nil then exit;

if RubiksCube.FRotated <> 0 then begin

RubiksCube.StepCommand;

exit;

end;

if length(RubiksCube.FCmdBuffer) = 0 then exit;

RubiksCube.NextStep;

end;

procedure TScene.Add(P:TPlane);

begin

if P = nil then exit;

FPlanes.Add(P);

P.Scene:= Self;

end;

procedure TScene.Remove(P:TPlane);

begin

FPlanes.Remove(P);

end;

procedure TScene.Refresh;

begin

InvalidateRect(Handle, nil, False);

end;

procedure SetDCPixelFormat (hdc: HDC);

var pfd: TPixelFormatDescriptor;

nPixelFormat: Integer;

begin

FillChar (pfd, SizeOf (pfd), 0);

pfd.dwFlags:=

PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;

nPixelFormat:= ChoosePixelFormat (hdc, @pfd);

SetPixelFormat (hdc, nPixelFormat, @pfd);

end;

constructor TScene.Create(aForm:TForm; StatusBar: TStatusBar);

begin

inherited Create;

FPlanes:= TList.Create;

FForm:= aForm;

FStatusBar:= StatusBar;

Handle:= FForm.Handle;

DC:= GetDC(Handle);

SetDCPixelFormat(DC);

hrc:= wglCreateContext(DC);

wglMakeCurrent(DC, hrc);

glClearColor (0.1, 0.5, 0.75, 1.0);

glColor3f (0.0, 0.1, 0.1);

glEnable(GL_LIGHTING);

glEnable(GL_LIGHT0);

glEnable(GL_LIGHT1);

glEnable(GL_DEPTH_TEST);

glEnable(GL_COLOR_MATERIAL);

glEnable(GL_CULL_FACE);

FForm.OnPaint:= OnPaint;

FForm.OnReSize:= OnReSize;

FForm.OnMouseDown:= OnMouseDown;

end;

destructor TScene.Destroy;

begin

FForm.OnMouseDown:= nil;

FForm.OnReSize:= nil;

FForm.OnPaint:= nil;

wglMakeCurrent(DC, 0);

wglDeleteContext(hrc);

ReleaseDC(Handle, DC);

DeleteDC(DC);

FPlanes.Free;

inherited Destroy;

end;

procedure TScene.OnPaint(Sender:TObject);

const LightPos0: Array [0..3] of GLfloat = (4, 3, 4, 1);

const LightPos1: Array [0..3] of GLfloat = (-4, -2, 2.2, 1);

begin

glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

glColor3f (0.0, 0.0, 0.0);

glLightfv (GL_LIGHT0, GL_POSITION, @LightPos0);

glLightfv (GL_LIGHT1, GL_POSITION, @LightPos1);

//glPushMatrix;

//glRotated (spin, 1.0, 0.0, 0.0);

//glLightfv (GL_LIGHT0, GL_POSITION, @LightPos);

//glTranslated (LightPos1[0], LightPos1[1], LightPos1[2]);

//glTranslated (LightPos0[0], LightPos0[1], LightPos0[2]);

//glDisable (GL_LIGHTING);

//glutWireCube (0.1);

//glEnable (GL_LIGHTING);

//glPopMatrix;

DrawPlanes(GL_RENDER);

SwapBuffers(DC);

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

//inc(countFrame);

//NTime:= GetTickCount;

//if NTime - LTime >= 1000 then begin

//

// FMain.Caption:= 'FPS: '+intToStr(trunc(countFrame * 1000 / (NTime - LTime)));

// LTime:= NTime;

// countFrame:= 0;

//end;

end;

procedure TCubePlane.SetFaceColor(N:integer);

var c:integer;

begin

for c:= 1 to 9 do begin

Cubes[c].Planes[FIndex].Color:= N;

if N <= 3 then begin

Cubes[c].Planes[FIndex].SIndex:= N*10+c;

end;

end;

end;

procedure TPlane.Draw(reflection:boolean; mode: GLenum);

var i:integer;

begin

if (mode = GL_SELECT) then begin

// отраженные части не участвуют в выборе

if (reflection or (SIndex = 0)) then exit;

glLoadName(SIndex);

end;

glColor3f(VColor[0], VColor[1], VColor[2]);

glBegin(GL_QUADS);

glNormal3f(Normal.x, Normal.y, Normal.z);

if reflection then begin

for i:= 3 downto 0 do

glVertex3f(Points[i].x, Points[i].y, Points[i].z);

end else begin

for i:= 0 to 3 do

glVertex3f(Points[i].x, Points[i].y, Points[i].z);

end;

glEnd;

end;

procedure TScene.DrawPlanes(mode:GLenum);

procedure DrawScene(reflect:boolean);

var i:integer;

P:TPlane;

b:boolean;

begin

for i:= 0 to FPlanes.Count - 1 do begin

P:= TPlane(FPlanes[i]);

b:= P.RNormal.Empty;

if not b then begin

glPushMatrix;

glRotatef(P.Angle, P.RNormal.x, P.RNormal.y, P.RNormal.z);

end;

TPlane(FPlanes[i]).Draw(reflect, mode);

if not b then glPopMatrix;

end;

end;

procedure DrawReflection(P:TPoint3Df; N:TPoint3Di);

var mt: matrix;

begin

glPushMatrix;

reflectionmatrix(mt, P, N);

glMultMatrixf(@mt);

DrawScene(true);

glPopMatrix;

end;

begin

DrawScene(false);

if mode = GL_SELECT then exit;

DrawReflection(Point3Df(-1.7, 0, 0), Point3Di(1, 0, 0));

DrawReflection(Point3Df(0, -1.7, 0), Point3Di(0, 1, 0));

DrawReflection(Point3Df(0, 0, -1.5), Point3Di(0, 0, 1));

end;

procedure TScene.OnResize(Sender: TObject);

begin

SetViewMatrix(-1, -1);

InvalidateRect(Handle, nil, False);

FStatusBar.Refresh;

end;

procedure TScene.SetViewMatrix(PickX, PickY:integer);

var W, H:integer;

vp: Array [0..3] of GLint;

begin

W:= FForm.ClientWidth;

H:= FForm.ClientHeight - FStatusBar.Height;

glViewport(0, 0, W, H);

glGetIntegerv(GL_VIEWPORT, @vp);

glMatrixMode(GL_PROJECTION);

glLoadIdentity;

if (PickX >= 0) and (PickY >= 0)

then gluPickMatrix(PickX, FForm.ClientHeight-PickY, 4, 4, @vp);

gluPerspective(40.0, W / H, 1.0, 20.0);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity;

gluLookAt (

5, 5, 4, // Координаты глаз наблюдателя

0.0, 0.0, -1.0, // координаты точки в центре экрана

0, 0, 1); // направление верктора, задающего поворот сцены

end;

function TScene.GetSelectPlane(X, Y:integer):integer;

const MAXSelect = 4;

var N: GLint;

SBuffer: array [0..MAXSelect-1] of GLuint;

begin

result:= 0;

SetViewMatrix(x, y);

glSelectBuffer(MAXSelect, @SBuffer);

glRenderMode(GL_SELECT);

glInitNames;

glPushName(0);

glClear(GL_COLOR_BUFFER_BIT);

DrawPlanes(GL_SELECT);

N:= glRenderMode(GL_RENDER);

if N > 0 then result:= SBuffer[3];

SetViewMatrix(-1, -1);

end;

procedure TScene.OnMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

const

commands: array [1..3] of // Planes

array [1..9] of // Cube in plane

array [boolean] of string = // [] [Ctrl]

(

(('T', 'Z'), ('YF!B', 'Y'), ('T!', 'Z!'), ('Z!TD!', 'Z!'),

('D', 'Z!'), ('Y!FB!', 'Y!'), ('D!', 'Z'), ('ZT!D', 'Z'), ('R!', 'X')),

(('L!', 'X!'), ('X!LR!', 'X!'), ('R', 'X!'), ('Z!TD!', 'Z!'),

('R!', 'X'), ('XL!R', 'X'), ('L', 'X'), ('ZT!D', 'Z'), ('B', 'Y!')),

(('B', 'Y!'), ('X!LR!', 'X!'), ('B!', 'Y'), ('YF!B', 'Y'),

('F', 'Y'), ('XL!R', 'X'), ('F!', 'Y!'), ('Y!FB!', 'Y!'), ('D', 'Z!'))

);

var N:integer;

S:String;

begin

if FCube.FRotated <> 0 then exit;

if Button <> mbLeft then exit;

N:= GetSelectPlane(X, Y);

if N > 0 then begin

S:= Commands[N div 10][N mod 10][ssCtrl in Shift];

if ssShift in Shift then S:= ReverseCmdString(S);

FCube.DoCommands(S);

end;

end;

end.

Размещено на Allbest.ru


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

  • Обоснование выбора языка программирования. Анализ входных и выходных документов. Логическая структура базы данных. Разработка алгоритма работы программы. Написание программного кода. Тестирование программного продукта. Стоимость программного продукта.

    дипломная работа [1008,9 K], добавлен 13.10.2013

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

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

  • Методы разработки автоматизированных систем. Характеристика языка программирования Delphi и операционной системы Windows. Назначение и область применение, принцип действия идентификаторов. Этапы разработки программного продукта, требования к нему.

    курсовая работа [903,9 K], добавлен 14.02.2015

  • Входные и выходные данные программы. Выбор языка программирования. Рабочая среда Delphi 7. Правила игры "Кости". Разработка пользовательского интерфейса. Экономическое обоснование программного продукта. Расчет расходов на содержание и эксплуатацию.

    дипломная работа [960,6 K], добавлен 07.02.2016

  • Разработка программы обработки типизированных файлов с кодом на языке Object Pascal, с использованием компонентов Delphi для ввода и вывода данных. Разработка экранных форм и алгоритма программы. Описание программных модулей и инструкция оператору.

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

  • Приемы программирования в Delphi. Алгоритм поиска альфа-бета отсечения, преимущества. Описание программного средства. Разработка программы, реализующая алгоритм игры "реверси". Руководство пользователя. Листинг программы. Навыки реализации алгоритмов.

    курсовая работа [357,1 K], добавлен 28.02.2011

  • Изучение общей структуры языка программирования Delphi: главные и дополнительные составные части среды программирования. Синтаксис и семантика языка программирования Delphi: алфавит языка, элементарные конструкции, переменные, константы и операторы.

    курсовая работа [738,1 K], добавлен 17.05.2010

  • Особенности алгоритмов, критерии качества. Создание и применение программного продукта на языке Delphi. Тип операционной системы. Внутренняя структура программного продукта. Руководство пользователя и программиста, расчет себестоимости и цены программы.

    дипломная работа [1,5 M], добавлен 12.06.2009

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

    курсовая работа [37,7 K], добавлен 03.05.2012

  • Delphi как новая версия компилятора языка Pascal. Знакомство с особенностями разработки программного средства "Инвентаризация незавершенного производства основных цехов в разрезе ярлыков". Характеристика этапов расчета себестоимости программного продукта.

    дипломная работа [1,9 M], добавлен 18.06.2013

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