Ігрова програма 15

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

МІНІСТЕРСТВО ОСВІТИ РФ
АРХАНГЕЛЬСЬКИЙ ДЕРЖАВНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ







Курсова робота
Тема: «Ігрова програма <15>»





2008

Зміст.
1.Заданіе
2. Введення
3.Аналіз і математична постановка задачі
4.Разработка схеми алгоритму та її опис
4.1 Опис алгоритму роботи основної програми
4.2 Деталізація окремих ділянок програми
4.3 Графічний інтерфейс програми <15>
5.Розробка програми
5.1 Текст програми
5.2 Опис використовуваних типів, глобальних змінних, процедур і функцій.
5.3 Призначення і область застосування програми
5.4 Вхідні і вихідні дані
5.5 Використовувані технічні й програмні засоби
6.Опісаніе процесу налагодження
7.Інструкція користувача
8.Заключеніе
9.Список літератури

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

Введення
Масове виробництво персональних комп'ютерів, периферійних пристроїв і відповідного прикладного та системного програмного забезпечення забезпечило доступ до обчислювальної техніки сотням мільйонів людей і її впровадження практично у всі сфери діяльності людини.
Широке і різноманітне застосування ЕОМ пред'являє все більш високі вимоги до їх програмного забезпечення. В даний час налічуються десятки мов програмування, c допомогою яких можна спілкуватися з обчислювальною машиною.
Рішення завдання на тій чи іншій мові програмування залежить від характеру задачі, конструкції і можливостей обчислювальної машини, ресурсу часу, на її рішення, кваліфікації програміста і т.д.
Серед використовуваних в даний час мов програмування велике поширення отримав мову Паскаль.
Мова Паскаль має вже двадцятирічну історію. Перша версія мови, запропонованого його автором - професором кафедри обчислювальної техніки Швейцарського федерального інституту технології - Нікласом Віртом, з'явилася ще в 1968 р. як альтернатива існуючим і всі усложняющимся мов програмування, таким, як ПЛ / 1, АЛГОЛ і ФОРТРАН, покликана полегшити вивчення і використання мов програмування при збереженні їх інструментальних засобів.
На початку 80-х років ПАСКАЛЬ ще більше зміцнив свої позиції з появою трансляторів MS PASCAL і Turbo PASCAL для персональних ЕОМ. З цього часу мова Паскаль стає одним з найбільш важливих і широко використовуваних мов програмування.
По своїй ідеології Паскаль більш близький до сучасної методикою та технології програмування. Зокрема, ця мова дуже повно відображає ідеї структурного програмування, що чітко проявляється в основних керуючих структурах, передбачених у мові. Паскаль широко пристосований для застосування загальновизнаною в даний час технології низхідного проектування (покрокової деталізації). Це проявляється в тому, що Паскаль може успішно використовуватися для запису програми на різних рівнях її деталізації, не вдаючись до допомоги блок-схем або спеціальної мови проектування програм.
Паскаль надає вельми гнучкі можливості щодо використаних структур даних. Як відомо, простота алгоритмів, а значить трудомісткість їх розробки та їх надійність, істотно залежать від того, наскільки вдало будуть обрані структури даних, що використовуються при вирішенні поставленої задачі.

Аналіз і математична постановка задачіЦелью курсової роботи є написання ігрової програми "Квачі". Ми маємо на екрані ігрове поле розміром 4 * 4.На поле розташовано 15 фішок з цифрами і одна порожня клітинка, яка буде використовуватися для переміщення. Нумерація фішок відбувається довільним чином.
Фішка, яку користувач збирається перемістити на нове місце, повинна розташовуватися поряд з порожньою клітинкою. Якщо дана умова виконується, то гравець може перемістити фішку на нове місце, інакше гравець вибирає нову фішку. Гра продовжується до тих пір, поки гравець не розставить фішки по порядку (номери фішок повинні розташовуватися за зростанням зліва-направо, зверху-вниз), або не виявить бажання вийти з гри достроково.
У процесі гри програма повинна фіксувати число переміщень фішок зроблених гравцем. Після того, як фішки будуть розташовані по порядку, програма порівнює результат з іншими результатами і, якщо він перевершує один з рекордів, то відразу заноситься в таблицю результатів. Розглянемо, яким чином програма може бути побудована з математичною (логічного) точки зору. Для цього визначимося з тими діями, які повинна буде виконувати програма: 1. Формування одновимірного масиву містить 16 елементів 2. Заповнення масиву числами 1, 2, 3, 4, ... 15 (один елемент масиву залишається порожнім, він буде в подальшому подавати порожню клітинку) Елементи масиву задаються випадковим чином, за допомогою генератора випадкових чисел 3. Іізмененіе користувачем порядку розташування чисел у масиві 4. Підрахунок кількості переміщень елементів у масиві 5. Перевірка розташування елементів у масиві.
6. Якщо елементи розташовані по порядку, то програма фіксує перемогу, в іншому випадку здійснюється перехід до пункту № 3
Підвищену увагу слід приділити пункту № 3 {Іізмененіе користувачем порядку розташування чисел у масиві}. Програма повинна надавати користувачеві наочну та зручну можливість перестановки елементів масиву. З огляду на те, що ігрове поле містить всього одну порожню клітину, можна сформулювати простий принцип для кожної значущого елемента масиву (тут і далі домовимося, що розташування фішок ігрового поля буде повністю відповідати розташуванню елементів у масиві на кожному етапі гри). Цей принцип полягає в тому, що в разі, якщо можливість зсуву будь-якої фішки ігрового поля існує, то вона єдина. Зрушення при цьому відбувається в бік порожньої клітинки.
Ввиделім основні етапи, які повинні будуть реалізовуватися при виконанні пункту № 3:

