96614

Логічна гра «Рикошет»

Курсовая

Информатика, кибернетика и программирование

Мета даної роботи полягає в розробці програми, що моделюватиме відбивання променя від дзеркал та перешкод з якими зіштовхнеться. Використати в конструюванні цього програмного продукту принципи об’єктно-орієнтованих підходів.

Украинкский

2015-10-08

944.5 KB

0 чел.

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

БУКОВИНСЬКИЙ ДЕРЖАВНИЙ

ФІНАНСОВО-ЕКОНОМІЧНИЙ УНІВЕРСИТЕТ

ОБЛІКОВО-ЕКОНОМІЧНИЙ ФАКУЛЬТЕТ

КАФЕДРА КОМП’ЮТЕРНИХ НАУК

Пояснювальна записка

до курсового проекту з дисципліни

«Об’єктно-орієнтоване програмування»

на тему: логічна гра «Рикошет»

Виконав студент 2 курсу, групи КН-21

напряму підготовки

6.050101 – комп’ютерні науки

Денис Володимир Миколайович

   

   

Керівник                

наук. ступінь, вчене звання, П.І.Б.

В.о. зав. кафедри

наук. ступінь, вчене звання, П.І.Б.

Чернівці-2015



Лист-завдання

Форма № Н-9.01

Буковинський державний фінансово-економічний університет

Факультет

Обліково-економічний

Кафедра

Комп’ютерних наук

Освітньо-кваліфікаційний рівень

Бакалавр

Напрям підготовки

6.050101 – комп’ютерні науки

ЗАВДАННЯ

на курсовий проект студенту

Денис Володимир Миколайович

(прізвище, ім‘я, по батькові)

1. Тема проекту:

логічна гра «Рикошет»

Керівник проекту: Томка Юрій Ярославович

                          (прізвище, ім’я, по батькові, науковий ступінь, вчене звання)

2. Строк подання студентом проекту (роботи)    12 травня 2015 року

3. Вихідні дані до проекту (роботи):

4.  Зміст розрахунково-пояснювальної записки (перелік питань, що їх належить розробити):  Даний проект  необхідно виконати з допомогою OpenGL в середовищі

програмування Microsoft Visual Studio.

        Метою курсового проекту є написання програмного продукту, який моделює процес

відбивання деякого об’єкта від перешкоди та подальший його рух з врахуванням відбиття

Завданням гри є ураження всіх цілей. Використовуючи закони фізики потрібно уразити

всі цілі, причому м’ячик не має вийти за нижній край ігрового поля.

        Основним завданням даного курсового проекту є реалізація програмного продукту

з допомогою бібліотеки OpenGL та виконання поставлених завдань та інших вимог.

5.  Перелік графічного матеріалу (з точним зазначенням обов’язкових креслень, плакатів):

1. Інструкція користувача

КАЛЕНДАРНИЙ ПЛАН

№ з/п

Назва етапів курсового проекту (роботи)

Строк виконання етапів проекту (роботи)

Примітка

1

Видача завдань

20.02.2015

2

Ознайомлення з літературними джерелами за тематикою поставленої задачі

23.02.2015 – 06.03.2015

3

Розробка алгоритмів та вивчення засобів вирішення задачі курсового проектування

09.03.2015 – 20.03.2015

4

Написання програми і відладка на ПК

23.03.2015 – 24.04.2015

5

З'ясування одержаних проміжних теоретичних и практичних результатів з керівником роботи

27.04.2015 – 30.04.2015

6

Оформлення пояснювальної записки

04.05.2015 – 08.05.2015

7

Доопрацювання курсового проекту

11.05.2015 –

15.05.2015

8

Захист курсового проекту

20-21.05.2015

Студент                                     ____________________________      Денис В.М.

                                                                    (підпис)

Керівник проекту                     ____________________________      Томка Ю.Я.

                                                (підпис)


РЕФЕРАТ

У курсовому проекті розглянуто принципи побудови руху променя відбитого від дзеркальної поверхні.

Мета даної роботи полягає в розробці програми, що моделюватиме відбивання променя від дзеркал та перешкод з якими зіштовхнеться. Використати в конструюванні цього програмного продукту принципи об’єктно-орієнтованих підходів.

 Курсовий проект складається із програмного продукту теоретичної частини, що має обсяг ____ сторінок формату А4. Він містить в собі титульний лист, зміст, лист мети та завдання, реферат, вступ, основна частина (розділи), висновки та пропозиції, список використаної літератури та додатки.

У І розділі ми оглядали інформацію по тематиці курсового проекуту.               

Основна частина складається з трьох розділів, в яких описується середовища програмування, особливості алгоритму та інструкція для роботи з програмою.


ЗМІСТ

РЕФЕРАТ

ВСТУП

І.ПОСТАНОВКА ЗАВДАННЯ

1.1 Огляд інформації по даній тематиці

ІІ.ОСНОВНА ЧАСТИНА

2.1 Опис середовища програмування Visual Studio …………………………….

2.2 Особливості алгоритму……………………………………………………….

2.3 Інструкція для роботи з програмою………………………………………..

ВИСНОВКИ ТА ПРОПОЗИЦІЇ

СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ

ДОДАТКИ


 ВСТУП

