Разработка программного продукта "Разноцветные кубики"
Применение языка 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.2012Delphi как новая версия компилятора языка Pascal. Знакомство с особенностями разработки программного средства "Инвентаризация незавершенного производства основных цехов в разрезе ярлыков". Характеристика этапов расчета себестоимости программного продукта.
дипломная работа [1,9 M], добавлен 18.06.2013