1. Користувач вибирає одну з фішок ігрового поля
2. Користувач бажає зрушити обрану фішку
3. Відбувається аналіз можливості зрушення. Зрушення можливий тільки в тому випадку, якщо активізований елемент масиву знаходиться поряд з порожнім елементом масиву. Якщо умова не виконується, то проісходітпереход до пункту № 1
4. Здійснюється зрушення. У цьому випадку проісходітследующая операція: активізований елемент массіваоказивается на місці порожнього елемента, а той, у свою чергу, оказиваетсянаместе активізованого
5. Число кроків зроблених користувачем збільшується на одиницю
6. Після виконання перших п'яти пунктів відбувається повернення до пункту № 1
На даному етапі деталізації найскладніших, і в той же час найбільш цікавих, пунктів завдання можна перерватися і перейти до розробки алгоритму. Решта пункти не вдають із себе особливої ​​складності і тому не потребують настільки докладної деталізації.
Розробка схеми алгоритму та її опис Опис алгоритму роботи основної програми
Логічна робота програми побудована на циклі з постусловіем. У тілі циклу перебуває процедура, що забезпечує роботу користувача з меню, і оператор варіанту, який містить три основних процедури програми (в залежності від того, яке значення має вираз селектор виконується одна з процедур).
Структурограмма основної програми

Помилка при включенні

графічного режиму

Процедура, зчитування таблиці результатів з файлу

Recod
Процедура, що забезпечує роботу з меню
Menu (men)

Пункт меню 'гра' men
Пункт
меню 'табл ігрокок'

Пункт меню'об грі '
Почати гру;
процедура
game
Таблиця
результатів
кращих гравців;
процедура
best.
Інформація про гру;
процедура
help
Виконувати до тих пір, поки не обраний пункт меню {Exit}
Вихід з графічного режиму

Errcode <> grok

Так Ні

Ініціалізація графічного режиму



Цикл з постусловіем виконується до тих пір, поки користувач не вибере в меню команду {E xit}. У цьому випадку відбувається завершення роботи в графічному режимі і здійснюється перехід в текстовій режим, а потім відбувається вихід з основної програми.
Ррезультат виконання оператора варіанта залежить від того, яке значення матиме параметр - змінна (далі просто параметр) процедури, яка забезпечує роботу з меню (далі в тексті просто процедура menu). Вираз селектор оператора варіанта приймає ті ж значення, що і вихідний параметр процедури menu.Отметім те, що гілка оператора else відсутній. Таким чином, якщо значення виразу-селектор не збігається ні з однією з міток варіанти оператора case, то даний оператор вважається порожнім і пропускається.
Параметр процедури menu може приймати одне з чотирьох значень: 0, 1, 2, 3.Оператор case, у свою чергу містить три мітки: 0, 1, 2. Коли параметр приймає значення рівне 3 (що відповідає пункту меню {Exit}), то оператор case пропускається і відбувається вихід з циклу і завершення роботи програми, про що було сказано вище.
Таким чином структура основної програми досить проста і не викликає особливих складнощів у її розумінні. Далі будуть розглянуті більш детально основні блоки алгоритму програми, що дозволить розібратися в роботі всієї програми в цілому.

Деталізація окремих ділянок програми

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

У першу чергу вона забезпечує інтерфейс меню програми <15> і роботу з ним користувача. На екрані гравець спостерігає меню, що складається з 4-x пунктів. Вибір того чи іншого пункту здійснюється за допомогою стандартних клавіш (up, down), що не сумнів дуже зручно для будь-якого користувача, що працює з даною програмою. Переміщення по пунктах меню здійснюється за допомогою циклу з постусловіем. У тілі циклу розташовується кілька операторів умовного переходу. У залежності від того, яка клавіша натиснута (up або down), змінної присвоюється деяке значення. Після цього координати покажчика змінюються, і він стає на відповідний пункт (в якості покажчика виступає зафарбований прямокутник, колір якого відрізняється від кольору пунктів меню). Далі перевіряється умова виходу з циклу. Якщо натиснута клавіша Enter, то здійснюється вихід з циклу, інакше користувач вибирає інший пункт меню. Таким чином, переміщення по пунктах меню відбувається до тих пір, поки не натиснута клавіша введення.

Ym: = 0

Малювання покажчика, що переміщається по пунктах меню
в залежності від того, яке значення приймає
мінлива ym. Ym = 0 відповідає пункту меню {Game}
Читання символу з клавіатури
натиснута клавіша up
так ні
переміщення на один
пункт вгору
Ym: = Ym-1

натиснута клавіша down
так ні
переміщення на один
пункт вниз
Ym: = Ym +1
спочатку натиснута клавіша
так up, тобто Ym = -1 немає
перехід на останній
пункт меню Ym: = 3
значення Ym перевищує 3
та Ym = 4 немає

Обнуляємо Ym
Ym: = 0
виконувати до тих пір, поки не натиснута клавіша Enter


Коли користувач натискає введення, то відбувається вихід з циклу і, те значення, яке має параметр-змінна процедури menu передається в оператор варіанта.Ітак, якщо значення параметра 0, то починається гра.
Число кроків одно 0 (steps: = 0)
Заповнення масиву випадковими числами

Малювання ігрового поля і фішок ігрового поля

Натиснута клавіша пробіл

Так Ні
Нульовий елемент знаходиться
поруч
Так Ні
Перестановка елементів

Збільшення числа кроків на одиницю
Елементи розташовані
по порядку
так ні

Вихід з циклу (pl: = Esc)
Ініціалізація процедури перемога

Натиснута клавіша Esc


Та ні

Збереження сторінки в буфері

Запит на вихід
Підтвердження виходу
Так Ні

Вихід з циклу (kl: = Esc) Повернення сторінки
з буфера
виконувати до тих пір, поки pl <> Esc або kl <> Esc
Процедура перемоги ініціал-на
Так Ні
Перемога