Протягом останніх років людство досягло не аби яких успіхів у науці та техніці. За останні десятиріччя було зроблено безліч наукових відкриттів які назавжди змінили світ. Особливих успіхів було досягнуто у електроніці та електротехніці, адже в другій половині ХХ століття було створено перший комп’ютер. На той час це були громісткі,  повільні та енергозатратні   обчислювальні машини. Та наука не стояла на місці, з кожним роком комп’ютери вдосконалювались, зменшувались в розмірах, ставали все швидшими і швидшими до поки не стали такими, якими ми їх зараз знаємо.
 Зараз комп’ютер це незамінна річ в кожній сфері виробництва та праці. Поліфункціональність цих машин майже не знає меж, та потрібно не забувати, що забезпечує їх роботу та  що надає цим машинам такі можливості. Звичайно ж мова йде про програмне забезпечення. Ця невід’ємна частина комп’ютера є нервовою системою, що керує ним.

В свою чергу, програмне забезпечення керується з допомогою  програмних кодів та мов програмування на яких були написані ці коди. Однією з таких мов є С++. На даний час ця мова є однією з найпопулярніших та найперспективніших мов програмування, адже надає користувачеві велику кількість способів реалізації поставленої мети. Все завдяки одній з парадигм програмування, яка розглядає програму як множину «об'єктів», що взаємодіють між собою, а саме об’єктно орієнтовного програмування. Основу ООП складають три основні концепції: інкапсуляція, успадкування та поліморфізм.                           

Одною з переваг ООП є краща модульність програмного забезпечення (тисячу функцій процедурної мови, в ООП можна замінити кількома десятками класів із своїми методами).

Попри те, що ця парадигма з'явилась в 1960-тих роках, вона не мала широкого застосування до 1990-тих, коли розвиток комп'ютерів та комп'ютерних мереж дозволив писати надзвичайно об'ємне і складне   програмне забезпечення, що змусило переглянути підходи до написання програм. Сьогодні багато мов програмування або підтримують ООП (Lua) або ж є цілком об'єктно-орієнтованими (зокрема, Java, C#, C++, Python, PHP, Ruby та Objective-C, ActionScript 3, Swift, Vala).

Об'єктно-орієнтоване програмування сягає своїм корінням до створення мови програмування Симула в 1960-тих роках, одночасно з посиленням дискусій про кризу програмного забезпечення. Разом із тим, як ускладнювалось апаратне та програмне забезпечення, було дуже важко зберегти якість програм. Об'єктно-орієнтоване програмування частково розв'язує цю проблему шляхом наголошення на модульності програми.

На відміну від традиційних поглядів, коли програму розглядали як набір підпрограм, або як перелік інструкцій комп'ютеру, ООП програми можна вважати сукупністю об'єктів. Відповідно до парадигми об'єктно-орієнтованого програмування, кожний об'єкт здатний отримувати повідомлення, обробляти дані, та надсилати повідомлення іншим об'єктам. Кожен об'єкт — своєрідний незалежний автомат з окремим призначенням та відповідальністю[1].

Об'єктно-орієнтоване програмування - це метод програмування, заснований на поданні програми у вигляді сукупності взаємодіючих об'єктів, кожен з яких є екземпляром певного класу, а класи є членами певної ієрархії наслідування.[1]. Програмісти спочатку пишуть клас, а на його основі при виконанні програми створюються конкретні об'єкти (екземпляри класів). На основі класів можна створювати нові, які розширюють базовий клас і таким чином створюється ієрархія класів.

На думку Алана Кея, розробника мови Smalltalk, якого вважають одним з «батьків-засновників» ООП, об'єктно-орієнтований підхід полягає в наступному наборі основних принципів:

  •  Все є об'єктами.
  •  Всі дії та розрахунки виконуються шляхом взаємодії (обміну даними) між     об'єктами, при якій один об'єкт потребує, щоб інший об'єкт виконав деяку дію. Об'єкти взаємодіють, надсилаючи і отримуючи повідомлення. Повідомлення — це запит на виконання дії, доповнений набором аргументів, які можуть знадобитися при виконанні дії.
  •  Кожен об'єкт має незалежну пам'ять, яка складається з інших об'єктів.
  •  Кожен об'єкт є представником (екземпляром, примірником) класу, який виражає загальні властивості об'єктів.
  •  У класі задається поведінка (функціональність) об'єкта. Таким чином усі об'єкти, які є екземплярами одного класу, можуть виконувати одні й ті ж самі дії.
  •  Класи організовані у єдину деревоподібну структуру з загальним корінням, яка називається ієрархією успадкування. Пам'ять та поведінка, зв'язані з екземплярами деякого класу, автоматично доступні будь-якому класу, розташованому нижче в ієрархічному дереві.

Таким чином, програма являє собою набір об'єктів, що мають стан та поведінку. Об'єкти взаємодіють використовуючи повідомлення. Будується ієрархія об'єктів: програма в цілому — це об'єкт, для виконання своїх функцій вона звертається до об'єктів що містяться у ньому, які у свою чергу виконують запит шляхом звернення до інших об'єктів програми. Звісно, щоб уникнути безкінечної рекурсії у зверненнях, на якомусь етапі об'єкт трансформує запит у повідомлення до стандартних системних об'єктів, що даються мовою та середовищем програмування.

Стійкість та керованість системи забезпечуються за рахунок чіткого розподілення відповідальності об'єктів (за кожну дію відповідає певний об'єкт), однозначного означення інтерфейсів міжоб’єктної взаємодії та повної ізольованості внутрішньої структури об'єкта від зовнішнього середовища (інкапсуляції).

Отже, використовуючи об’єктно орієнтовний підхід, я можу створювати програмне забезпечення з більшою економією тексту коду та програмних ресурсів.

I. ПОСТАНОВКА ЗАДАЧІ ДЛЯ РОЗРОБКИ ПОГРАМИ

 

Дано ігрове поле на якому розміщена певна кількість цілей чи перешкод, дзеркала та лазер.

Лазер в початковому положенні знаходиться в нижній частині поля на дзеркальній поверхні і є неактивним.

В верхній частині поля розміщені цілі в які потрібно влучити лазером.

Лазер рухається по заздалегідь визначеною траєкторією і може відбиватись від стінок-дзеркал поля але не може відбитись від нижньої оскільки це завдання покладено на гравця.

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

Основна функція даного програмного продукту полягає в моделюванні руху променя з урахуванням законів відбивання.


І. ПОСТАНОВКА ЗАВДАННЯ

  1.  Огляд інформації по даній тематиці

Дзеркало - поверхня, яка паралельні пучки відбиває паралельними пучками.

Світловий промінь — умовна лінія, вздовж якої світлове випромінювання переносить енергію.

Закони відбивання

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

Щоб установити, як пов’язані напрями променів світла — того, що падає, та відбитого, – визначимо кути падіння та відбивання. 
Кутом падіння променя називають кут між променем, що падає, і перпендикуляром до дзеркала, поставленим у точці падіння (Рис. 1.1.1) Кут падіння позначають часто грецькою літерою α (альфа). А кут між відбитим променем і перпендикуляром до дзеркала називають  кутом  відбивання та позначають часто β(бета).

Хід променів при відбиванні світла має властивість оборотності:

Якщо точковий об’єкт і його зображення поміняти місцями, то хід променів при цьому не зміниться, зміниться лише їхній напрям.

Рис.1.1.1 Перший закон відбивання світла 

Другий закон відбивання світла: кут відбивання завжди буде дорівнювати куту падіння світла.

Розглянуте відбиття світла називають дзеркальним (Рис.1.1.1). Воно відбувається в разі відбиття світла від дуже гладкої поверхні. У такому разі паралельний пучок променів після відбиття залишається паралельним. (Пригадайте сонячних зайчиків. Відбиті від дзеркальця промені не розсіюються, а відбиваються одним пучком, тому і засліплюють. І саме ця властивість променів - не розсіюватись, допомогла Архімеду спалити ворожі кораблі).

Відбивання променів від плоского дзеркала

Якщо побудувати хід відбитих від дзеркала променів, що вийшли із точкового джерела світла S (Рис. 3.2.1), ми помітимо, що продовження відбитих променів перетинаються в одній точці S′. Людині, в око якої потраплять відбиті промені, здаватиметься, що всі вони вийшли з точки S′.

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

Рис. 1.2.1 Відбивання променів від плоского дзеркала

II. ОСНОВНА ЧАСТИНА

2.1 Опис середовища програмування Visual Studio

Загальні поняття

Програма - це детальний та закінчений опис алгоритму засобами мови програмування. Виконавцем програми є комп'ютер. Для виконання комп'ютером програма повинна бути подана у машинному коді - послідовності чисел, які зрозумілі процесору. Написати програму в машинних кодах вручну досить складно. Тому сьогодні практично всі програми створюються за допомогою мов програмування, які за своїми синтаксисом та семантикою наближені до природної людської мови. Це знижує трудомісткість програмування. Однак, текст програми, записаний за допомогою мови програмування, повинен бути перетворений в машинний код. Ця операція виконується автоматично за допомогою спеціальної службової програми, яка називається транслятором.

Транслятори поділяються на два типи: інтерпретатори та компілятори. Інтерпретатори перетворюють в машинний код і виконують почергово оператори (команди) програми. Якщо команда повторюється, то інтерпретатор розглядає її так само, як і ту що зустрів вперше. Компілятор перетворює вихідний текст програми цілком в машинний код. Тому перевага компіляторів - швидкодія і автономність отриманих програм. Перевага інтерпретаторів - їх компактність, можливість зупинити в будь-який момент виконання програми, виконати різні перетворення даних і продовжити роботу програми.

Інтегроване середовище розробки (Integrated Development Environment, IDE) В загальному випадку для створення програм потрібно мати такі компоненти:  текстовий редактор - для набору початкового тексту програми; компілятор або інтерпретатор - для перекладу тексту програми в машинний код; редактор зв'язків (компоновщик, лінкер) - для збірки декількох компільованих модулів в одну програму;  бібліотеки функцій - для підключення стандартних функцій до програми. Сучасні системи програмування включають в себе всі зазначені компоненти і називаються інтегрованими середовищами розробки. Microsoft Visual Studio - лінійка продуктів компанії Майкрософт, що включають інтегроване середовище розробки програмного забезпечення та ряд інших інструментальних засобів.

Можливості та засоби розробки додатків

У сімействі продуктів Visual Studio використовується загальне інтегроване середовище розробки, що складається з декількох елементів: панелі інструментів "Меню", панелі інструментів "Стандартна", різних закріплених вікон або вікон що автоматично приховуються в лівій, нижній або правій областях, а також області редакторів. Набір доступних вікон інструментів, меню і панелей інструментів залежить від типу проекту або файлу, в якому виконується розробка. Вікна можна рухати і закріплювати, а також тимчасово ховати за допомогою функції Auto - Hide.

Рішення та проекти як контейнери

