Темою курсового проекту є «Еврістичне створення головоломки».
Евристика (грец. heurisko - знаходжу, відшукую, відкриваю) - наука, яка вивчає творчу діяльність, методи, які використовуються у відкритті нового і в навчанні. Евристичні методи (друга назва Евристики) дозволяють пришвидшити процес вирішення задачі. Значний інтерес до їх дослідження виник у звязку з можливістю вирішення ряду задач (розпізнавання обєктів, доведення теорем і т.д.), в яких людина не може дати точний алгоритм вирішення, з допомогою технічних засобів. Метою Евристики є побудова моделей процесу вирішення якої-небудь нової задачі.
Існують наступні типи моделей:
1. модель сліпого пошуку, яка спирається на так званий метод проб і помилок;
2. лабіринтна модель, в якій вирішувана розглядається як лабіринт, а процес пошуку рішення - як прохід по лабіринту;
3. структурно-семантична модель, яка рахується на даний час найбільш повною і яка відображає семантичні відношення між обєктами, які складають область задачі.
Евристика повязана з психологією, фізіологією вищої нервової діяльностю, кібернетикою і т.д.
Найпершою задачею еврістичного пошуку була головоломка, яка передбачала пересування гральних фішок по горизонталі або вертикалі на порожню ділянку до тих пір, доки отримана конфігурація не буде відповідати цільовій конфігурації.
Програма, виконана у курсовій роботі, є комп'ютерною версією відомої «П'ятнашки». Це логічно нескладна і достатньо проста у керуванні і використанні програма.
Актуальність теми полягає у тому, що на сьогоднішній день комп'ютер став досить важливою частиною життя суспільства, а комп'ютерні ігри набувають більшого поширення.
Метою курсової роботи є поглиблення знань і розширення навиків по розробці алгоритмів та їх реалізації на персональному комп'ютері. Вона виконана в середовищі Турбо Паскаль з використанням графічних можливостей мови у роботі із масивами і графікою.
1. Постановка задачі
Пятнашки - популярна головоломка, що являє собою набір однакових квадратних кісточок з нанесеними числами, ув'язнених у квадратну коробку.
Суть самої гри полягає в наступному:
Гравець на екрані бачить табло, яке розбито на 16 кліток. У п'ятнадцяти з них розташовані неповторювані цифри, у випадковому порядку від 1 до 15 і одна порожня.
У загальному виді дане табло можна представити у вигляді таблиці 1:
Таблиця 1. Зразок табло
5
7
3
8
15
1
13
2
14
10
6
4
9
11
12
Гравець повинен переміщати по одній клітинці із цифрою на порожнє місце.
Так відбувається доти, доки користувач не вибудує послідовну комбінацію цифр (Таблиця 2), і лише після цього гравець уважається переможцем.
Таблиця 2. Правильне заповнення табло
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Для розробки програми потрібно врахувати необхідність створення ігрового табло в графічному вигляді, розподілу його на необхідну кількість осередків, заповнення табло випадковими числами, розробку способу управління.
2. Проектування
2.1 Розробка функціональної схеми
Незважаючи на простоту даної програми, написання алгоритму виявилося досить не простим завданням. У зв'язку із цим довелося розділити його, з метою його читаності й доступності.
Основний алгоритм програми розбитий на два розділи;
1. Керування;
2. Гра;
Рис. 2.1.1. Функціональна схема
Розділ Керування.
У даному розділі, користувачеві пропонується ознайомитися із клавішами керування.
Розділ Гра.
Даний розділ є основним. Саме в цьому розділі відбуваються основні події. Реалізований даний алгоритм за допомогою процедури Game15.
Алгоритм даного розділу полягає в наступному:
1. Ініціалізація графічного режиму;
2. Заповнення в пам'яті комп'ютера табло випадковими цифрами;
3. Вивід табло на екран;
4. Уведення напрямку переходу;
5. Пошук порожнього елемента;
6. Переміщення елементів табло;
7. Вихід з режиму гри:
У програмі використовуються наступні вхідні дані (див. табл. 2.1.1.).
Таблиця 2.1.1. Імена та типи даних
Ім'я ідентифікатора
Тип
Призначення
as
array [1.. 3,1..3] of string
Необхідно для зберігання елементів табло
bs
array [1..16] of integer
Необхідний для виведення випадкових чисел
hod
integer
Лічильник, що зчитує кожен хід, хроблений користувачем
i, j
integer
Необхідні для роботи з масивами
strok, stolb
integer
Необхідні для збереження координат порожньої комірки
Ch
Char
Необхідна для збереження коду натиснутої клавіші клавіатури
2.2 Розробка алгоритмів
Алгоритм даної гри (Рис. 2.2.1. Алгоритм гри.) реалізований за допомогою процедури Game15 і полягає в наступному:
Ініціалізація графічного режиму;
Заповнення в пам'яті комп'ютера табло випадковими цифрами;
Виведення табло на екран;
Введення напряму переходу;
Пошук порожнього елементу;
Переміщення елементів табло;
Вихід з режиму гри;
Схематично, даний алгоритм виглядає наступним чином:
Рис. 2.2.1. Алгоритм гри
1) Ініціалізація графічного режиму
Ініціалізація графічного режиму здійснюється в процедурі Game15. Перехід до графічного режиму здійснюється, за допомогою процедури Initgraph (grdriver, grmode, grpath), де grdriver - це використовувані програмою драйвер відеоадаптера (VGA), grmode - режим роботи відеосистеми (Vgahi), grpath - це місце знаходження файлу EGAVGA.BGI на диску (як і у випадку з файлами, пишемо тільки ім'я й розширення файлу, а не повний шлях, для того щоб у майбутньому можна було переміщати файли програми).
2) Заповнення табло випадковими числами
У пам'яті комп'ютера створюється табло, в якому, надалі проводитимуться перестановки. Табло складається з 16 (4 рядки і 4 три стовпці), яке заповнюється п'ятнадцятьма, цифрами, що не повторюються, від 1 до 15 і однією порожньою кліткою.
Даний розділ реалізований за допомогою процедури Tablo. Фактично табло, яке описується раніше це двовимірний масив з цифрами від 1 до 15 і порожня клітинка.
Наступному моментом реалізації даної процедури, є заповнення табло випадковими цифрами. Для заповнення табло випадковими цифрами використовується функція random, яка є генератором випадкових цифр, але працює відповідно тільки з цифрами, а у нас рядковий двовимірний масив.
Проаналізувавши вище сказане, приходимо до того, що необхідно створити два масиви. Один одномірний із шістнадцяти елементів типу integer, другий двовимірний, чотири на чотири, типу string. Спочатку одномірний масив, у випадковому порядку, заповнюється цілими неповторюваними цифрами від 1 до 16, а потім залежно від розташування цифр, заповнюється двовимірний строковий масив. ПРИМІРОМ, якщо перший елемент одномірного масиву дорівнює цифрі 11 тоді першому елементу двовимірного масиву буде привласнено рядок «11».
Загальний алгоритм (Рис. 2.2.2. Алгоритм заповнення табло випадковими числами.) полягає в наступному:
Деякій змінній b привласнюється випадкове число, за допомогою функції random. При чому функція random обмежена інтервалом від 1 до 16.
Перевірка, чи є співпадання;
Змінна b порівнюється з кожним елементом масиву bs[і], за допомогою інструкцій For і if. Якщо такий елемент уже присутній в одномірному масиві, тоді змінної b, знову привласнюється випадкове число. Так відбувається доти, поки змінної b не буде привласнена цифра, якої ще немає в масиві.
- Занесення інформації в масив.
Значення змінної b, яке було знайдено раніше, вноситься в масив bs[і], за останнім елементом внесений у масив
- Перевірка чи заповнений масив.
Програма перевіряє чи заповнений масив повністю, якщо ні, те алгоритм повертається.
У підсумку ми маємо одномірний масив заповнений, у випадковому порядку неповторюваному цифрами від 1 до 16.
- Заповнення двовимірного масиву.
Заповнення двовимірного масиву, за допомогою інструкції For і змінних і й j, які позначають стовпець і рядок.
Алгоритм заповнення двовимірного масиву полягає в наступному:
- Спочатку змінної z привласнюється одиниця. Дана змінна нам необхідна як лічильник.
- Кожному елементу j рядка й і стовпця привласнюється строковий елемент, залежно від цифри вартої під номером z в одномірному масиві, якщо поточної елемент одномірного масиву містить цифру 8, те поточному елементу двовимірного масиву привласнюється строковий елемент «8». Виключенням становить цифра 16. У цьому випадку у двовимірний масив уводиться пробіл. Вибір строкового елемента здійснюється за допомогою інструкції case.
- Так відбувається доти, поки двовимірний масив не буде повністю заповнений.
3) Виведення табло.
У даному розділі на екрані з'являється табло з поточною комбінацією цифр. Спочатку, табло заповнюється випадковим чином, а надалі на екрані буде відображено поточне перебування цифр на табло, залежно від зроблених користувачем ходів.
Даний розділ реалізований в процедурі Vivod.
Загальний алгоритм (Рис. 2.2.3. Алгоритм виведення табло.) даного розділу полягає в наступному:
- Промальовування клітинок;
- Промальовування рамки;
- Виведення елементів масиву зверху клітинок табло;
Рис. 2.2.3. Алгоритм виведення табло
Промальовування клітинок;
Малювання кліток здійснюється в наступному порядку:
2) Визначення розміру майбутніх кліток, за допомогою двох змінні (h1, w1, координати верхньої лівої й правої нижньої крапок);
3) За допомогою процедури Setfillstyle, задаємо потрібний колір і стиль заповнення. Колір виберемо синій, а стиль заповнення поберемо Solidfill - суцільне заливання поточному кольором, тобто синім.
4) За допомогою процедури Bar вичерчуємо на екрані квадрат.
5) Щоб дані дії не повторювати 16 раз, використовуємо інструкцію For.
Промальовування рамки;
Для того, щоб табло мало закінчений вигляд, помістимо раніше створені клітинки в рамку, за допомогою процедури Line.
Виведення елементів масиву на клітинках табло;
У підсумку на екрані з'являється табло із шістнадцятьома клітками, залишається лише в центр цих кліток помістити цифри із двовимірного масиву.
Тому що ми перебуваємо в графічному режимі, то для висновку елементів двовимірного масиву використовуємо процедуру Outtextxy.
У підсумку на екрані з'явиться досить акуратне й не погано оформлене табло із клітками, у центрі кожної з яких, перебуває цифра.
У майбутньому, коли користувач буде переміщати клітки, він фактично буде робити операції з масивом і на екран буде виводитися інформація з масиву, у якім здійснена перестановка, а клітки залишаться незмінними.
4) Пошук порожнього елементу.
У даному розділі здійснюється пошук порожнього елементу, щоб надалі відносно його можна було б здійснювати пересування
Даний розділ реалізований в процедурі Poisk. Програма за допомогою інструкції For і змінних i і j порівнює кожен елемент двовимірного масиву AS, з порожнім елементом, за допомогою інструкції IF і коли знаходить, привласнює значення змінних i і j змінним strok і stolb. Таким чином, змінні strok і stolb як би є координатами порожнього елементу.
Загальний алгоритм (Рис. 2.2.4. Алгоритм пошуку порожнього елементу.) даного розділу полягає в наступному:
- Вибір елементу масиву;
- Перевірка, чи є даний елемент пропуском;
Привласнення координат рядка і стовпця змінним;
Рис. 2.2.4. Алгоритм пошуку порожнього елементу
Вибір елементу масиву;
За допомогою інструкції For по черзі вибиратимемо кожен елемент масиву.
Перевірка, чи є елемент порожньою коміркою;
За допомогою інструкції If, порівнюємо кожен елемент масиву з пропуском.
Запам'ятовування координат порожньої комірки;
Змінним strok і Stolb привласнюємо координати порожнього елементу.
5) Введення напряму переходу.
У даному розділі користувачеві пропонується вибрати напрям переходу кліток з цифрами, щодо порожньої клітки. Вибір здійснюється за допомогою курсору, на клавіатурі.
Даний розділ алгоритму реалізований в процедурі Napravlenie.
Фактично деякою змінною ch (типу char) привласнюється код натиснутої клавіші.
Алгоритм процедури полягає в наступному:
- Користувачеві пропонується, за допомогою курсору, ввести напрями переходу.
- Після того, як користувач, натиснув кнопку на клавіатурі, код клавіші привласнюється змінною ch, за допомогою функції readkey [3];
Наприклад, якщо користувач ввів напрям курсору вгору, це означає, що користувач натиснув службову клавішу під кодом 72.
6) Переміщення елементів табло
У даному розділі, залежно від напряму переходу, вибраного раніше за допомогою курсору, і розташування порожньої клітинки, відбувається переміщення:
Стрілка вліво - переміщає вліво цифру, що стоїть праворуч від порожньої клітинки;
Стрілка управо - переміщає управо цифру що стоїть зліва від порожньої клітинки;
Стрілка вниз - переміщає вниз цифру що стоїть зверху від порожньої клітинки;
Стрілка вгору - переміщає вгору цифру що стоїть знизу від порожньої клітинки.
Загальний алгоритм (Рис. 2.2.5. Алгоритм переміщення елементів табло.) реалізований в процедурі Zamena і полягає в наступному:
Вибір напряму перестановки;
Переміщення клітинок;
Рис. 2.2.5. Алгоритм переміщення елементів табло
Вибір напряму перестановки;
Коли користувач робить хід, він натискає службову клавішу, що кодується під певним номером. За допомогою інструкції IF і функції ord, вибирається напрями перестановки елементів.
Переміщення клітинок;
Залежно від значень змінних Strok, Stolb, яким було привласнено координати порожнього елементу в масиві і вибраного напряму, здійснюється переміщення.
Наприклад, користувач ввів напрям курсору вгору, це означає, що користувач натиснув службову клавішу під кодом 72, тоді, за допомогою інструкції if і функції ord (if ord(ch)=72 then), здійснюється переміщення.
Переміщення здійснюється за наступним принципом: порожньої клітинки, а саме елементу масиву з координатами as [strok, stolb], привласнюється вміст елементу що стоїть під порожньою клітинкою (as [strok, stolb]:= as [strok+1, stolb];), а відповідно елементу, що стоїть під порожньою клітинкою привласнюється пропуск (as [strok+1, stolb]:=' ';).
3. Програмування
Для написання програми знадобилося використання декількох програм і функцій стандартних модулів (див. Табл. 3.1.). Також для зручності текст програми був розбитий на декілька окремих дій, оформлених у вигляді процедур (див. табл. 3.2.)
Таблиця 3.1. Використані стандартні процедури та функції
32
Таблиця 3.2. Підпрограми користувача
Ім'я підпрограми
Призначення
Процедури
Основні процедури
Tablo
Дана процедура формує табло, заповнене випадковими цифрами, що не повторюються, від 1 до 8 і однією порожньою кліткою. Процедура реалізована з використанням двовимірного масиву.
Певній змінній привласнюється випадковим чином певне число від 0 до 8, при чому робиться негайна перевірка для виключення повторень. Після завершення, двовимірному масиву привласнюється значення змінної на одиницю більше (оскільки ми визначили діапазон її значень від 0 до 8), при чому числу 9 відповідає
Vivod
Процедура виводу на екран табло з цифрами, сформоване на момент відображення. Якщо програма тільки-но запущена, тоді на екран виводиться таблиця, заповнена випадковим чином. Якщо гра вже йде, то дана процедура виводить на екран ту комбінацію цифр, яка визначена користувачем під час гри.
Napravlenie
У даній процедурі користувачеві, за допомогою курсора, пропонується ввести напрям переходу. У даній процедурі прочитується код натиснутої клавіші, щоб надалі можна було здійснювати пересування.
Poisk
У цій процедурі здійснюється пошук порожнього елементу. Це необхідно для того, щоб надалі користувач зміг щодо порожнього елементу зробити свій хід. Процедура прочитує кожен елемент двовимірного масиву і порівнює його з порожнім. Після того, як порожній елемент знайдений, процедура запам'ятовує координати порожнього елементу, а саме рядок і стовпець.
Zamena
Програма залежно від вибору напряму здійснює перестановку елементів в двовимірному масиві.
У даній процедурі робиться перевірка, чи можливий певний хід, якщо так, то програма робить перестановку порожнього елементу з обраним користувачем.
Також ця процедура надає можливість користувачу скористатися бонусом: при натисканні клавіші END, розклад складається самотужки.
Game15
Ця процедура є основною. У ній підключається графічний модуль і відбувається основний процес гри.
Гра продовжуватиметься до тих пір, поки користувач не перерве гру за допомогою клавіші ESC, або не вирішить розпочати гру заново за допомогою клавіші ENTER.
Допоміжні процедури
Bonus
Маленька хитрість даної програми, яка полягає у наступному: досить натиснути клавішу End на клавіатурі і розклад майже розбереться.
У таблиці 3.3 описуються вхідні й вихідні дані, які вибудувані приблизно в тому порядку, у якім вони повинні взаємодіяти з користувачем.
Таблиця 3.3. Опис вхідних і вихідних даних
Вхідні
Вихідні
2. Введення за допомогою курсору напрямку переходу:
- Вліво;
- Вправо;
- Вгору
- Вниз;
ESC - залишити гру в будь-який момент
1 Гра - вивід на екран табло з комбінацією цифр.
3.1 Інструкція програміста
Дана програма складається з наступних файлів:
15.PAS - містить основний текст програми;
Graph.tpu - модуль, що дозволяє виконувати операції з графічними об'єктами;
EGAVGA.BGI - файл, необхідний для ініціалізації графічної системи.
Файл EGAVGA.BGI повинен знаходитися в робочому каталозі, наявність файлу EGAVGA.BGI перевіряється під час запуску програми. Без нього робота програми неможлива.
4. Тестування
Тестування програми з відповідними малюнками і коментарями наведений у додатку 1.
Додаток А
Інструкція користувача
Дана програма-головоломка призначена для розвитку логічного мислення користувача, а також для використання у якості розважальної гри.
Для запуску гри досить будь-якого комп'ютера, на якім установлена хоч яка-небудь операційна система, сімейство Windows.
Управління у програмі відбувається за допомогою клавіш курсору, а також клавіш END та ESC.
Після того, як гру розпочато, користувачеві пропонується гральне поле (Рис. А.1. Гральне поле), що складається з авторських даних, деяких вказівок щодо керування і грального поля
Рис. А.1. Гральне поле
Користувачеві необхідно за допомогою курсору переміщати клітки табло, до тих пір, поки на екрані не відобразиться, послідовна комбінація цифр. (Рис. А.2 Гральне поле)
Рис. А.2 Гральне поле
Протягом усієї гри, користувач у будь-який момент може покинути гру, для цього досить натиснути клавішу ESC і гра завершує свою роботу.
repeat {Цикл, пока не нажата клавиша ESC или пока игрок не победил играть}
Zamena; {Передвижение в массиве}
until (ord (ch)=27);
closeGraph; {Закрытие графического режима}
end;
begin
repeat {Цикл, доки не натиснута клавіша ESC}
Game15; {Виклик процедури переходу у режим гри}
until ord(ch)=27
end.
Висновок
Не дивлячись на простоту даної програми, вона таїть у собі ряд складностей, які реалізуються з використанням усіх основних приймань Турбо Паскаль. Взагалі Турбо Паскаль як середовище програмування вже давно застаріла, але основи, які лежать у середовищі програмуванні в Турбо Паскаль, лежать у більшості відомих і популярних додатків. На мій погляд, вивчаючи програмування в Турбо Паскаль, можна освоїти основні приймання програмування.
Метою даної курсової роботи, було поглиблення знань і розширення навичок по розробці алгоритмів і їх реалізації на персональному комп'ютері, розроблена мною програма, цілком відповідає поставленим цілям. Особливостями даної програми є:
- Чітко побудований алгоритм;
- Інтуїтивно зрозумілий інтерфейс;
- Зручне керування;
- Простота у використанні;
- Відсутність зайвих доповнень.
До недоліків даної програми можна віднести наступне:
Використання стандартного відеорежиму VGA, 640 на 480 пікселов і палітрою в 16 кольорів, замість вищих дозволів (800 на 600 пікселов) і палітри в 256 кольорів.
Перелік посилань
1. Кассера В. Turbo Pascal 7.0 / В. Кассера, Ф. Кассера - М.: DiaSoft, 2003. - 425 с.
2. Ілюстрований самовчитель по Турбо Паскалю [Електронний ресурс] - Режим доступу до книги:
http://256bit.ru/education/TurboPascal/;
3. Еврістичні функції [Електронний ресурс] - 2001. - Глава 4 - Режим доступу до книги:
http://rriai.org.ru/evristicheskie-funktsii.html;
4. Еврістика [Електронний ресурс] // Вікіпедія - вільна енциклопедія - 2009. - Режим доступу до статті:
http://ru.wikipedia.org/wiki/Эвристика;
5. Пятнашки [Електронний ресурс] // Вікіпедія - вільна енциклопедія - 2009. - Режим доступу до статті:
http://ru.wikipedia.org/wiki/Пятнашки
6. Використання графічного інтерфейсу [Електронний ресурс] // Керівництво по мові B. Pascal 7 & Objects/LR - 1997. - Глава 19 - Режим доступу до книги: