Методи сортування. Порівняльний аналіз
Огляд та класифікація комп'ютерних ігор. Алгоритм розташування кораблів на ігровому полі. Виконання алгоритму гри комп'ютера з використанням методу випадкових чисел. Стратегія гри комп'ютера. Обґрунтування вибору середовища програмної реалізації.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | украинский |
Дата добавления | 26.01.2023 |
Размер файла | 616,5 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
52
Міністерство освіти і науки України
Харківський національний університет радіоелектроніки
Факультет Прикладна математика та менеджмент
Кафедра Інформатика
Напрямок Прикладна математика
ПОЯСНЮВАЛЬНА ЗАПИСКА
до курсової роботи з дисципліни “Програмування”
за темою Методи сортування. Порівняльний аналіз
Виконав: студент Винокурова Ю.В.
Перевірив: доц. В.А. Любченко
2012 р.
Календарний план
№ |
Найменування етапів курсового проекту |
Термін виконання етапів проекту |
Примітки |
|
1 |
Пошук необхідної літератури |
03.03.12 - 08.03.12 |
Виконано |
|
2 |
Пошук необхідного програмного забезпечення |
09.03.12 - 11.03.12 |
Виконано |
|
3 |
Ознайомлення з можливостями візуального програмування |
12.03.12 - 14.03.12 |
Виконано |
|
4 |
Розроблення алгоритму для вирішення поставленої задачі |
15.04.12 - 20.04.12 |
Виконано |
|
5 |
Створення комп'ютерної моделі по розробленому алгоритму |
21.04.12 ?25.04.12 |
Виконано |
|
6 |
Оформлення пояснювальної записки |
30.04.12 ?1.05.12 |
Виконано |
|
7 |
Захист курсового проекту |
Реферат
Пояснювальна записка: 53с., рис. 8, табл. 0, додатків 2, джерел 4.
Курсова робота присвячена розробці гри «Морський бій».
ШТУЧНИЙ ІНТЕЛЕКТ, МОРСЬКИЙ БІЙ, VISUAL STUDIO 2008, КЛАСИ С++, АЛГОРИТМИ
Реферат
(русск вариант)
Объяснительная записка 53 с., рис. 8, табл. 0, приложений 2, источников 4.
Курсовая работа посвящена разработке игры «Морской бой»
ИСКУССТВЕННЫЙ ИНТЕЛЕКТ, МОРСКОЙ БОЙ, VISUAL STUDIO 2008, КЛАССИ С++, АЛГОРИТМИ
Зміст
Введення
1. Теоретичний огляд створення ігор
1.1 Аналітичний огляд ігор
1.2 Опис наочної роботи
1.3 Постановка задачі
2. Розробка алгоритму гри "Морський бій"
2.1 Алгоритм розташування кораблів на ігровому полі
2.2 Стратегія гри комп'ютера
3. Комп'ютерна модель гри "Морський бій"
3.1 Обґрунтування вибору середовища програмної реалізації
3.2 Програмна реалізація
3.3 Інструкція користувач
Висновки
Перелік посилань
Додаток А
Додаток В
Введення
Всі, хто має справу з комп'ютером, так або інакше стикалися з комп'ютерними іграми, і переважна більшість може сходу назвати декілька ігор, які їм особливо сподобалися. Ті, хто вже зовсім награвся, майже награвся або ще не награвся, але в процесі спілкування з комп'ютером вже почав поєднувати ігри з чим-небудь кориснішим, можливо, хотіли б придумати які-небудь свої, не схожі ні на яких інші ігри.
Багато що захоплює в такій справі. І не сам процес гри, а розробка ігрового всесвіту, її проектування і реалізація. Коли можна з'єднати воєдино сценарій, графіку, музику, майстерно задуманий і уміло запрограмований алгоритм -- створити єдиний фантастичний світ, що живе за законами, які ти ж для нього і придумав.
У даній курсовій роботі мова піде про створення нескладної ігрової програми «Морський бій», яка і буде об'єктом дослідження.
1. Теоретичний огляд створення ігор
1.1 Аналітичний огляд ігор
Останнім часом продажі програмного забезпечення збільшуються трохи, тоді як продажі ігрових програм зростають експоненціально. Ігри для платформи Windows складають переважну більшість. Ігрове програмне забезпечення - це третя по розмірах доходів галузь індустрії програмного забезпечення після текстових процесорів і електронних таблиць.
Вказати точне число комп'ютерних ігор дуже важко. Можна лише приблизно оцінити число різних найменувань ігор, що знаходяться на ринку у будь-який час.
Класифікація комп'ютерних ігор може бути наступна:
1. Пригодницькі ігри. Ігри можуть бути прекрасним засобом розповіді історії. Ці ігри є мультіпліцированою розповіддю, в якій можна бачити і контролювати основний персонаж (а інколи і більш за одне) в дуже детальному оповіданні. Це - комп'ютерні версії звичайних оповідань, починаючи від жалісних розповідей до технотрілерів, науково-фантастичних пригод, фантазій і розповідей, до межі набитих різними обманами і шахрайствами. Пригодницькі ігри розвиваються довкола різних загадок і перешкод, які потрібно здолати у міру розвитку розповіді.
2. Фантастичні ігри, в яких ви граєте певну роль. Їх краще всього визначити як комп'ютеризовану версію розповіді Dungeons and Dragons («Підземелля і дракони»), але дія не завжди відбувається на населеному варварами середньовічному світі. Часто воно відбувається у відкритому космосі або в яких-небудь областях майбутнього. У цих іграх зазвичай потрібно управляти групою персонажів, які стають у міру розвитку гри сильніше і розумніше, і робити деякі інші речі. Так само змінюються і вороги. Самі розповіді в іграх цього типа зазвичай менш детальні, чим в пригодницьких іграх, з великим упором на завдання побити чудовгщ, чим вирішити загадки.
3. Імітатори повітряних і космічних битв. Це не воєнні ігри, в яких може виявитися необмежене число озброєнь і ворогів, ці ігри намагаються бути точними імітаторами польотів і битв на реальних бойових літаках. Ці ігри призначені для тих, хто хоче літати на великих і дуже потужних машинах. Кабіни пілотів виглядають як сьогодення, інструменти працюють як в справжньому бою, зброя є імітацією реально існуючого, а польотні характеристики літака (і літака ворога) відповідають дійсним. Імітатори космічних битв вигадані, проте вони розроблені з метою точно повторити реальні маневри в космосі.
4. Імітатори наземних і морських битв. Ігри розроблені для військового устаткування і військових машин. Ця категорія ігор включає симулятори сьогодення підводних ло¬док, кораблів і танків, і дозволяє гравцям випробувати реальні сценарії битв, і вижити для того, щоб зрозуміти, як використовувати правильну тактику в наступній грі.
5. Літаки, поїзди і автомобілі. На відміну від цих імітаторів, всі інші є імітаторами військового типа або мають дуже сильний упор на битву. Ці ж ігри не відносяться до таких імітаторів. Звичайно, можна проїхати на автомобілі по береговій дорозі в Каліфорнії з швидкістю, що удвічі перевищує дозволену, і станцювати на всіх чотирьох колесах. Але також можна використовувати ці ігри, щоб навчитися безпечно літати серед хмар, і отримувати задоволення від свободи польоту. Навіть можна робити такі речі, як споруда і управління власною залізницею.
6. Спортивні імітатори. Тут необхідно виучувати професіоналів і управляти ними. Ці ігри - щось більше, ніж просте зображення бейсбольних ігор в картинках, в деяких з них можна навіть контролювати реальну дію. Спортивні імітатори дають можливість вести ризиковану гру в потрібний час, довести, що можна виграти за допомогою прудкості, мати в команді Генрі Аарона і Теда Вільямса, або переграти Томмі Лазорду.
7. Аркадні ігри/ ігри дії. Це класичні «ігри дії» - все залежить від того, наскільки швидко руки можуть смикати джойстик. Зазвичай про них говорять як про безглузді, так часто і буває. З іншого боку, бувають часи, коли з'явиться потреба дати відпочити мізкам. У багато з цих ігор можна грати за допомогою клавіатури або миші, і джойстики не завжди необхідні. У чому є необхідність, так це в швидких рефлексах.
8. Настільні ігри, солітер і салонові ігри. Багато старих улюблених ігор з'явилися в комп'ютерному варіанті. Більше не потрібно займатися пошуками партнера, щоб пограти в шахи. Деякі з цих ігор навіть навчать шахраювати наодинці з монітором, і при цьому не доведеться повертатися додому з порожньою кишенею після невдалої ночі.
9. Імітатори реальності («ігри в бога»). Це ігри, які дозволяють створювати реальний світ ні з чого. Це ігри, які дозволять створити комп'ютерний світ з накидань, управляти містом, країною або навіть світом.
10. Ігри, в яких робляться гроші. Вони копіюють ігрову діяльність і учать вищим формам азартних підприємств: фондова біржа, торгівля нерухомістю. Вони також дозволяють спробувати управляти корпорацією. У ці ігри можна грати для задоволення, або використовувати їх для того, щоб навчитися дертися вгору по сходах кар'єри.
11. Стратегічні і військові імітатори. Тут можна брати участь у великих історичних подіях, узяти на себе командування німецькою армією в Ленінграда або армією Наполеона у Ватерлоо. Це військові стратегії минулого, теперішнього або майбутнього.
12. Ігри для дітей. Якщо є домашній комп'ютер, і щоб діти навчилися його використовувати, то ці ігри достойні уваги. Реальність нашої культури така, що, як тільки малята стануть координовані настільки, щоб правильно користуватися клавіатурою або мишею.
13. Ігри «On-line». Було б помилкою вважати, що всі комп'ютерні ігри для IBM РС приходять до нас на дискетах або cd-дисках, щільно упакованих в красиві пакети. Фактично, весь обширний світ комп'ютерних ігор доступний і по телефону. Ця категорія ігор відома як «он-лайн» і включає всілякі ігри, які є у великих «он-лайн» мережах і в багатьох локальних мережах типа «дошка оголошень» (bulletin board system -- BBS). Для ігор «он-лайн», окрім особистого комп'ютера необхідні модем і кредитна картка.
14. Ігри Shareware. Буде помилкою передбачити, що всі комп'ютерні ігри приходять в красивих упаковках. Багато гарних ігор приходять зовсім без упаковок, і коштують від 10 до 30 доларів. Зазвичай можна їх випробувати за дуже низьку плату або зовсім безкоштовно протягом декількох днів і, якщо захочеться отримати легальну копію, слід послати поштою чек компанії або особі, які створили гру.
Комп'ютерні ігри -- зовсім не новий винахід. Їх історія почалася не з кінця 1970 років. Початок лежить набагато раніше, тоді, коли Джон Кенеді вже пробув президентом Сполучених Штатів всього декілька місяців.
Насправді все почалося з моделі залізниці. Студенти Технологічного інституту в Массачусетсі були немало здивовані кількістю способів, за допомогою яких можна було розташувати органи управління мініатюрною залізницею. Пізніше, коли вони нарешті дістали можливість працювати на великих комп'ютерах інституту, їх робота в бінарних обчисленнях -- адже саме такий обчислення імітуються вимикачами залізниці -- дозволили їм пройти добру підготовку в комп'ютерній справі.
Стів Рассел був одним з членів Клубу Моделей залізниць Високої Технології в Технологічному інституті. Будучи хорошим програмістом, він літом 1961 року працював в Статистичній лабораторії, коли у нього і його друзів з'явилася ідея перенести «мильні» науково-фантастичні розповіді Е.Е.Сміта на комп'ютери. У 1962 році Стів розробив програму для Pdp-1. Ета сама машина тепер виставлена в комп'ютерному музеї Бостона в Массачусетському Технологічному інституті.
У «Космічній Війні», як називалася ця програма, два синтезованих комп'ютером ракетних космічних корабля (один схожий на товсту сигару, а інший на довгу обтічну трубу) могли літати по екрану, на якому поміщалося зображення космосу. Гравці могли натискувати на кнопки, щоб змусити ракети міняти напрям руху майже так само, як пізніше в грі Asteroids власники ігрових машин Atari управляли своїми кораблями. Кожна ракета несла на собі 31 торпеду, і, тоді як вони летіли по екрану, гравець міг вистрілити крапочку з носа своєї ракети у напрямі іншої. Якщо крапка дійсно пересікала очертання іншого корабля, програма визначала, що торпеда успішно уразила інший корабель і інший корабель «вибухав». Підірваний корабель пропадав з екрану і замінювався нагромадженням крапок, котрі змальовували його залишки.
Звичайно, суспільство програмістів і зломщиків програм не може задовольнятися якістю будь-якої програми, незалежно від того, наскільки вона легка або цікава. Зміни були нєїзбежни. Один з друзів програміста, будучи невдоволеним випадковим чином побудованою картою зоряного піднебіння, яку Рассел спочатку помістив в гру, узяв зоряний атлас і ухитрився запрограмувати нашу власну галактику, аж до зірок п'ятої величини. Інший додав гравітацію в гру, а третій ввів можливість втечі в гіперпростір, при цьому, щоб показати місце, де корабель покинув зоряну систему, на екрані залишався слід прискорення.
Навіть Рассел зробив деякі зміни. Знаючи, що в справжніх торпед вірогідність ураження цілі не 100%, а менше, він вирішив додати зоряним торпедам можливість помилки, і додати випадковий елемент в траєкторії ракет і час вибуху. Його друзі терпіти не могли нову версію, оскільки вони хотіли б мати в грі ту ж міру упевненості, яка існувала в програмуванні.
Рассел повернув програму до колишньої версії і, не встигли озирнутися, як «Космічні війни» окуповували комп'ютери коліджей по всій країні.
«Космічні війни» сталі настільки популярні до середини шестидесятих, що Нолан Бушнелл, творець Atari, дуже прив'язався до гри під час навчання в університеті штату Юти. До 1970 року Бушнелл побудував свою власну машину, використавши 185 вбудованих ланцюгів для під'єднування до телевізора і для виконання однієї-єдиної функції. Ця функція була грою «Комп'ютерний Космос», варіант «Космічних Воєн», в якому ракета билася з тарілками, що літають, замість іншого корабля.
«Космічні Війни» були не єдиним попередником комерційних комп'ютерних ігор, що з'явилися на великих комп'ютерах в коледжах. Якийсь невідомий автор почав грати в гру Star Trek («Зоряна дорога») в шестидесятих роках. Ніхто не знає, хто першим створив таку гру -- він або вона, ймовірно, подали б судовий позов, якби автор гри був точно визначений -- але ця гра також з'явилася на колледжських комп'ютерах по всій країні до 1969 року.
Гра «Зоряна дорога» сама по собі була не дуже витонченою. У грі були лінії на зразок грат, які дозволяли зоряним кораблям подорожувати від однієї крапки до іншої, гра використовувала символи для ідентифікації кораблів, надавала численну інформацію у відсотках, і дозволяла літати швидше, ніж швидкість світла. До середини 70-х років майже на кожній домашній комп'ютерній системі була доступна та або інша форма цієї гри. Існувала версія цієї ж гри для IBM під назвою Star Fleet («Зоряний Флот»).
Нарешті, варто згадати подаруй найбільш важливу гру, Adventure («Пригоди»). У грі використовувалися двухсловні команди, ім'я її розробника Вілл Краудер. Це була перша пригодницька комп'ютерна гра.
Крім того, в кінці 70-х була створена гра на ім'я Zork, яка стала доступна для користувачів домашніх комп'ютерів в 1981 році. Цю гру до цих пір можна купити. Гра Zork ґрунтується на грі Adventure.
1.2 Опис наочної області
Наочна область даного проекту - гра «Морський бій». Вона реалізується за допомогою натиснень на клавіші миші (розміщення кораблів і постріли по кораблях противника, вдалі попадання фіксуються хрестиком). Правила гри наступні: у полі 10х10 користувач розставляє свої кораблі (кораблі не повинні лежати один на одному, стояти поряд, перетинатися). Так само комп'ютер на своєму ігровому полі розставляє свої кораблі. Кількість кораблів 10, а саме: один чотирьохпалубний (одна палуба відповідає одній клітці ігрового поля), два трьохпалубних, три двопалубний і чотири однопалубних. Після розставляння кораблів користувач і комп'ютер по черзі «стріляють» по клітках ігрового поля противника. Якщо кому-небудь з них удалося попасти у ворожий корабель, то, згідно з правилами, хід не переходить до противника (якщо гравець попав в корабель противника, то він має право ще одного пострілу) до наступного промаху. Перемога дістається тому, хто першим знищить всі кораблі.
1.3 Постановка задачі
Таким чином, необхідно розробити метод і алгоритм створення гри «Морський бій». Для цього необхідно вирішити наступні задачі:
- проаналізувати методи створення гри;
- використовуючи метод випадкових чисел виконати алгоритм гри комп'ютера;
- розробити алгоритм розташування кораблів на полі комп'ютера;
- реалізувати розроблені методи й алгоритми у вигляді комп'ютерної моделі. комп'ютерний гра програмний алгоритм
2. Розробка алгоритму гри «Морський бій»
2.1 Алгоритм розташування кораблів на ігровому полі
Ігрове поле потрібно якось зберігати в пам'яті комп'ютера. Найбільш проста реалізація - у вигляді матриці 10x10 кліток (вічок).
Обумовимося, що порожнє вічко матиме значення -1, а вічко, в якому знаходиться корабель: 0. Перед початком процесу розміщення кораблів необхідно очистити поле. Окрім цього треба ще і відновити лічильник випадкових чисел, що б добитися реальної випадковості позицій флоту комп'ютера.
По правилах гри два кораблі не можуть стикатися один з одним, тобто між ними має бути порожній простір мінімум в одну клітку. Нам знадобиться допоміжна функція, яка дозволить визначити, чи можна поставити однопалубний корабель у вказане вічко чи ні. Для цього необхідно перевірити саму це вічко і всі сусідні (їх 8 штук). І лише якщо всі вони не зайняті можна дати позитивну відповідь (True), інакше - негативний (False)
Як відомо з правил гри, на полі повинні знаходитися наступні кораблі: один чотири палубний, два трьохпалубних, три двопалубних і чотири однопалубних. Функція, що розставляє ці кораблі повинна виконувати наступні дії: узяти випадкове вільне вічко і перевірити, чи можна поставити поточний корабель горизонтально або вертикально. Якщо так, то корабель розміщується на ігровому полі і обробка переходить до наступного. Зрозуміло, що якщо немає, то повертаємося до вибору координат. Порядок дій має бути від більшого корабля до меншого, що б не виникла ситуація неможливості розміщення ні в одну позицію поля.
Це, власне, і все, що стосується розміщення кораблів комп'ютера.
2.2 Стратегія гри комп'ютера
Завдання полягає в розробці алгоритму, по якому комп'ютер зможе грати в "Морський бій" з максимальною якістю і при цьому не підглядаючи розташування флоту гравця. Додаткова і очевидна умова: при кожній новій грі незалежно від розміщення сил противника комп'ютер повинен грати по-різному, тобто його ходи мають бути не передбачені. Необхідно пригадати правила гри: учасники поєдинку роблять ходи по черзі, причому, якщо один з гравців потрапляє по кораблю суперника, то він отримує право наступного ходу. Якщо реалізувати пошук мети комп'ютером у вигляді окремої функції, то треба якось навчити його запам'ятовувати результати минулих пострілів, щоб адекватно виробити наступний. З цього факту витікає, що найпростіше і раціональніше вирішення даної проблеми можна оформити у вигляді кінцевого автомата, що найточніше описує послідовність дій:
1. Простріл ігрового поля по випадкових координатах до попадання по кораблю, після чого перехід в другий стан;
2. Обстріл довкола підбитого вічка поля для визначення напряму корабля (вертикальне або горизонтальне), після чергового попадання - перехід в третій стан;
3. Розстріл корабля в отриманому напрямі до повного його знищення, після чого перехід в перший стан.
І так, вся гра зациклена на трьох основних діях: простріл, обстріл і розстріл. Всі ці дії повинні продовжуватися до тих пір, поки в однієї із сторін не будуть знищені всі кораблі.
Простріл
На цьому етапі комп'ютер повинен зловити який-небудь з кораблів противника. Для цього він стрілятиме по довільних незайнятих клітках поля гравця. Набагато ефективніше спочатку обробитися з великими кораблями, тому вибираючи координати для пострілу треба перевіряти, що б в цій позиції міг розміститися найбільший з кораблів, що залишилися. Процес припиняється, як тільки станеться попадання. Позначимо підбиту частину корабля значенням 1, а промах -2 відповідного вічка поля. Якщо у гравця залишилися лише однопалубні кораблі, то цим попаданням корабель знищений повністю і обстрілювати його немає сенсу. Інакше треба перейти до другого стану.
Обстріл
На цьому кроці завдання полягає у визначенні напряму спійманого корабля. Для цього треба обстріляти чотири вічка (якщо вони вільні), які можуть служити продовженням. У разі, коли всі чотири клітки обстріляно, а попадання не сталося (однопалубний корабель), треба перейти до першого стану. Якщо в якийсь момент удалося підбити ще одну палубу противника, то можна переходить до розстрілу даного корабля, оскільки його напрям став відомий. Аналогічно першому стану, якщо у гравця залишилися кораблі не більше двох палуб, то цим попаданням корабель знищений повністю і треба повернутися до прострілу.
Розстріл
На попередньому кроці удалося встановити в якому напрямі розміщений спійманий корабель. Тепер завдання полягає в його повному знищенні. Для цього треба стріляти справа або зліва (зверху або знизу) підбитих палуб, поки не доб'ємо його целіком, після чого повернемося в стан прострілу. При цьому слід враховувати максимально можливий корабель і прагнути попасти по четвертій палубі, коли чотири палубний корабель знищений, немає жодного сенсу.
3. Комп'ютерна модель гри «Морський бій»
3.1 Обґрунтування вибору середовища програмної реалізації
Програма реалізована в середовищі розробки Microsoft Visual Studio 2008 на мові об'єктно-орієнтованого програмування С++.
Microsoft Visual Studio 2008 допомагає індивідуальним програмістам і невеликим групам, що створюють будь-які види ПО, прискорити розробку додатків і створення призначених для користувача інтерфейсів з принципово новим рівнем зручності, підвищити ефективність колективної роботи.
Visual Studio 2008 допомагає писати код швидше, підтримуючи безліч засобів і можливостей, які підвищують продуктивність праці.
Технологія Intellisense є різновидом авто завершення: як тільки ви вводите ім'я класу або об'єкту і ставите крапку, показується список доступних членів даного класу або об'єкту. Це прискорює кодування, оскільки зменшується кількість тексту, що набирає на клавіатурі.
Візуальні конструктори Visual Studio 2008 дозволяють створювати потужні і привабливі застосування, засновані на Windows Presentation Foundation, -- графічній підсистемі
3.2 Програмна реалізація
З метою зручнішого проектування, налаштування, і розділення окремих виконуваних операцій, програма побудована на класах, які взаємодіють між собою. Використання класів дає покращуваною розуміння коди, а значить налаштування і подальшу модифікацію вихідної коди програми. У даній програмі чітко просліджуються групи функцій, які із-за виконуваних ними операцій варто об'єднати в класи. Проаналізувавши наочну область програми можна виділити наступні класи:
-Game
-Main
-Computer
-Shell
Клас Main - клас, який забезпечує початок гри, містить в собі вісім функцій, а саме:
WinMain - точка входу в програму, аналог main в консольних додатках. У ній відбувається ініціалізація головного вікна.
WndProc - обробник подій. У цій функції перевіряється чи натискує кнопка.
InitializeShipButtonSelect - відбувається ініціалізація кнопок - кораблів, за допомогою яких відбувається розставляння їх на полі.
ActionsForAllButtons - обробник натиснення всіх кнопок, який залежно від типа кнопки перенаправляє подію в інший метод.
ActionsForCompFieldButton - обробник натиснення кнопок-поля комп'ютера, застосовується при грі.
ActionsForFieldButtons - обробник натиснення кнопок-поля користувача, застосовується при розставлянні.
CheckeNabledButton - перевіряє на кількість кораблів, що залишилися, на кожній палубі, якщо таких вже ні переводить кнопку в неактивований стан.
ActionsForPlaceButtons - обробник кнопок-кораблів розставляння.
Клас Game - забезпечую сам процес гри, містить в собі шість функцій:
Game - конструктор, ініціалізація всіх змінних.
InitializeFields - розставляє кнопки на формі(поля гравця і комп'ютера).
PlaceCompShip - розміщення кораблів комп'ютера.
NextCompStep - здійснюємо хід комп'ютера.
MakeUserShot - перевіряємо хід гравця і повертаємо стан.
~Game - деструктор.
Клас Computer - відповідає за гру комп'ютера. Містить в собі шість функцій:
ShotAlgorythm - алгоритм стрілянини комп'ютера.
PlaceShips - алгоритм розставляння кораблів комп'ютера
CheckShot - перевірка пострілу, занесення результатів в матрицю комп'ютера
ship_is_good - перевірка на можливість розташування корабля
set_ship_with_size - завдання корабля з певним розміром
set_ships - завдання всіх кораблів.
Клас Shell - відповідає а реалізацію пострілу.
3.3 Інструкція користувача
Перед початком гри необхідно:
1. Запустити гру «Морський бій».
2. Розташувати всі свої кораблі.
3. Почати гру, користувач завжди стріляє першим.
4. Гра продовжується до тих пір, доки хтось не уб'є всі кораблі супротивника.
Висновки
У рамках даної курсової роботи була розроблена і реалізована гра «Морський бій». Було проведено дослідження компонентів програмного середовища Visual Studio 2008, які використовувалися при створенні гри. В результаті дослідження були виявлені наступні недоліки отриманого програмного продукту:
1.Низький штучний інтелект, тобто хід комп'ютера здійснюється випадковим чином, що робить маловірогідною перемогу комп'ютера;
2.При повному потопленні корабля це ніяк не відбивається;
3.Неможливість повернення ходів назад;
4.Працездатність додатка лише в середовищі Windows;
Проте, окрім недоліків, є і достоїнства в цього програмного продукту:
1. Можливість ручного розставляння кораблів гравця.
2. Програмний продукт маловимогливий до системних ресурсів комп'ютера.
В результаті обліку всіх зроблених вище зауважень можливе поліпшення створеного програмного продукту, на яке буде потрібно мінімум змін вихідної коди програми.
Перелік посилань
1. Страуструп, Б. Язык программирования С++. Часть 1 [Текст] / Б. Страуструп; перевод с англ. К.: ДиаСофт, 1993. 264 с.
2. Страуструп, Б. Язык программирования С++. Часть 2 [Текст] / Б. Страуструп; перевод с англ. К.: ДиаСофт, 1993. 296 с.
3. Павловська, Т. А. C/С++. Програмування на мові високого рівня / Т. А. Павлівська. СПб.: Пітер, 2010. 461 с.
4. Прата, С. Мова програмування С++. Лекції і вправи / С. Прата. М.: Вільямс, 2006. 1184 с.
Додаток А
Вихідний текст програми
Constants.h
const int Empty = 0;
const int EmptyAndShooted = 1;
const int DeadZone = 2;
const int Hited = 3;
const int Ship = 4;
const int Killed = 5;
const int MaxCells = 20;
const int ColSize = 10;
const int FormLeft = 20;
const int FormTop = 20;
const int ButtonWidth = 20;
const int ButtonHeight = 20;
const int WidthBetweenFields = 100;
Shell.h
#pragma once
class Shell
{
private:
int _x;
int _y;
bool _isUser;
public:
int X(){return _x;}
int Y(){return _y;}
bool IsUser(){return _isUser;}
Shell(int x,int y, bool isUser){
_x = x;
_y = y;
_isUser = isUser;
}
bool IsNull(){return _x==0 && _y==0;}
~Shell(void);
};
Computer.h
#include "Shell.h"
#include <iostream>
class Computer
{
private:
int** _compField;
int** _possibleUserField;
Shell* _lastRightCell;
Shell* direction;
public:
Computer(int** userField);
Shell* ShotAlgorythm();
bool PlaceShips();
void CheckShot(Shell* shell, int state);
~Computer(void);
private:
bool ship_is_good(int size, bool is_horiz, int row_top, int col_left, int** field);
void set_ship_with_size(int size, int** field);
void set_ships();
};
Game.h
#pragma once
#include "Computer.h"
#include "Constants.h"
#include <Windows.h>
class Game
{
private:
int** _userField;
int** _compField;
int _lostUserCells;
int _lostCompCells;
Computer* _computer;
public:
int** GetUserField(){return _userField;}
Game(void);
void InitializeFields(HWND hwnd);
void PlaceCompShip(void);
Shell* NextCompStep(void);
int MakeUserShot(int x,int y);
~Game(void);
};
Shell.cpp
#include "Shell.h"
Computer.cpp
#pragma once
#include "Computer.h"
#include "Constants.h"
using namespace std;
Computer::Computer(int** compField)
{
_compField = compField;
direction=new Shell(0,0,false);
_possibleUserField = new int*[12];
for (int i=0;i<12;i++)
{
_possibleUserField[i]=new int[12];
for (int j=0;j<12;j++)
_possibleUserField[i][j]=Empty;
}
_lastRightCell = new Shell(0,0,false);
}
void Computer::CheckShot(Shell* shell, int state)
{
if (state==Ship)
{
if (!_lastRightCell->IsNull())
direction = new Shell(shell->X()-_lastRightCell->X(),shell->Y()-_lastRightCell->Y(),false);
_possibleUserField[shell->X()+1][shell->Y()+1]=Hited;
_lastRightCell=shell;
}
else
{
if (state==Killed)
{
_possibleUserField[shell->X()+1][shell->Y()+1]=Hited;
_lastRightCell = new Shell(0,0,false);
direction = new Shell(0,0,false);
}
else
{
_possibleUserField[shell->X()+1][shell->Y()+1]=EmptyAndShooted;
}
}
}
Shell* Computer::ShotAlgorythm()
{
int x;
int y;
if (_lastRightCell->IsNull())//Если мы не нашли ни одного корабля или все убиты
{
do
{
x = rand()%ColSize;
y = rand()%ColSize;
}
while (_possibleUserField[x+1][y+1]!=Empty);
}
else
{
if (direction->IsNull())
{
do
{
int dir = rand()%2;
if (dir==0)//по горизонтали
{
int dir2 = rand()%2;
y = _lastRightCell->Y();
if (dir2==0) //влево
x = _lastRightCell->X()-1;
else//вправо
x = _lastRightCell->X()+1;
}
else//по вертикали
{
int dir2 = rand()%2;
x = _lastRightCell->X();
if (dir2==0) //вверх
y = _lastRightCell->Y()-1;
else//вниз
y = _lastRightCell->Y()+1;
}
}
while (_possibleUserField[x+1][y+1]==EmptyAndShooted);
}
else
{
x=_lastRightCell->X()+direction->X();
y=_lastRightCell->Y()+direction->Y();
}
}
return new Shell(x,y,false);
}
bool Computer::PlaceShips()
{
try
{
set_ships();
}
catch(char *err_str)
{
return false;
}
return true;
}
Computer::~Computer(void)
{
}
//Private methods for setting ships
bool Computer::ship_is_good(int size, bool is_horiz, int row_top, int col_left, int** field)
{
if(is_horiz)
{
for(int i = row_top-1; i <= row_top + 1;++i)
{
for(int j = col_left - 1;j <= col_left + size; ++j)
{
if(field[i][j] == Ship) return false;
}
}
return true;
}
else//вертикальный
{
for(int i = row_top - 1; i <= row_top + size; ++i)
{
for(int j = col_left - 1; j <= col_left + 1; ++j)
{
if(field[i][j] == Ship) return false;
}
}
return true;
}
}
void Computer::set_ship_with_size(int size, int** field)
{
bool is_horiz = rand() % 2 == 0;
int row_top = 0;
int col_left = 0;
do
{
do
{
row_top = rand() % ColSize+1;
}while( !is_horiz
&& row_top > ColSize - size);
do
{
col_left = rand() % ColSize+1;
}while( is_horiz
&& col_left > ColSize - size);
}while(!ship_is_good(size, is_horiz, row_top, col_left, field));
if(is_horiz)
{
for(int j = col_left; j < col_left + size; ++j)
{
field[row_top][j] = Ship;
}
}
else//вертикальный
{
for(int i = row_top; i < row_top + size; ++i)
{
field[i][col_left] = Ship;
}
}
}
void Computer::set_ships()
{
for(int i = 0; i < 1; ++i)
{
set_ship_with_size(4, _compField);
}
for(int i = 0; i < 2; ++i)
{
set_ship_with_size(3, _compField);
}
for(int i = 0; i < 3; ++i)
{
set_ship_with_size(2, _compField);
}
for(int i = 0; i < 4; ++i)
{
set_ship_with_size(1, _compField);
}
}
Game.cpp
#include "Game.h"
Game::Game(void)
{
//Инициализируем поля игрока и компьютера пустыми клетками
_userField = new int*[12];
_compField = new int*[12];
for (int i=0;i<12;i++)
{
_userField[i]=new int[12];
_compField[i]=new int[12];
for (int j=0;j<12;j++)
{
_userField[i][j] = Empty;
_compField[i][j] = Empty;
}
}
_lostCompCells=20;
_lostUserCells=20;
_computer = new Computer(_compField);
}
int Game::MakeUserShot(int x,int y)
{
if (_compField[x][y]==EmptyAndShooted||_compField[x][y]==Hited)
return -1;
if (_compField[x][y]==Ship)
{
_lostCompCells--;
_compField[x][y]=Hited;
for (int i=x-1;i<=x+1;i++)
for (int j=y-1;j<=y+1;j++)
if (_compField[i][j]==Ship)
return Ship;
return Killed;
}
else
{
_compField[x][y]=EmptyAndShooted;
return _compField[x][y];
}
}
void Game::InitializeFields(HWND hwnd)
{
for (int pl = 0;pl<2;pl++) //поля для игрока и компьютера
{
for (int i=0;i<10;i++)
{
for (int j=0;j<10;j++)
{
int x = pl*(10*ButtonWidth + WidthBetweenFields) + FormLeft + i*ButtonWidth; //pl*(10*ButtonWidth + 50int y = FormTop + j*ButtonHeight;
HWND button = CreateWindowEx(WS_EX_CLIENTEDGE,L"Button",L"",WS_CHILD|WS_VISIBLE,
x,y,ButtonWidth,ButtonHeight,hwnd,(HMENU)(pl*100+i*10+j),NULL,NULL);
}
}
}
}
void Game::PlaceCompShip(void)
{
while (!_computer->PlaceShips()){}
}
Shell* Game::NextCompStep(void)
{
if (_lostCompCells==0)
{
return new Shell(-10,-10,true);
}
Shell* shell = _computer->ShotAlgorythm();
int x = shell->X()+1, y = shell->Y()+1;
int state = Empty;
if (_userField[x][y]==Ship)
{
_lostUserCells--;
_userField[x][y]=Hited;
state = Killed;
for (int i=x-1;i<=x+1&&state!=Ship;i++)
{
for (int j=y-1;j<=y+1&&state!=Ship;j++)
{
if (_userField[i][j]==Ship)
{
state = Ship;
}
}
}
}
else
{
_userField[x][y]=EmptyAndShooted;
}
_computer->CheckShot(shell,state);
if (_lostUserCells==0)
return new Shell(-20,-20,false);
return shell;
}
Game::~Game(void)
{
}
Main.cpp
#pragma once
#include <iostream>
#include <Windows.h>
#include "Game.h"
#include <time.h>
using namespace std;
//constants
const char g_szClassName[] = "myWindowClass";
const int Width = 750;
const int Height = 400;
//variables
Game* game;
int** userField;
int selectedShip;
int Ships[4] = {4,3,2,1};
int lostShips = 10;
void Initialize()
{
game = new Game();
userField = game->GetUserField();
}
void ActionsForPlaceButtons(HWND hwnd,WPARAM wParam, LPARAM lParam)
{
selectedShip = wParam;
}
void ShowCompShips(HWND hwnd,int** compfield)
{
int **field = game->GetCompField();
for (int i=0;i<10;i++)
{
for (int j=0;j<10;j++)
{
if (field[i+1][j+1]!=Empty)
{
int BtnID = 100+i*10+j;
SetDlgItemText(hwnd,BtnID,L"X");
}
}
}
}
void CheckEnabledButton(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
int shipID = selectedShip%1000-1;
Ships[shipID]--;
lostShips--;
if (Ships[shipID]==0)
{
HWND horizontalButton = GetDlgItem(hwnd,1001+shipID);
HWND verticalButton = GetDlgItem(hwnd,2001+shipID);
EnableWindow(horizontalButton,false);
EnableWindow(verticalButton,false);
}
if (lostShips==0)
{
game->PlaceCompShip();
ShowCompShips(hwnd,game->GetCompField());
}
}
void ActionsForFieldButtons(HWND hwnd, WPARAM wParam, LPARAM lParam)//расстановка кораблей
{
if (lostShips==0) return;
int x = wParam/10;
int y = wParam%10;
if (userField[x][y]!=Empty)
{
MessageBox(hwnd,L"Cell is reserved!",L"Atention",MB_ICONINFORMATION);
return;
}
if (selectedShip==0)
{
MessageBox(hwnd,L"Ship wasn't selected",L"Atention",MB_ICONINFORMATION);
return;
}
int horizonalCheck;
int verticalCheck;
if (selectedShip/1000==1)
{
horizonalCheck = selectedShip%1000+2;
verticalCheck = 3;
}
else
{
horizonalCheck = 3;
verticalCheck = selectedShip%1000+2;
}
for (int i=0;i<horizonalCheck;i++)
{
if (x+i>11)//Ограничение поля
{
MessageBox(hwnd,L"Can't place ship here!",L"Atention",MB_ICONINFORMATION);
selectedShip=0;
return;
}
for (int j=0;j<verticalCheck;j++)
{
if (userField[x+i][y+j]!=Empty)
{
MessageBox(hwnd,L"Cell is reserved!",L"Atention",MB_ICONINFORMATION);
selectedShip=0;
return;
}
}
}
for (int i=0;i<selectedShip%1000;i++)
{
int btnID;
if (selectedShip/1000==1)
{
userField[x+i+1][y+1] = Ship;
btnID = (x+i)*10+y;
}
else
{
userField[x+1][y+i+1] = Ship;
btnID = x*10+y+i;
}
wchar_t ch[2];
_itow_s(selectedShip%1000,ch,10);
SetDlgItemText(hwnd,btnID,ch);
}
CheckEnabledButton(hwnd,wParam,lParam);
selectedShip=0;
}
void ActionsForCompFieldButton(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
if (lostShips!=0) return;
wParam-=100;
int x = wParam/10;
int y = wParam%10;
int state = game->MakeUserShot(x+1,y+1);
if (state==-1)
{
MessageBox(hwnd,L"This cell was used",L"Attention",MB_ICONINFORMATION);
return;
}
LPCTSTR str;
switch (state)
{
case Ship: str=L"Hit"; break;
case Killed: str=L"kill"; break;
default: str=L"Empty";break;
}
SetDlgItemText(hwnd,12345,str);
int btnID = 100+x*10+y;
switch (state)
{
case Ship: SetDlgItemText(hwnd,btnID,L"X"); break;
case Killed:SetDlgItemText(hwnd,btnID,L"X"); break;
default: SetDlgItemText(hwnd,btnID,L"*"); break;
}
Shell* sh = game->NextCompStep();
if (sh->X()==-10)//user win
{
MessageBox(hwnd,L"You win!",L"We have winner!",MB_ICONINFORMATION);
exit(0);
}
else if (sh->X()==-20)//comp win
{
MessageBox(hwnd,L"Computer win!",L"We have winner!",MB_ICONINFORMATION);
exit(0);
}
int ux = sh->X(), uy = sh->Y();
int ustate = userField[ux+1][uy+1];
switch (ustate)
{
case Hited:SetDlgItemText(hwnd,ux*10+uy,L"X");
break;
case Ship:SetDlgItemText(hwnd,ux*10+uy,L"S"); break;
default:SetDlgItemText(hwnd,ux*10+uy,L"*");
break;
}
}
void ActionsForAllButtons(HWND hwnd,WPARAM wParam, LPARAM lParam)
{
if (hwnd == INVALID_HANDLE_VALUE) return;
try
{
if (wParam/1000>0)
{
ActionsForPlaceButtons(hwnd,wParam,lParam);
}
else
{
if (wParam/100==0)
ActionsForFieldButtons(hwnd,wParam,lParam);
else if (wParam/100==1)
ActionsForCompFieldButton(hwnd,wParam,lParam);
}
}
catch(char *err_str)
{
MessageBox(hwnd,LPCWSTR(err_str),L"",MB_ICONERROR);
exit(0);
}
}
void InitializeShipButtonSelect(HWND hwnd)
{
int yPos=4;
for (int i=4;i>0;i--)
{
wchar_t chr[2];
_itow_s(i,chr,10);
int x = FormLeft+10*(ButtonWidth+1);
int y = FormTop+(ButtonHeight+10)*(yPos-i);
HWND button = CreateWindowEx(WS_EX_CLIENTEDGE,L"Button",chr,WS_CHILD|WS_VISIBLE,
x,y,ButtonWidth*i,ButtonHeight,hwnd,(HMENU)(1000+i),NULL,NULL);//корабли по горизонтали
HWND button1 = CreateWindowEx(WS_EX_CLIENTEDGE,L"Button",chr,WS_CHILD|WS_VISIBLE,
y,x,ButtonWidth,ButtonHeight*i,hwnd,(HMENU)(2000+i),NULL,NULL);//корабли по вертикали
}
CreateWindowEx(WS_EX_NOACTIVATE,L"STATIC",L"",WS_CHILD|WS_VISIBLE,240,150,60,15,hwnd,(HMENU)(12345),NULL,NULL);
}
// Step 4: the Window Procedure
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) //Обработка событий
{
switch(msg)
{
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_COMMAND:
if (HIWORD(wParam)==BN_CLICKED)//если событие нажатия на кнопку
{
ActionsForAllButtons(hwnd,wParam,lParam);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow) //main
{
srand(time(0));
WNDCLASSEX wc;
HWND hwnd;
MSG Msg;
//Step 1: Registering the Window Class
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = LPCWSTR(g_szClassName);
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&wc))
{
MessageBox(NULL, L"Window Registration Failed!", L"Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
// Step 2: Creating the Window
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
LPCWSTR(g_szClassName),
L"Sea Battle",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, Width, Height,
NULL, NULL, hInstance, NULL);
if(hwnd == NULL)
{
MessageBox(NULL, L"Window Creation Failed!", L"Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
//Create controls
Initialize();
InitializeShipButtonSelect(hwnd);
game->InitializeLetters(hwnd);
game->InitializeFields(hwnd);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
// Step 3: The Message Loop
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
Додаток В
Тестування програми
Рис. 1 Початок гри «Морський бій»
Рис. 2 Гравець розташував свої кораблі
Рис. 3 Повідомлення про невірне розташування корабля
Рис. 4 Повідомлення про попадання у корабель супротивника
Рис. 5 Повідомлення про потоплення корабля супротивника
Рис. 6 Повідомлення про отримання перемоги гравцем
Рис. 7 Повідомлення про перемогу комп'ютера
Рис. 8 Перевірка вірності розташування кораблів комп'ютера
Размещено на Allbest.ru
Подобные документы
Історія появи перших обчислювальних машин. Пам'ять як один із основних елементів комп'ютера, що дозволяє йому нормально функціонувати. Значення внутрішньої пам'яті комп'ютера з позиції зберігання інформації. Аналіз зовнішньої пам’яті та її модернізація.
реферат [24,4 K], добавлен 27.12.2011"Критичні" комплектуючі комп'ютера. Процесор та оперативна пам'ять. Швидкість роботи комп'ютера. Порівняння швидкодії комплектуючих з роботою еталонних моделей. Стратегія і варіанти модернізації. Функціональні особливості побудови материнської плати.
курсовая работа [4,6 M], добавлен 24.06.2013Призначення програми BurnInTest та її функціональні можливості. Конфігурація тестового стенду. Тестування жорсткого диску комп’ютера з використанням програми HD TunePro. Рекомендації по підвищенню продуктивності та оптимізації комп’ютера, що тестується.
курсовая работа [4,8 M], добавлен 27.02.2013Способи виявлення й видалення невідомого вірусу. Спроби протидії комп’ютерним вірусам. Способи захисту комп’ютера від зараження вірусами та зберігання інформації на дисках. Класифікація комп'ютерних вірусів та основні типи антивірусних програм.
реферат [17,1 K], добавлен 16.06.2010Системний блок як корпус, який містить основні компоненти персонального комп’ютера. Коротка характеристика головних зовнішніх та внутрішніх пристроїв персонального комп’ютера. Послідовність операцій при обтиску та обробленні роз'єму "витої пари".
лабораторная работа [1,7 M], добавлен 02.06.2011Основні блоки персонального комп'ютера та їх значення. Варіанти організації внутрішньомашиного інтерфейсу. Функціональна схема мікропроцесору. Види запам'ятовуючих пристроїв. Послідовність роботи блоків комп'ютера. Основні зовнішні та внутрішні пристрої.
курсовая работа [346,8 K], добавлен 05.01.2014Поняття та класифікація комп’ютерних ігор. Відтворення гри "Морський бій" у вигляді комп’ютерної програми. Компоненти програмного середовища Delphi, що були використані під час її створення. Алгоритм реалізації ігрового процесу та скріншоти з програми.
дипломная работа [418,2 K], добавлен 12.07.2013Програми, які виводять на екран характеристики комп'ютера. Розробка програми "Монітор використання ресурсів комп’ютера" на мові програмування ASM-86. Алгоритм програми та її реалізація. Системні вимоги, інструкція для користувача, лістинг програми.
курсовая работа [22,2 K], добавлен 08.08.2009Внутрішнє представлення в пам’яті комп’ютера даних базових та похідних типів, масивів. Ідентифікатор, зв'язаний з константним виразом та основи представлення даних. Алгоритм представлення цілих, дійсних, логічних і символьних чисел, структур і об’єднань.
курсовая работа [279,1 K], добавлен 25.08.2014Передумови та фактори, що зумовлюють необхідність комп’ютеризації у аптеці. Задачі та цілі, що вирішуються при використанні комп’ютерних програм в аптеці. Порівняльний аналіз деяких інформаційних систем для вибору постачальника лікарських засобів.
курсовая работа [318,4 K], добавлен 01.03.2013