У Visual Studio реалізовані контейнери: рішення і проекти, щоб зробити можливим використання в інтегрованому середовищі розробки (IDE) всього діапазону засобів, конструкторів, шаблонів і параметрів. Також, Visual Studio надає папки рішень для того, щоб структурувати пов'язані проекти по групах і потім виконувати дії над цими групами проектів.

Проект - це група файлів і налаштувань, з яких збирається остаточна програма або вихідні файли. Проект включає набір файлів джерел та метаданих, наприклад посилання на компонент та інструкції побудови. Як правило, при побудові проектів створюється один або кілька вихідних файлів. Рішення включає один або декілька проектів, а також файли і метадані, необхідні для опису рішення в цілому: Щоб допомогти користувачам організовувати і виконувати стандартні завдання із застосуванням елементів що розробляються, проекти Visual Studio використовуються як контейнери в межах

рішення. Це дозволяє логічно управляти, виконувати побудову і налагоджувати елементи, що утворюють програму. На виході проект, як правило, становить собою програму що виконується (EXE), файл бібліотеки динамічного компонування (DLL) або модуль. Проект може бути простим або складним залежно від конкретних вимог. Простий проект може містити файли вихідного коду і файл проекту. Більш складні проекти можуть включати ці ж елементи і, крім того, сценарії баз даних, збережені процедури та посилання на існуючі XML (веб- служби). Шаблони проектів Visual Studio надає шаблони для проектів найбільш поширених типів. Використання проектів і їх шаблонів дозволяє користувачеві зосередитися на реалізації окремої функції, в той час як проект буде виконувати загальне управління та завдання побудови. Файли проектів Кожен шаблон створює файл проекту, в якому містяться метадані поточного проекту. Файл проекту містить налаштування складання проекту, а також, можливо, список файлів проекту та їх розташування. При додаванні файлу в проект його фізичне місце розташування заноситься в файл проекту. При видаленні такого зв'язку, ця інформація видаляється з файлу проекту. Шаблон проекту визначає, які команди доступні для кожного його елемента.

Засоби побудови

У середовищі Visual Studio передбачений потужний набір засобів побудови та налагодження. За допомогою конфігурацій побудови можна вибирати компоненти для побудови, виключати компоненти, які не потрібно включати в побудову, а також визначати, як будуть побудовані вибрані проекти і для якої платформи. Для побудови (збірки) програми у меню Build виберіть Build Solution. У вікні Output повинна відображатися інформація про хід збирання, а також про виявлені помилки компіляції. Кнопка Go To Next Message (зелена стрілка) дозволяє переміщатися між повідомленнями. Використовуйте довідку (F1) для отримання докладної інформації про помилку.

Засоби налагодження

Після побудови починається процес налагодження. Побудова програм дозволяє виявляти помилки часу компіляції. До цих помилок можуть

відноситись невірний синтаксис, помилки в зарезервованих словах і розбіжності типів. Ці типи помилок відображаються в Вікні вихідних даних.

Після завершення побудови (збірки) програми можна використовувати відладчик для виявлення та усунення таких проблем, як логічні і семантичні помилки, виявлені під час виконання.

У режимі припинення виконання (Break Point) можна переглядати локальні змінні та інші дані, використовуючи такі засоби, як Вікна змінних (Watch) і Вікно пам'яті (Memory). Виконання програми в налагоджувальному режимі дозволяє використовувати точки призупинення виконання програми для перевірки стану змінних і об'єктів.

Запуск програми в налагоджувальному режимі

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

Рядок точки призупинення виконання позначається червоним кружком на лівому полі. У меню Debug виберіть Start Debugging (або натисніть F5).

Коли програма досягає точки призупинення виконання, програми тимчасово припиняється. Жовта стрілка на лівому полі вказує на рядок, який буде виконано наступним. Значення змінних в даний момент виконання програми можна побачити у спливаючих підказках, які з'являються при наведенні курсору на змінну, або у Вікні змінних (Watch). Якщо на імені змінної натиснути правою кнопкою миші і вибрати Add Watch, обрана змінна додається у вікно перегляду (Watch). Для додавання змінних можна використовувати перетягування мишкою.

У меню Debug виберіть Step Over або натисніть F10 для виконання чергового рядка коду без заходу всередину функції. У меню Debug виберіть Step Into або натисніть F11 для виконання чергового рядка коду з заходом всередину функцій.

У меню Debug виберіть Step Out для виходу з поточної функції. Так само можна виконати частину програми до певного місця. Для цього слід встановити курсор у місці, до якого слід виконувати програму, після чого Debug виберіть Run to cursor. Значення змінних у вікні перегляду оновлюються по мірі виконання програми. Дострокове завершення роботи програми в налагоджувальному режимі Для дострокового завершення роботи в програми, запущеної в налагоджувальному режимі в меню Debug виберіть Stop Debugging (або натисніть Shift + F5).

Деякі стандартні математичні функції використані в програмі

Стандартні математичні функції оголошені в заголовному файлі math.h.

abs – абсолютне значення цілого числа - |x|

int abs(int x);

fabs – абсолютне значення числа з плаваючою точкою - |x|:

double fabs(double x);

sqrt – обчислення квадратного кореня:

double sqrt(double x);

pow – піднесення до степеня:

double pow(double x, double y);

cos – косинус – cos(x) (тут і далі x задається в радіанах)

double cos(double x);

sin – синус – sin(x):

double sin(double x);

tan – тангенс – tg(x):