Результат гравця один з кращих

Так Ні

Запис імені гравця у файл з кращими результатами

Користувач активізує фішку



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

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

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

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

Mas [16]: = 0

Перший елемент масиву задається до виконання циклу наступним чином:

Mas [1]: = random [14] +1

Так як процедура random в даному випадку вибирає ціле число в інтервалі від 0 до 14, то необхідно додавання до цього числа 1, що б уникнути значення 0. Заповнення інших елементів масиву здійснюється за допомогою циклу з постусловіем. У циклі відбувається завдання чергового елемента масиву за допомогою процедури random і перевірка не дорівнює чи є даний елемент попереднім елементам. Якщо виявляється, що

наступний елемент дорівнює одному з попередніх, то він задається ще раз. Дана операція здійснюється в циклі з передумовою, який виконується поки деяка логічна змінна має значення істина. Значення фальш мінлива приймає в тому випадку, якщо значення попередніх елементів масиву не збігаються з наступним.
mas [16]: = 0

mas [1]: = random [14] +1


n: = 2
ря працює до тих пір, поки не буде заповнений весь масив.

u: = true
поки u істина виконувати
j: = random [15] +1
присвоїти u значення false
i від 1 до n-1 робити
mas [i] = j
так ні
присвоїти u
значення
істина
mas [n]: = j
n: = n +1
виконувати до тих пір, поки n не буде дорівнює 16


Цикл з параметром використовується для того, щоб перебрати всі елементи масиву до n-1 і перевірити, чи немає серед них елемента, значення якого збігається зі значенням n-го елемента. Якщо такого не виявляється, то n-ому елементу присвоюється поточне значення.
Після того, як масив виявляється заповненим можна приступати до малювання фішок ігрового поля та їх нумерації відповідними числами з масиву.
В якості фішки ігрового поля використовується паралелепіпед, координати якого змінюються за допомогою двох циклів з параметром. Таким чином, вимальовуються всі 16 фішок.
Після того як 'оформлено' ігрове поле, випадковим чином сформований масив чисел, слід етап, на якому відбувається обробка результату натиснення користувачем клавіші. Гравець активізує одну з фішок за допомогою клавіш UP, DOWN, LEFT,
RIGHT. Коди відповідних клавіш обробляються, і в залежності від того яка клавіша натиснута, відбувається зміна координат курсору пересувається по фішках ігрового поля. Первоночально координати курсору підібрані так, що б він знаходився у правому нижньому куті.
Як тільки користувач спробує 'зрушити' активізовану фішку на порожню клітинку (за допомогою клавіші пробілу), то тут відбувається обробка ситуації на можливість зсуву. Якщо фішка, яку вибрав користувач, розташована поруч з порожньою клітинкою, то відбувається обмін. Елементи масиву міняються місцями.
Якщо обмін відбувся, то число кроків збільшується на одиницю і проводиться друк на екрані нового числа (дана процедура була описана на початковій стадії алгоритмізації).
Змінивши положення чисел в масиві, слід перевірити не розташувалися вони по порядку. Якщо елементи дійсно розташовані за зростанням, то відбувається ініціалізація процедури перемоги. Результат гравця порівнюється з кращими результатами. У тому випадку, якщо він перевищує хоча б один з рекордів, виробляється запит імені гравця. Після того, як гравець введе своє ім'я, відбувається оновлення файлу, що містить кращі результати.
Якщо елементи розташовані не по порядку, то гравець продовжує перестановку.Пользователь може вийти з гри, натиснувши клавішу Esc. Для зручності передбачений вихід із програми за допомогою меню. Для цього доводиться зберігати відео сторінку в буфері. Якщо користувач підтверджує бажання вийти, буфер очищується і потім гравець потрапляє в головне меню. В іншому випадку відео сторінка витягується з буфера, а потім відбувається його очищення. Тим самим користувач застрахований від випадкового натискання клавіші Esc.
Висновок таблиці рекордів
Перш за все, здійснюється зчитування результатів з файлу.
Після цього відбувається процедура очищення екрана. Потім відбувається створення фону, на якому будуть виводитися дані з файлу. Роздруківка здійснюється без виходу з графічного режиму, завдяки чому таблиця виходить барвистою і приємною для сприйняття. У текстовому режимі створити такий ефект неможливо. Ім'я гравця і його результат розділяються крапками. Ім'я гравця, що має кращий результат, виділяється іншим кольором.
У принципі це основні дії, які необхідно виконати для того, щоб споживач міг ознайомитися з кращими результатами. В іншому все залежить від смаків програміста і частіше за все полягає в безпосередній запису виконуваних дій за допомогою операторів і стандартних процедур вибраної мови програмування.
Відкриття файлу
Читання даних з файлу
Очищення екрану
Створення графічного інтерфейсу (фону на якому буде друкуватися таблиця результатів)
Друк таблиці
До тих пір, поки не натиснута клавіша таблиця на екрані


Висновок допомоги
Висновок допомоги в грі, так само як і таблиці рекордів, здійснюється за допомогою зчитування з файлу. Мабуть, єдине і головна відмінність полягає в тому, що тут всі дії проводяться в текстовому режимі.
Перед тим, як здійснювати друк даних з файлу, відбувається вихід з графічного режиму і очищення екрана. Потім
дані роздруковуються блоками по 24 рядки. Кожен раз перевіряється умова, чи закінчений файл і не натиснув чи гравець Esc.После кожного блоку користувач повинен підтвердити продовження виведення допомоги, натиснувши клавішу Enter, або перервати висновок, натиснувши клавішу Esc. І в першому і в другому випадку гравець потрапляє в меню програми <15>.

Відкриття текстового файлу
Вихід з графічного режиму
Очищення екрану
Ще не кінець файла і не натиснута клавіша Esc виконувати
I: = 1
Поки кількість рядків <25 і не кінець файлу виконувати
i: = i +1
читання з файлу даних порядково
друк рядків даних
поки не натиснута клавіша Enter або Esc
ініціалізація графічного режиму





Графічний інтерфейс програми <15>

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

Розробка програми
Програма складається з двох файлів. Перший файл petnash.pas-це файл, що містить основну програму. Другий файл petnash1.pas-це модуль, в якому знаходяться процедури використовуються, основною програмою.
Текст основної програми
program petnash;
uses
crt, graph,
petnash1; {Модуль, який містить основні підпрограми}
Var
grDriver, grMode, ErrCode, men: integer;
Begin (* petnash *)
{Ініціалізація графічного режиму}
grDriver: = Detect;
InitGraph (grDriver, grMode ,'');
ErrCode: = GraphResult;
if ErrCode <> grOk
then
begin
Writeln ('Graphics error:', GraphErrorMsg (ErrCode));
Writeln ('Press - <ENTER>');
Readln;
Halt;
end;
{Установка поточних параметрів кольору і лінії}
setcolor (6);
setlinestyle (0,0,1);
recod; {Зчитування даних з файлу з кращими результатами}
repeat
menu (men); {Процедура, що забезпечує роботу з меню}
case men of
0: game; {ГРА}
1: best; {КРАЩІ ГРАВЦІ}
2: help; {ПРО ГРІ}
end; (* case *)
until men = 3; {ВИХІД ІЗ ІГРИ}
closegraph {Вихід з графічного режиму в текстовій}
END. (* Petnash *)
Текст модуля
Unit petnash1;
(**************) Interface (*****************)
uses
crt, graph;
const
{Коди клавіш, які використовуються у програмі}
Up = # 72;
Down = # 80;
Left = # 75;
Right = # 77;
Space = # 32;
Esc = # 27;
Enter = # 13;
type
strok = string [10];
var
stroka: array [1 .. 12] of strok;
f02, f03: text;
st02: string [10];
stl2: string [20];
a, b2, pl, kl, o: char;
st, st1: string [5];
step: string [5];
u, vict: boolean;
mas: array [1 .. 16] of integer;
a02, b3, c02, b, b1, d, e, e02, i, i1, j, n, r, steps, x,
x1, y, y1, yme: integer;
grDriver, grMode: integer;
m, m1, m2, m3: integer;
p, p1, p2, p3: pointer;
procedure recod;
procedure buk (a, b, c: integer; s: char);
procedure victory;
procedure nomer (xp, yp, ip: integer);
procedure kv (xk, yk: integer);
procedure tabl (xv, yv: integer; klv: char; var xv1, yv1: integer);
procedure menu (var ym: integer);
procedure game;
procedure best;
procedure help;
(*************) Implementation (****************)
(* Процедура зчитування таблиці рекордів *)
(* З файлу 'rezult.dat' *)
procedure recod;
begin (* recod *)
assign (f02, 'rezult.dat');
reset (f02); {Відкриття файлу з результатами}
for i: = 1 to 10 do {Читання з файлу}
readln (f02, stroka [i]);
end; (* recod *)
(* Процедура руху заданої літери по екрану *)
procedure buk (a, b, c: integer; s: char);
begin (* buk *)
for I: = a downto b do
begin
{Буква малюється темним кольором}
setcolor (1);
settextstyle (1,0,10); {Параметри тексту}
outtextxy (c, i, s);
{Буква малюється таким же кольором,
що і фон екрану}
setcolor (14);
settextstyle (1,0,10);
outtextxy (c, i, s);
end;
{Малювання літери по її кінцевим координатами}
setcolor (1);
settextstyle (1,0,10);
outtextxy (c, b, s);
end; (* buk *)
(* Процедура перемоги *)
procedure victory;
begin (* victory *)
{Створення на жовтому тлі напису Victoty}
setbkcolor (14);
buk (480,220,100, 'V');
buk (480,220,170, 'i');
buk (480,220,205, 'c');
buk (480,220,255, 't');
buk (480,220,300, 'o');
buk (480,220,359, 'r');
buk (480,220,410, 'y');
{Очерчівніе написи 2 лініями}
setcolor (4);
setlinestyle (0,0,3);
for i: = 115 to 405 do
begin
delay (3);
line (i, 355, i +20,355);
line (i, 240, i, 240);
end;
for i: = 455 to 470 do
begin
delay (3);
line (i, 355, i +5,355)
end
end; (* victory *)
(* Процедура малювання номери п'ятнашки *)
procedure nomer (xp, yp, ip: integer);
begin (* nomer *)
{Перетворення числа mas [ip] в
остан-ть символів}
str (mas [ip]: 1, st);
{Висновок остан-ти символів st}
outtextxy (175 + xp * 86,120 + yp * 86, st);
end; (* nomer *)
(* Процедура малювання парал-так *)
procedure kv (xk, yk: integer);
begin (* kv *)
bar3d (160 + xk * 86,100 + yk * 86,235 + xk * 86,
175 + yk * 86,7, true);
end; (* kv *)
(* Процедура зміни активної таблички *)
procedure tabl (xv, yv: integer; klv: char; var
xv1, yv1: integer);
begin (* tabl *)
{Фішка (табличка), яка була активізована
малюється таким же кольором, що й інші
фішки}
setcolor (13);
kv (xv, yv);
{Напис номери фішки}
if mas [4 * yv + xv +1] <> 0 then
nomer (xv, yv, 4 * yv + xv +1);
{Натискання користувачем однієї з клафіш case
управління}
klv of
Down: if yv <3 then yv: = yv +1;
Up: if yv> 0 then yv: = yv-1;
Left: if xv> 0 then xv: = xv-1;
Right: if xv <3 then xv: = xv +1;
end; (* case *)
xv1: = xv;
yv1: = yv;
{Фішка, яка стає активізованою,
малюється темним кольором}
setcolor (1);
kv (x, y);
{Напис номери активізованою фішки}
if mas [4 * yv + xv +1] <> 0
then nomer (x, y, 4 * y + x +1);
end; (* tabl *)
(* Процедура меню *)
procedure menu (var ym: integer);
var
om: char;
begin (* menu *)
ym: = 0;
cleardevice; {Очищення графічного екрана}
{Малювання тіні пунктів меню, прямокутники
сірого кольору}
setcolor (8);
setfillstyle (1,8);
bar (45,152,615,202);
bar (45,222,615,272);
bar (45,292,615,342);
bar (45,362,615,412);
fillellipse (304,62,210,35);
{Малювання пунктів меню, прямокутники синього
кольору}
setcolor (1);
setfillstyle (1,1);
bar (35,145,605,195);
bar (35,215,605,265);
bar (35,285,605,335);
bar (35,355,605,405);
{Малювання еліпса під написом *** MENU ***}
fillellipse (298,57,210,35);
{Написи на екрані про автора прграмми}
setcolor (12);
settextstyle (1,0,1);
outtextxy (20,430, 'Copyright Software 1998');
outtextxy (20,450, 'Written by Volkov
Konstantin ');
{Напис *** MENU *** друкується сірим кольором,
тим самим створюється ефект тіні}
setcolor (8);
settextstyle (1,0,6);
outtextxy (142,33 ,'*** MENU ***');
{Друк написи *** MENU *** синім кольором}
setcolor (10);
outtextxy (140,30 ,'*** MENU ***');
setbkcolor (9); {Колір тла екрану}
repeat
setfillstyle (1,5); {Орнамент та колір
заповнення смужки-покажчика}
{Смужка, яка пересувається по пунктах меню}
bar (35,145 +70 * ym, 605,195 +70 * ym);
{Друк пунктів меню}
outtextxy (50,135, 'Game');
outtextxy (50,205, 'Best players');
outtextxy (50,275, 'About this game');
outtextxy (50,345, 'Exit');
om: = readkey;
{При переході покажчика на інший пункт,
возврашеніе пункту меню колишнього кольору}
setfillstyle (1,1);
bar (35,145 +70 * ym, 605,195 +70 * ym);
{Зміна координат покажчика, в
залежно від натискання користувачем
однойіз клавіш управління}
if om = up then ym: = ym-1;
if om = down then ym: = ym +1;
if ym =- 1 then ym: = 3;
if ym = 4 then ym: = 0;
setcolor (10); {Колір пунктів меню}
{Створення звукового ефекту при переміщенні
по пунктах меню}
sound (300);
for i: =- maxint to maxint do
j: = j;
nosound;
until om = Enter;
end; (* menu *)
(* Процедура початку гри *)
procedure game;
begin (* game *)
cleardevice; {Очищення екрану}
steps: = 0; {Число кроків 0}
{Малювання області, на тлі якої буде
виводиться кількість кроків}
setfillstyle (1,3);
bar (10,90,130,155);
setfillstyle (1,7);
bar (30,120,80,145);
{Обведення області темними лініями}
setlinestyle (0,0,1);
setcolor (1);
rectangle (10,90,130,155);
rectangle (29,119,81,146);
setlinestyle (0,0,1);
{Друк написи і кол-ва кроків,
поки число кроків просто 0}
setcolor (4);
settextstyle (0,0,1);
outtextxy (20,100, 'Number steps');
outtextxy (40,130, "0");
setcolor (13);
vict: = false; {Перемога не ініціалізований}
setfillstyle (1,14); {Параметри заповнення
кубика}
bar3d (152,86,509,445,10, true); {Малювання
коробки}
{Створення у верхній частині екрана смужки і
написи на ній}
bar (0,0,639,50);
settextstyle (7,0,5);
outtextxy (125,2 '* 15 *');
{Створення в нижній частині екрана смужки і
написи на ній}
bar (0,450,639,480);
settextstyle (7,0,3);
outtextxy (80,450, 'Press Esc for quit to
main menu ');
{Завдання колишніх параметрів}
settextstyle (7,0,5);
setfillstyle (1,11);
{Включення генератора випадкових чисел}
randomize;
{Заповнення масиву випадковими числами
від 1 до 15}
mas [16]: = 0;
mas [1]: = random (14) +1;
n: = 2;
repeat
u: = true;
while u do
begin {Розкладання пятнашек}
j: = random (15) +1;
u: = false;
for i: = 1 to n-1 do
{Перевірка елементів масиву на
рівність один одному}
if mas [i] = j then u: = true;
end; {Розкладання пятнашек}
mas [n]: = j;
n: = n +1;
until n = 16; {Умова виходу заповнення всього
масиву}
{Малювання фішок ігрового поля (табличок)}
for j: = 0 to 3 do
for i: = 0 to 3 do
kv (i, j);
{Малювання фону на якому розташована
коробка}
setbkcolor (7);
{Разкраска коробки}
setfillstyle (1,8);
floodfill (157,90,13);
setfillstyle (1,3);
floodfill (168,82,13);
floodfill (513,90,13);
setfillstyle (1,11);
{Нумерація табличок}
n: = 1;
for j: = 0 to 3 do
for i: = 0 to 3 do
if (i <> 3) or (j <> 3) then
begin
nomer (i, j, n);
n: = n +1;
end;
x1: = 3;
y1: = 3;
x: = 3;
y: = 3;
{Малювання таблички в нижньому правому
куті, поки не зроблено жодного ходу}
setcolor (1);
setfillstyle (1,11);
bar3d (418,358,493,433,7, true);
repeat
kl: = readkey;
tabl (x, y, kl, x, y); {Змінити активної
таблички}
{Перевірка умови натискання клавіші пробіл}
if kl = Space then
begin (* if1 *)
u: = (abs (x1-x) = 1) and (abs (y1-y) = 0) or
(Abs (x-x1) = 0) and (abs (y1-y) = 1);
{Умова перестановки елементів
масиву}
if u then
begin (* if2 *)
{Елементи масиву, які змінюються
місцями}
i: = 4 * y + x +1;
i1: = 4 * y1 + x1 +1;
setcolor (11);
nomer (x, y, i);
setcolor (13);
nomer (x1, y1, i);
n: = mas [i1]; {Перестановка елементів
масиву}
mas [i1]: = mas [i];
mas [i]: = n;
x1: = x;
y1: = y;
steps: = steps +1; {Збільшення числа
кроків на одиницю}
{Виведення на екран числа кроків}
setfillstyle (1,7);
bar (30,120,80,145); {Малювання табл.}
setcolor (4);
str (steps, st1);
settextstyle (0,0,1);
outtextxy (40,130, st1);
setcolor (13);
settextstyle (7,0,5);
setfillstyle (1,11);
{Перевірка проходження чисел в масиві}
u: = true;
j: = 0;
n: = 0;
repeat
j: = j +1;
n: = n +1;
if (n <> mas [j]) and (n <> 12)
then u: = false;
if (n = 11) and (mas [12] = 0)
then j: = j +1;
until mas [j] = 15;
if u and ((mas [15] = 15) or
(Mas [16] = 15))
then
begin (* if3 *)
pl: = Esc; {Вихід з циклу}
vict: = true; {Ініціалізація перемоги}
end; (* if3 *)
end; (* if2 *)
end; (* if1 *)

{Гравець натиснув клавішу Esc}
if kl = Esc
then
begin (* if *)
{Приміщення сторінки в буфер
за допомогою розбиття
її на 4 частини}
m: = imagesize (0,0,320,240);
getmem (p, m);
getimage (0,0,320,240, p ^);
m1: = imagesize (320,0,639,240);
getmem (p1, m1);
getimage (320,0,639,240, p1 ^);
m2: = imagesize (0,240,320,480);
getmem (p2, m2);
getimage (0,240,320,480, p2 ^);
m3: = imagesize (320,240,639,480);
getmem (p3, m3);
getimage (320,240,639,480, p3 ^);
{Висновок меню, після того, як гравець
натиснув Esc}
cleardevice;
setbkcolor (0);
b3: = 0;
repeat
{Малювання подвійний рамочки}
setcolor (1);
setlinestyle (0,0,1);
rectangle (243,183,417,257);
rectangle (248,188,412,252);
setfillstyle (1,14); {Орнамент та
колір заповнення покажчика}

{Покажчик-вибір пункту}
bar (250,190 +30 * b3, 410,220 +30 * b3);
setcolor (13);
settextstyle (8,0,1);
outtextxy (275,195, 'Continue..
. ');
outtextxy (275,220, 'Exit');
b2: = readkey;
setfillstyle (1,0);
bar (250,190 +30 * b3, 410,220 +30 * b3);
{Рух по пунктам меню}
if b2 = up then b3: = 0;
if b2 = down then b3: = 1;
if b3 = 0
then kl: = 'z' {Обрано пункт
Continue}
else kl: = Esc {Обрано пункт Exit}
until b2 = Enter;
end; (* if *)
{Якщо вибрано пункт Continue, то
сторінка повертається з буфера, а
потім буфер очищується}
if kl = 'z'
then
begin
cleardevice;
setbkcolor (7);
putimage (0,0, p ^, normalput);
freemem (p, m);
putimage (320,0, p1 ^, normalput);
freemem (p1, m1);
putimage (0,240, p2 ^, normalput);
freemem (p2, m2);
putimage (320,240, p3 ^, normalput);
freemem (p3, m3);
settextstyle (7,0,5);
setfillstyle (1,11)
end
until (kl = Esc) or (pl = Esc);
{Демонстрація перемоги після завершення гри}
if vict then
begin (* vict *)
cleardevice; {Очищення екрану}
victory; {Процедура перемоги}
{Виведення на екран числа кроків, зроблених
користувачем, і привітання}
setcolor (4);
settextstyle (7,0,5);
outtextxy (100,50, 'You are win!');
str (steps, step);
outtextxy (100,100, 'You made');
outtextxy (150,150, step);
outtextxy (250,150, 'steps.');
repeat
until keydivssed;
kl: = readkey;
i: = 0;
{Порівняння результатів}
repeat
i: = i +1;
val (stroka [i * 2], b, x);
until (b> steps) or (i = 6);
{Якщо результат гравця перевершує один з
результатів у таблиці, він заноситься в
таблицю}
if i <6 then
begin (* Переформування таблиці
рекордів *)
for j: = 5 downto i do
begin (* Зрушення рекордів *)
stroka [j * 2 +1]: = stroka [j * 2-1];
stroka [j * 2 +2]: = stroka [j * 2];
end; (* Зрушення рекордів *)
{Преглашеніе гравця до введення імені}
cleardevice;
setbkcolor (0);
outtextxy (10,130, 'Please, enter your
name: ');
{Створення рамочки}
setcolor (10);
rectangle (100,225,525,290);
rectangle (98,223,527,292);
{Введення імені гравця}
kl: = readkey;
j: = 1;
stroka [i * 2-1 ]:='';
u: = not (kl = enter);
while u do
begin (* Читання імені гравця *)
u: = (kl> '') and (kl <'z') and (j <11);
if u
then
begin (* НЦ *)
stroka [i * 2-1]: = stroka [i * 2-1] + kl;
outtextxy (80 + j * 40,230, kl); {Друк
букви на новій позиції}
j: = j +1;
end; (* КЦ *)
kl: = readkey;
u: = not (kl = Enter);
end; (* Читання імені гравця *)
{Якщо гравець не ввів ім'я, то його ім'я
Noname}
if length (stroka [i * 2-1]) = 0
then stroka [i * 2-1]: = 'Noname';
stroka [i * 2]: = step;
(* Запис рекорду в файл *)
rewrite (f02);
for i: = 1 to 10 do
writeln (f02, stroka [i]);
close (f02);
end; (* Переф. табл. рекорд .*)
end; (* vict *)
end; (* game *)
(* Процедура виведення таблиці рекордів *)
procedure best;
begin (* best *)
cleardevice; {Очищення екрану}
{Малювання подвійний рамочки}
setlinestyle (0,0,3);
setcolor (13);
rectangle (13,138,621,434);
rectangle (9,132,625,440);
setlinestyle (0,0,1);
{Завдання параметрів заповнення рамочки}
setfillstyle (1,14);
floodfill (24,140,13);
{Напис кращі гравці}
setcolor (10);
settextstyle (7,0,7);
outtextxy (30,45, 'Best players are:');
{Друк таблиці результатів}
setcolor (13);
settextstyle (0,0,100);
for a02: = 1 to 5 do
begin (* for a02 *)
str (a02, stl2); {Перетворення числа в
остан-ть}
c02: = length (stroka [a02 * 2-1]);
stl2: = stl2 + '' + stroka [a02 * 2-1];
for e02: = 1 to 11-c02 do {Поділ імені
гравця і результату точками}
stl2: = stl2 +'.';
for e02: = 1 to 5-length (stroka [a02 * 2]) do
stl2: = stl2 +'.';
stl2: = stl2 + stroka [a02 * 2];
outtextxy (40,100 +50 * a02, stl2);
if a02 <> 0 then setcolor (9); {Виділення
кращого гравця іншим кольором}
end; (* for a02 *)
repeat
until keydivssed;
kl: = readkey;
setcolor (13);
end; (* best *)
(* Процедура виведення допомоги *)
procedure help;
var
st3: string;
begin (* help *)
assign (f03, 'pravila.dat');
reset (f03); {Відкриття файлу pravila.dat}
closegraph; {Вихід з графічного режиму}
clrscr; {Очищення екрану}
kl: = 'n';
while not (eof (f03)) {Чи не кінець файлу} and
(Kl <> Esc) {Чи не натиснута кл. Esc} do
begin {нц1}
i: = 1;
while (i <25) {Сторінка} and not (eof (f03)) do
begin {нц2}
i: = i +1;
readln (f03, st3); {Читання з файлу
елементів рядка st3}
writeln ('', st3); {Друк
вмісту рядка st3}
{Умова необхідне для того,
щоб в кінці не натискати Enter 2 рази}
if eof (f03)
then kl: = enter
else kl: = # 10
end; {кц2}
gotoxy (12,25);
repeat {Очікування натискання клавіші Enter
або Esc}
if keydivssed then kl: = readkey;
until (kl = enter) or (kl = esc);
end; {кц1}
clrscr;
gotoxy (21,12);
writeln ('Натисніть будь-яку клавішу для виходу в
меню ');
repeat
until keydivssed;
kl: = readkey;
kl: = 'n';
{Ініціалізація графічного режиму і установка
колишніх параметрів}
InitGraph (grDriver, grMode ,'');
setbkcolor (11);
setcolor (13);
setlinestyle (0,0,3);
end; (* help *)
END.
Описи використовуваних типів, глобальнихпеременних, процедур і функцій.
У програмі <15> були використані наступні типи:
type
strok = string [10];

Даний тип використовується у файлі, який зберігає результати кращих гравців.
У програмі <15> були використані наступні глобальні змінні:

Stroka: array [1 .. 12] of strok;
Масив, елементами якого є рядки довжиною в десять символів, використовується у файлі, який зберігає результати кращих гравців.

f02, f03: text;
Текстові змінні (файлів rezult.dat, pravila.dat)

st02: string [10];
Рядок довжиною в 10 символів, використовується для роботи з таблицею
stl2: string [20];
Рядок довжиною в 20 символів, використовується для роботи з таблицею
a, b2, pl, kl, o: char;
Змінні, яким присвоюються значення різних клавіш

st: string [5];
Номер фішки
st1, step: string [5];
Число ходів, перетворених в послідовність символів

u: boolean;
Логічна змінна, приймаюча значення true або false, використовується при читанні імені гравця
vict: boolean;
Ініціалізує процедуру перемоги, у разі якщо vict = true
mas: array [1 .. 16] of integer;
Масив номерів фішок, елемент масиву приймає випадкове значення від 1 до 16
p, p1, p2, p3: pointer;
Змінна типу-покажчик, в яку поміщається адресу виділеної області
m, m1, m2, m3: integer;
Розмір створюваної змінної в байтах
Далі йде опис змінних типу integer:
grDriver-тип графічного драйвера
ErrCode-значення ф-ії graphresult
i, j, n-параметри циклів
i1-номер порожній позиції
grMode-режим роботи граф. адаптера
steps-поточне кількість кроків
x, x1, y, y1-відносні координати
st02-ім'я або кол-ть очок гравця
a02-параметр циклу
c02-довжина імені гравця
e02-параметр циклу
b-к-ть очок у табл. рекордів
men-положення курсору в меню

Процедури

procedure recod;
Дана процедура здійснює зчитування даних з файлу, що містить імена і результати найкращих гравців
procedure zz1 (a, b, c: integer; s: char);
Використовується для переміщення заданої літери по екрану

procedure victory;
Створює ефект осипання букв на екран. У результаті виходить напис Victory.

procedure nomer (xp, yp, ip: integer);
Перетворює номер п'ятнашки в послідовність символів, з наступним друком на відповідній фішці

procedure kv (xk, yk: integer);
Малювання паралелепіпеда
Procedure tabl (xv, yv: integer; klv: char; var xv1, yv1: integer);
Процедура зміни активної таблічікі. У залежності від того, яка клавіша натиснута UP, DOWN, LEFT, RIGHT відповідним чином змінюються координати таблички, і та фішка, яка була активізована, малюється таким же кольором, як і всі інші, а нова активізована фішка промальовується іншим кольором.
procedure menu (var ym: integer);
Забезпечує роботу користувача з меню і створення інтерфейсної частини меню програми <15> (більш докладно ця процедура описується в розділі алгоритмізації)
procedure game;
Процедура початку гри, здійснює підготовку до гри всіх необхідних параметрів і забезпечує сам процес гри
procedure best;-процедура виведення в графічному режимі таблиці з кращими результатами
procedure help;-процедура виведення допомоги в грі
Останні три процедури докладно описуються в розділі алгоритмізації.
Призначення і область застосування програми.
Мета створення даної програми - розвага, що грають, вдосконалення їх розумового та логічного мислення. Програма може застосовуватися в якості ігрової на різних типах персональних комп'ютерів і поширюється як freeware, при дотриманні умови as is.
Вхідні і вихідні дані.

Вхідні дані - коди натиснутих в режимі реального часу клавіш, а саме клавіші управління курсором UP, DOWN, LEFT, PIGHT, а так само ESC та ENTER.
Вихідні дані - графічна інформація на дисплеї, файли даних, що містять список рекордів і допомогу гравцеві.
Використовувані технічні й програмні засоби
Програма була написана і відкомпілювалися наPent 733/256/64mGF/40Gb під управлінням операційної системи WinXp.
Технічна документація до ігровій програмі <15> була підготовлена ​​за допомогою Microsoft Word 2002 в операційному середовищі WINDOWS XP.
Текст програми написаний в середовищі програмування Borland Pascal 7.0

Опис процесу налагодження

Після кількох первинних спроб компіляції програми були отримані повідомлення про синтаксичних помилках. Після виявлення причин появи помилок вони були усунуті, після чого програма компілювалися без помилок.
Під час роботи програми так само виявлені деякі недоліки, які були усунені після доопрацювання програми.
Інструкція користувача
Програма запускається під управлінням операційної системи MS-DOS з каталогу, в якому містяться такі файли:
petnash.exe - виконуваний файл
rezult.dat - файл даних, що містить список рекордів.
pravila.dat-файл, що містить інформацію про гру
tscr.chr, trip.chr, lcom.chr-файли даних, що містять шрифти
Для роботи програми потрібно від 50 кілобайт вільної оперативної пам'яті, відеоадаптер і процесор.
Для того, що б запустити гру завантажте файл рetnach.exe, який знаходиться в основному каталозі.
Після невеликої заставки ви потрапите до основного меню, що містить такі пункти:
1 Game
2 Best players
3 About this game
4 Exit
При виборі пункту:
Game - ви потрапляєте відповідно в гру
Best players - вам надається список кращих гравців
About this game - ви отримуєте повну інформацію про гру "15", тобто ту інформацію, яку ви вивчаєте в даний момент
Exit - вихід в DOS
ПРАВИЛА
Для початку гри, виберіть у головному меню пункт Game та натисніть Enter. На екрані Вашого комп'ютера з'явиться коробочка з табличками пронумерованими від 1 до 15 і одна порожня фішка.
Наприклад:
4 6 1 7
5 2 11 14
3 15 13 12
8 10 9



Ваше завдання, пересуваючи п'ятнашки по дну коробочки, розташувати їх у порядку зростання як це представлено на наступних малюнках:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15

1 2 3 4
5 6 7 8
9 жовтня 1911
12 13 14 15


Найкращим результатом вважається виконання завдання за найменше число ходів. Ходом вважається пересування однієї п'ятнашки на одну позицію. Якщо ви зібрали 'п'ятнашки "за найменше число ходів у порівнянні з результатами предшествуюшіх гравців, то ваш результат заноситься до списку кращих гравців.
Для вибору п'ятнашки використовуйте наступні клавіші на
вашій клавіатурі:
UP
LEFTRIGHT
DOWN
Для того, що б пересунути пятнашку на вільне місце
використовуйте клавішу пробіл.

Висновок

При розробці курсової роботи мною були вивчені багато аспектів програмування мовою Borland Pascal 7.0, такі як робота з динамічними даними, файлами, виведення інформації в графічних режимах, визначення процедур і функцій, використання параметрів командного рядка, організація модульної структури програми.
При оформленні курсової роботи був отримані навички оформлення програмної документації, а також великий практичний досвід роботи в Microsoft Word 2002 і Borland Pascal 7.0.

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

1. Конструювання програм, Методичні вказівки № 2133 до курсової роботи, Рязань, РГРТА, 1993.
2. А.М. Епанешников, В.А. Епанешников, Програмування в середовищі Turbo Pascal 7.0, М, Діалог-Міфи, 1998
3. Новачків В. С., Парфілова Н. І., Пилькін А. М., Паскаль,
М, Вища школа, 1994
4. Пітер Нортон, Персональний комп'ютер зсередини, М, Біном, 1995
5. http://pascal.dax.ru/ - Все про Turbo Pascal
6. http://borlpasc.narod.ru/ - Інформація про Turbo Pascal
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Курсова
91.8кб. | скачати


Схожі роботи:
Ігрова програма
Програма Txtprintcom - резидентна програма для швидкого і зручного друкування виборчого тексту
ОС Windows XP програма Провідник програма Total Commander
Ігрова залежність
Ігрова психотерапія з дітьми
Ігрова і віртуальна графіка
Ігрова залежність неповнолітніх
Ігрова діяльність у тварин і людей
Ігрова проза Віктора Пелевіна
© Усі права захищені
написати до нас