double tan(double x);

exp – експонента:

double exp(double x);

log – натуральний логарифм – ln(x):

double log(double x);

log10 – десятковий логарифм - log10(x):

double log10(double x);

                              

                                 

2.2 Особливості алгоритму

 Алгоритм - набір інструкцій, які описують порядок дій виконавця, щоб досягти результату розв’язання задачі за скінченну кількість дій; система правил виконання дискретного процесу, яка досягає поставленої мети за скінченний час.

Для комп’ютерних програм алгоритм є списком деталізованих інструкцій, що реалізують процес обчислення, який, починаючи з початкового стану, відбувається через послідовність логічних станів, яка завершується кінцевим станом. Перехід з попереднього до наступного стану не обов’язково детермінований — деякі алгоритми можуть містити елементи випадковості.

Алгоритм даного програмного продукту досить легкий для розуміння. Програма розділена на декілька частин для кращого розуміння коду та згідно всіх вимог. Також слід зазначити використання в даному програмному продукті власноруч створених бібліотек з різними видами даних. В  програмі  використано принципи об’єктно - орієнтовного програмування, а саме: класи, об’єкти, конструктори, методи та інші принципи ООП. З допомогою класів було побудовано основну частину програми та програмного коду. Основними є два класи, які відповідають за перешкоди та об’єкт, що зіштовхується з ними. В цих класах з допомогою конструкторів описано вигляд та характеристичні

метадані  предметів гри, а саме: довжина, висота, радіус, твердість, швидкість руху, кількість та інші. Змінні були занесені до окремої бібліотеки для підвищення модульності програми та спрощення коду. Основні дії були записані в окремих файлах коду, після чого вони викликаються в основний файл коду програми.

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

2.3 Інструкція для роботи з програмою

Даний програмний продукт призначений для отримання насолоди від використанні гри та веселого проведення дозвілля. Яскраво виражена простота інтерфейсу виконаного за традиціями мінімалізму не містить надмірності кольорів та непотрібних елементів дизайну. Даний продукт не має цільової аудиторії, тому може використовуватись всіма охочими.

Рис. 2.1

Для того щоб розпочати гру запустіть відповідний файл гри, після чого на екрані з’явиться вікно з ігровим полем. На ньому ви можете спостерігати основні елементи гри: перешкоди чи цілі, дзеркала та лазерний промінь.  

Початкове місце знаходження об’єкта знаходиться в нижній частині поля для гри та визначається користувачам з допомогою миші. Лазерний промінь знаходиться на дзеркальній поверхні і починає свій рух після натискання лівої кнопки миші. Рух відбувається за заздалегідь визначеним алгоритмом руху і змінюється у разі ураження цілі чи відбивання від дзеркала.  

ВИСНОВКИ ТА ПРОПОЗИЦІЇ

Даний курсовий проект є прикладом використання OpenGL — (англ. Open Graphics Library — відкрита графічна бібліотека) в середовищі програмування Microsoft Visual Studio на мові програмування С++. В ньому проаналізовано та наведено використання безлічі функцій з допомогою яких було виконано даний проект . Застосовано одну з основних парадигм мови програмування С++, а саме об'єктно-орієнтоване програмування, яке вивчалось мною на протязі навчального семестру. Можна сказати, що це поняття дозволило мені втілити в життя поставлену мету та завдання курсового проекту. Об'єктно-орієнтоване програмування дозволяє програмі відтворити життєві процеси та змоделювати їх в програмі.

Мною було використані та впроваджені основні поняття ООП, такі як: класи, об’єкти, методи, конструктори, вказівники та інші. Застосовано різного типу методики побудови та розробки програмних модулів, отримано теоретичні знання та практичні навички в такій області фізики як оптика, отримано досвід роботи з бібліотекою OpenGL.

Під час виконання курсового проекту, мною було проведено велика кількість експериментів, що до проектування процесів. Була прочитана наукова література в області фізики та оптики, за для кращого розуміння процесу відбивання. Також, отримано цінні знання від перегляду відео уроків з моделювання, роботи в середовищі програмування Microsoft Visual Studio, роботи з бібліотекою OpenGL та допоміжною бібліотекою утилітою GLUT. Остання заслуговує уваги, оскільки ця бібліотека утиліт для застосування під OpenGL, яка в основному відповідає за системний рівень операцій вводу-виводу при роботі з операційною системою і, в тому числі, включає функції: створення вікна, управління вікном, моніторинг за вводом з клавіатури і подіями комп’ютерної миші; функції рисування ряду геометричних примітивів: куб, сфера, чайник та інші. GLUT включає можливість створення нескладних випливаючих меню.

Аналізуючи курсовий проект можуть виникнути пропозиції щодо усунення деяких незначних невідповідностей програми поставленій задачі та пропозиції щодо подальшого розвитку проекту, як перспективного. В подальшому можна вводити в гру нові функції та рівні складності вдосконалюючи при цьому фізику руху.

Отже, проаналізувавши всю роботу, поставлені завдання та цілі можна дійти висновку, що з допомогою об'єктно-орієнтоване програмування можна реалізовувати безліч проектів різними способами, при цьому код буде набагато простішим для розуміння та не таким об’ємним. Що стосується самонавчання, то можу сказати, що я покращив свої навички програмування та роботи в бібліотеці OpenGL. Вважаю даний проект цілком успішним та цілком задовільним для використання.

СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ

1. Гради Буч, Роберт А. Максимчук, Майкл У. Энгл, Бобби Дж. Янг, Джим Коналлен, Келли А. Хьюстон. Объектно-ориентированный анализ и проектирование с примерами приложений. М.: Вильямс, 2008.- 720с.

2. Керниган Б., Язык программирования СИ./ Ритчи Д.   - 1992. –272с.

3. Герберт Шилда. Полный справочник по C++  / М. – С.-П.-К., Вильямс. – 2003. – 800с.

4. Трофименко О. С++. Основи програмування. Теорія та практика : підручник / Ю.В. Прокоп, І.Г. Швайко, Л.М. Буката та ін. ; за ред.О.Г.Трофименко. – Одеса: Фенікс, 2010. – 544 с.

5. Лєхан С.А. Інформатика. Мова програмування С++. Спецкурс. 10-12 класи. Навчальний посібник, «Аспект», 2007 – 160 с.

6. Р. Верма Введение в OpenGL. 2-е изд.  Издательство «Горячая Линия – Телеком», 2011 г.Мягкая обложка, 304 стр.

7. В.Г.Архипкин, Г.С.Патрин. ЛЕКЦИИ ПО ОПТИКЕ. 2006 г

ДОДАТОК А

Лістинг програмного продукту

/* Ball.h */

#pragma once

class Ball

{

public:

float x, y, dx, dy, r;  //кординати, швидкість руху лазера та його радіус

bool active;

Ball(float r_): x(), y(), r(r_), dx(), dy(), active(false){} //коснструктор задає початкові параметри лазера

void move();

};

/*vars.h*/

#pragma once

extern float r_x, r_y, r_w, r_h;

/*Brick.h*/

#pragma once

class Brick

{

public:

bool active;   //визначає чи не знищений блок

short row, col, hit; //стовпці, рядки та твердість блоку

float w, h;    //довжина і висота блоків

 

Brick(short r_, short c_, float w_, float h_, short hit_):  

row(r_), col(c_), hit(hit_), w(w_), h(h_), active(false){};

Brick(): row(), col(), w(20), h(20), hit(1), active(false){}; //конструктор по замовчуванню

};

/*Ball. cpp */

#include "stdafx.h"

#include "Ball.h"

#include "vars.h"

void Ball::move()

{

x+=dx;   //рух лазер. Кординати по х змінюються з швидкістю dx.

y+=dy;   //рух лазер. Кординати по у змінюються з швидкістю dу.

if(x-r<=0)  //перевірка чи не вийшов лазер за межі поля

{

 x=r;   

 dx*=-1;  //при вдарянні лазера об стінку він починає рухатись в протилежному напрямі

 

 }

else if(y-r<=0)

{

 y=r;

 dy*=-1; 

}

else if(x+r>=300)

{

 x=300-r;

 dx*=-1;

}

 else if(y+r>=r_y && y+r<=r_y+r_h && x>r_x && x<r_x+r_w) //перевірка чи вдаряється лазер в дзеркало

{

 y=r_y-r;

 dy*=-1;

}

 else if(y>300)   //перевірка чи не випав лазер за межі вікна.

 {

  active=false;  //лазер випав і стає неактивним. повертається на ракетку

 }

}

// Лазер.cpp: определяет точку входа для консольного приложения.

#pragma once

// бібліотеки необхідні для функціонування програми

#include "stdafx.h"

#include <glut.h>

#include <math.h>

#include "Ball.h"

#include "vars.h"

#include "Brick.h"

#include <string.h>

#include <Time.h>

#include <iostream>

float r_x=50.0, r_y=290.0, r_w=100, r_h=8.0;  //кординати і розміри ракетки

Ball ball(5);  //радіус мячика

 

Brick brick[5][15]; //кількіть блоків по вертикалі та горизонталі

bool isCollision(Ball &b, Brick &br)  //функція для зіткнення

{

float x=b.x, y=b.y, r=b.r, c=br.col, w=br.w, row=br.row, h=br.h;

if(br.active)  //перевірка чи блоки існують)  

{

 if(abs(x-c*w-w/2-2)<=r+w/2 && abs(y-row*h-h/2-2)<=r+h/2)  //перевірка чи знаходиться лазер поблизу блоку

 {

  if(sqrt((c*w+w/2-x)*(c*w+w/2-x) + (row*h+h/2-y)*(row*h+h/2-y))

   - (w/2-1)*sqrt(2.0) - r > r*(sqrt(2.0)-1))

   return 0;

  else

   return 1; 

 }

}

return 0;

}

void Draw()

{

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(0.0, 0.1, 1.0);      //колір дзеркала

glRectf(r_x, r_y, r_x+r_w+5, r_y+r_h+5);  //функція для побудови прямокутника          

glColor3f(0.0, 1.0, 0.0);      //колір лазера

glBegin(GL_LINES);

glVertex2f(ball.x, ball.y+ball.r);

glVertex2f(ball.x+ball.r-5, ball.y-ball.r-5);

glEnd();  

glColor3f(0.1, 0.5, 0.9);

glBegin(GL_QUADS);

 for(int i=0; i<10; i++)

 {

   glColor3ub(i*25,i*50,150);  //переливання кольору по вертикалі

  for(int j=0; j<15; j++)

  {

   glColor3ub(j*25,j*50,150);  //переливання кольору по горизонталі

   Brick &b=brick[i][j];

   if(b.active)

   {

    glVertex2f(b.col*b.w+1,   b.row*b.h+1);

    glVertex2f(b.col*b.w+b.w-1,  b.row*b.h+1);

    glVertex2f(b.col*b.w+b.w-1,  b.row*b.h+b.h-1);

    glVertex2f(b.col*b.w+1,   b.row*b.h+b.h-1);

   }

  }

 }

glEnd();

glutSwapBuffers();

}

void Timer(int)

{

if(ball.active)

{

 ball.move();

 for(int i=0; i<10; i++)

 {

  for(int j=0; j<15; j++)

  {

   Brick &b=brick[i][j];

   if(isCollision(ball, b))

   {

    if(abs(ball.x-b.col*b.w-b.w/2) < abs(ball.y-b.row*b.h-b.h/2))  //перевірка де знаходиться лазер)чи зверху чи знизу

     {ball.dy*=-1;}             //змінюєм вертикальний напрям руху

    else if(abs(ball.x-b.col*b.w-b.w/2) > abs(ball.y-b.row*b.h-b.h/2)) //перевірка де лазер)з правою чи з лівої сторони

     {ball.dx*=-1;}             //змінюєм горизонтальний напрям руху

    else                //інакше лазер по діагоналі

    {

     if(ball.dx>0)

     {

     if(ball.x < b.col*b.w+1)

      ball.dx*=-1;}

     else if(ball.x > (b.col+1)*b.w-1)

      ball.dx*=-1;

     if(ball.dy>0)

     {

     if(ball.y < b.row*b.h+1)

      ball.dy*=-1;}

     else if(ball.y > (b.row+1)*b.h-1)

      ball.dy*=-1;

    }

    if(--b.hit==0)   //якщо твердість блоку = 0

    {

     b.active=false;  //руйнується блок      

    }

    goto o;  //для дострокового виходу з циклу, без виходу з функції

   }

  }

 }

}

o: Draw();

glutPostRedisplay();

glutTimerFunc(30, Timer, 0);

}

void MousePress(int button, int state, int x, int y)

{

if(button==GLUT_LEFT_BUTTON && !ball.active)

{

 ball.active=true;

 ball.dx=6;   //швидкість по х

 ball.dy=-8;   //швидкість по у

}

}

void Mouse(int ax, int ay) //функція для роботи з мишею

{

r_x=ax-r_w/2;   //середина ракетки рухається за мишею

if(!ball.active)  //перевірка чи мячик на ракетці

{

 ball.x=r_x+r_w/2; //розміщення лазера на ракетці по осі х

 ball.y=r_y-ball.r; //розміщення лазера на ракетці по осі у

}

}

void Init()

{

glClearColor(0.0, 0.0, 0.0, 0.0);

 glMatrixMode(GL_PROJECTION);

glOrtho(0, 300, 300, 0, 1, 0);

}

//реєстрація функцій 

int main(int argc, char** argv)

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);

glutInitWindowSize(300, 300);

glutInitWindowPosition(400, 200);

glutCreateWindow("Lazer");

glutDisplayFunc(Draw);

glutTimerFunc(30, Timer, 0);

glutPassiveMotionFunc(Mouse);

glutMouseFunc(MousePress);

 Init();

//цикли для побудови блоків на полі

 for(int i=0; i<10; i+=2)   //горизонтальні блоки 

 for(int j=0; j<16; j++) //вертикальні блоки

 {

  brick[i][j].active=true;

  brick[i][j].col=j;

  brick[i][j].row=i;

 }  

glutMainLoop();

return 0;

}


Змн
.

Арк.

№ докум.

Підпис

Дата

Арк.

4

БДФЕУ. 015080.001 01

Розроб.

Денис В.М.

Перевір.

Томка Ю.Я.

Реценз.

Н. Контр.

Затверд.

Стеценко І.В.

Логічна гра «Рикошет»

Літ.

Акрушів

26

БДФЕУ КН-21

Змн.

рк.

№ докум.

Підпис

Дата

Арк.

5

БДФЕУ. 015080.001 01

Змн.

Арк.

№ докум.

Підпис

Дата

Арк.

БДФЕУ. 015080.001 01

Змн.

Арк.

№ докум.

Підпис

Дата

Арк.

6

БДФЕУ. 015080.001 01

Змн.

Арк.

№ докум.

Підпис

Дата

Арк.

7

БДФЕУ. 015080.001 01

Змн.

Арк.

№ докум.

Підпис

Дата

Арк.

8

БДФЕУ. 015080.001 01

Змн.

Арк.

№ докум.

Підпис

Дата

Арк.

9

БДФЕУ. 015080.001 01

Змн.

Арк.

№ докум.

Підпис

Дата

Арк.

10

БДФЕУ. 015080.001 01

Змн.

Арк.

№ докум.

Підпис

Дата

Арк.

11

БДФЕУ. 015080.001 01

Змн.

Арк.

№ докум.

Підпис

Дата

Арк.

12

БДФЕУ. 015080.001 01

Змн.

Арк.

№ докум.

Підпис

Дата

Арк.

13

БДФЕУ. 015080.001 01

Змн.

Арк.

№ докум.

Підпис

Дата

Арк.

14

БДФЕУ. 015080.001 01

Змн.

Арк.

№ докум.

Підпис

Дата

Арк.

15

БДФЕУ. 015080.001 01

Змн.

Арк.

№ докум.

Підпис

Дата

Арк.

16

БДФЕУ. 015080.001 01

Змн.

Арк.

№ докум.

Підпис

Дата

Арк.

17

БДФЕУ. 015080.001 01

Змн.

Арк.

№ докум.

Підпис

Дата

Арк.

18

БДФЕУ. 015080.001 01

Змн.

Арк.

№ докум.

Підпис

Дата

Арк.

19

БДФЕУ. 015080.001 01

Змн.

Арк.

№ докум.

Підпис

Дата

Арк.

20

БДФЕУ. 015080.001 01

Змн.

Арк.

№ докум.

Підпис

Дата

Арк.

21

БДФЕУ. 015080.001 01

Змн.

Арк.

№ докум.

Підпис

Дата

Арк.

22

БДФЕУ. 015080.001 01

Змн.

Арк.

№ докум.

Підпис

Дата

Арк.

23

БДФЕУ. 015080.001 01

Змн.

Арк.

№ докум.

Підпис

Дата

Арк.

24

БДФЕУ. 015080.001 01

Змн.

Арк.

№ докум.

Підпис

Дата

Арк.

25

БДФЕУ. 015080.001 01

Змн.

Арк.

№ докум.

Підпис

Дата

Арк.

26

БДФЕУ. 015080.001 01


 

А также другие работы, которые могут Вас заинтересовать

45199. Порядок определения размера арендной платы, условий и сроков ее внесения за использование земельных участков, предоставляемых для строительства 30.5 KB
  Размер арендной платы за один квадратный метр земельного участка в год рассчитывается по формуле: А = Скад х Ки х Ка х Кс х Кв х Кпр где: Скад – среднее значение удельного показателя кадастровой стоимости земель в городском округе Самара; Ки – коэффициент инфляции рассчитываемый как произведение индексов-дефляторов инвестиций предусмотренных в рамках прогноза социально-экономического развития Самарской области Ка – коэффициент категории арендатора определяемый в соответствии с приложением № 1 к настоящему Порядку; Кс – коэффициент сроков...
45200. Определение и структура сметной стоимости строительства, строительно-монтажных работ и себестоимости строительно- монтажных работ (формулы Сстр, Ссмр, Сс, НР, СП) 25.5 KB
  Сметная стоимость строительно-монтажных работ Собор – сметная цена оборудования Спр – стоимость прочих затрат Сметная стоимость строительно-монтажных работ: Ссмр = Сс СП где: Сс – сметная себестоимость строительно-монтажных работ СП – сметная прибыль средства необходимые для покрытия отдельных расходов подрядных организаций на развитие производства соц.2001 ФОТ = От оплата труда рабочих Отм оплата труда машинистов Сметная себестоимость -работ: Сс = ПЗ НР где: ПЗ...
45201. Определение и структура прямых затрат 14.53 KB
  Стоимость материальных ресурсов франко-приобъектного склада отпускная цена транспортные расходы Оплата труда рабочих согласно ежемесячной статистике Учреждения статистики Стоимость эксплуатации машин: Эм = А Р Б Отм Э С Г П где: А – амортизационные отчисления на полное восстановление Р – затраты на ремонт и технич.оборудование Б – затраты на замену быстроизнашивающихся частей Отм – оплата труда машинистов Э – затраты на...
45202. Накладные расходы. Определение, виды, база начисления, назвать основные статьи НР 14.12 KB
  Определение Для определения норм накладных расходов в локальных сметных расчетах используются методические указания по определению величины НР в строительстве МДС 81332004 и письма мин. МДС 81332004 МДС 81332004 и ремонтно-строительных работ прил. МДС 81332004
45203. Описание архитектуры производственного предприятия в системе ПитерСофт: Управление процессами 1.3 MB
  Что же собой представляет архитектура предприятия? В самом общем виде под архитектурой предприятия (ЕА - Enterprise Architecture) понимается всестороннее и исчерпывающее описание (модель) всех его ключевых элементов и межэлементных отношений.
45205. Сметная прибыль. Определение, виды, база исчисления, состав затрат 16.01 KB
  В состав нормативов СП входят затраты: Отдельных федеральных регионов местные сборы Налог на прибыль Налог на имущество по ставкам установленным организацией местного самоуправления не выше 5 Расширение производства подрядовой организации Модернизация оборудования Реконструкция объектов основных фондов Материальная стимуляция работников Проведение мероприятий по охране и отдых несвязанных с участием работников производственных процессов Организация помощи учебным заведениям Виды сметной прибыли Общеотраслевой норматив...
45206. Локальные и объектные сметные расчеты 169.89 KB
  2004 методика по определению стоимости строительства строит. стоимости 1. Показатели единичной стоимости по конструктивным элементам Объектносметный расчет рекомендуется составлять в текущем уровне цен на объекты в целом путем суммирования ранних из локальных сметных расчетов с группировкой затрат по соответствующим графам сметной стоимости По стоимости: строительных работ монтажных работ стоимости оборудования мебели и инвентаря прочих затрат С целью определения полной стоимости объекта в конце объектной сметы рекомендуется...
45207. Методы определения стоимости строительства 15.32 KB
  Методы определения стоимости строительства При составлении смет и сметных расчетов могут применяться следующие методы определения стоимости: Базисно-индексный Ресурсный Метод на основе укрупненных сметных нормативов в том числе банка данных о стоимости ранее построенных или запроектированных объектованалогов Базисноиндексный метод Определение стоимости строительства предусматривает составление сметных расчетовсмет на различных тсадиях инвестиционного строительного процесса в базисном уровне цен с использованием единичных расценок...