Міністерство освіти і науки України
Національний університет "Львівська політехніка"
Кафедра "Інформаційні системи та мережі "
К У Р С О В А Р О Б О Т А
з дисципліни " Проблемно-орієнтовані мови програмування "
на тему: “ Комп’ютерна ігрова програма « Судоку » ”
З А В Д А Н Н Я
на курсову роботу з дисципліни
" Проблемно-орієнтовані мови програмування "
студенту групи КН-119
Т е м а: “ Комп’ютерна ігрова програма « Судоку » ”
Завдання:
Реалізувати логічну гру Судоку у графічному режимі.
Вимоги до програми:
1) програма повинна бути реалізована на мові C/C++;
2) програма повинна працювати у вікні MS-DOS під керуванням операційної системи Windows;
3) програма повинна мати інтерфейс у вигляді вікон та меню для вибору режимів її роботи;
4) введення-виведення даних виконати у зручній формі у вигляді таблиць;
5) забезпечити можливість редагування вхідних даних у межах визначених полів введення даних;
6) передбачити введення-виведення даних з клавіатури та файлів;
7) керування режимами роботи програми виконати за допомогою клавіатури та миші;
ЗМIСТ ЗАВДАННЯ ТА КАЛЕНДАРНИЙ ПЛАН ЙОГО ВИКОНАННЯ
1.
Провести вивчення лiтературних джерел по заданій темi.
30.04
2.
Розробити алгоритм розв’язування задачі
30.04
3.
Написати програму на мові Turbo С
30.04
4.
Пiдготувати вхiднi данi для контрольного прикладу, реалiзувати та вiдлагодити програму
30.04
5.
Оформити записку до розрахункової роботи згiдно вимог Мiжнародних стандартiв, дотримуючись такого змiсту:
30.04
вступ;
формулювання задачі
алгоритм розв’язування задачі;
опис програми
інструкція користувачеві;
контрольний приклад та аналіз результатів
висновки
література
додатки
ЗАВДАННЯ ПРИЙНЯТО ДО ВИКОНАННЯ: ____________05.06.2007
пiдпис студента
Керівник роботи: ______________Кравець П.О.
Зміст
Зміст 3
Вступ 4
1. Формулювання задачі 5
2. Методи та засоби розв’язування задачі 6
2.1 Операції та вирази мови Сі 6
Арифметичні оператори 6
Логічні оператори та оператори порівняння 7
Побітові оператори 7
2.2. Робота з масивами даних 8
Одновимірні масиви 8
Багатовимірні масиви 8
2.3 Засоби мови Сі для роботи з рядками 9
Опис деяких функцій, для роботи зі стрічками 9
Масиви стрічок 10
2.4. Програмні засоби 10
2.5. Технічні засоби 10
3. Алгоритм розв’язування задачі 11
3.1. Текстовий опис алгоритму 11
3.2. Графічний опис алгоритму 11
4. Опис програми 17
5. Інструкція користувачеві 19
6. Технологія програмування виконання та від лагодження програми 20
7. Контрольний приклад та аналіз результатів програми 21
8. Висновки 21
9. Список використаної літератури 23
Вступ
Метою розрахункової роботи є закріплення теоретичних знань та практичних навичок програмування, набутих при вивченні дисципліни «Проблемно – орієнтовані мови програмування». Я повинен навчитись самостійно працювати з літературою, розробляти алгоритми та програми на мові програмування Borland C .
Внаслідок виконання розрахункової роботи я отримаю необхідні знання по роботі з операціями та виразами, навчусь програмувати розгалужені та циклічні процеси, навчусь використовувати вказівники та індекси для роботи з масивами даних, також навчусь використовувати динамічну пам'ять, та вивчу основи роботи з рядками у мові Borland С.
1. Формулювання задачі
Задача курсової роботи полягає у реалізації логічної гри Судоку.
Гра Судоку розрахована на одного гравця. Мета гри полягає у повному заповненні ігрового поля цифрами від 1 до 9. Розмір ігрового поля – 27 х 27 клітинок. Ігрове поле поділене на 9 груп, розміром 3 х 3 клітинки кожна. Жодна із цифр не може двічі зустрічатися в одному рядку, стовпці чи групі. Перед початком гри ігрове поле випадковим чином заповнюється декількома цифрами, згідно правил гри.
2. Методи та засоби розв’язування задачі
2.1 Операції та вирази мови Сі
Мова Сі містить велике число вбудованих операторів. Оператор - це символ, який указує компілятору, яку математичну або логічну дію необхідно виконати.
У мові Сі є такі основні класи операторів:
1) арифметичні оператори;
2) оператори порівняння і логічні;
3) побітові оператори.
Арифметичні оператори
Оператор
Опис
-
віднімання і знак мінус
+
додавання
*
множення
/
ділення
%
остача від ділення націло
--
декремент
++
інкремент
З них оператори «+», «-» «*» і «/» працюють так само, як і в інших мовах програмування. Ці оператори можна використовувати майже зі всіма допустимими в Сі типами даних.
Так, при застосуванні оператора / до цілих чисел комп'ютер відсікає залишок від ділення.
У мові Сі є два зручні оператори, яких немає у інших мовах програмування: це оператор інкрементації ++ і оператор декрементації --. Оператор ++ додає до свого операнда 1, а оператор -- віднімає її. Таким чином, оператори x++; x--; еквівалентні операторам x=x+1; x=x-1;
Оператори декрементації і інкрементації можуть стояти перед або після операндів, наприклад, оператор x=x+1; можна записати як ++x; або як x++;
Проте вказані оператори у виразах працюють по-різному. Так, якщо оператори декрементації і інкрементації передують операнду, Сі спочатку виконує операцію приросту і потім використовує значення операнда. Якщо ж оператор приросту стоїть після операнда Сі спочатку використає поточне значення операнда і потім виконає приріст.
Пріоритет арифметичних операцій наступний:
Вищий
++ -- -
* / %
Нижчий
+ -
Логічні оператори та оператори порівняння
Оператори порівняння дозволяють визначити співвідношення двох величин. Результатом виконання цих операторів завжди є True або False.
Оператори порівняння:
Оператор
Опис
>
більше ніж
>=
більше або дорівнює
<
менше ніж
<=
менші або дорівнює
==
Дорівнює
!=
Не дорівнює
Логічні оператори:
Оператор
Опис
&&
логічне «і»
||
логічне «або»
!
логічне заперечення
Побітові оператори
На відміну від більшості інших мов програмування мова Сі має запас бітових операторів.
Бітові операції використовують для роботи з бітами в байті або слові
Оператор
Опис
&
побітове «і»
|
побітове «або»
^
виключаючи побітове «або»
~
доповнення до одиниці
>>
побітовий зсув вправо
<<
побітовий зсув вліво
Таблиця результатів операцій:
Операції
Операнд 1
Операнд 2
~
&
|
^
1
-
0
-
-
-
0
-
1
-
-
-
0
0
-
0
0
0
0
1
-
0
1
1
1
0
-
0
1
1
1
1
-
1
1
0
2.2. Робота з масивами даних
Масив представляє собою сукупність змінних одного типу із загальним ім'ям. Масив може мати від одного до декількох вимірів. Звернення до одного елементу масиву здійснюється за допомогою індексованого імені.
Одновимірні масиви
Формат оголошення одновимірного масиву має вигляд:
тип імя_змінної [розмірність] ;
тут тип визначає базовий тип масиву. У свою чергу базовий тип визначає тип кожного елементу масиву. Розмірність визначає, скільки елементів масив може містити.
У мові Сі перший елемент масиву отримує індекс 0. Таким чином, оголошений масив з десятьма елементами: від sample[0] до sample[9].
Для одновимірного масиву повний об'єм занятої пам'яті в байтах обчислюється за формулою:
Байти = sizeof (тип) * довжина масиву
Масиви часто використовуються при програмуванні, оскільки вони дозволяють легко обробляти великі об'єми пов'язаних даних.
Багатовимірні масиви
Мова Сі дозволяє оголошувати багатовимірні масиви. Найпростішим з багатовимірних масивів є двовимірний масив. Можна сказати, що двомірний масив - це масив з двох одновимірних масивів. Наприклад, для оголошення двовимірного масиву цілих чисел з ім'ям array і розмірами 10*20
необхідно записати:
int array[10][20];
Зверніть увагу на це оголошення: на відміну від інших мов програмування, де для розділення індексів по кожному вимірюванню використовуються коми, тут індекси мають свої квадратні дужки.
Двовимірні масиви зберігаються в пам'яті у вигляді матриці з рядками і стовпцями, причому перший індекс масиву позначає номер рядка, а другий індекс - номер стовпця. Тут перший індекс можна вважати "вказівником" на потрібний рядок.
Під елементи масиву відводиться безперервне поле пам'яті. У випадку двовимірного масиву розрахувати об'єм пам'яті, що виділяється байтах можна за формулою:
байти=число рядків * число стовпців * sizeof (тип даних)
2.3 Засоби мови Сі для роботи з рядками
Найчастіше одновимірні масиви використовуються для створення символьних рядків. У мові Сі рядок складається з масиву символів що закінчуються на нуль. Нуль позначається символом '\0'.В зв'язку з цим символьний масив повинен містити на один елемент більше чим містить символів записуваний в нього максимальний рядок. Наприклад, якщо ви хочете оголосити масив str, який буде містити рядок з десяти символів, то необхідно записати:
char str[11];
Таке оголошення залишає місце для нуля в кінці рядка. Не дивлячись на те, що в мові Сі відсутній тип даних "символьний рядок", він дозволяє записувати символьні константи.
У кінець символьної константи нам не потрібно додавати нуль -Borland Сі робить це автоматично. У зв'язку з цим рядок "turbo" в пам'яті виглядатиме як:
Borland Сі підтримує великий набір функцій обробки рядків. Найбільш поширеними з них є: strсpy(), strcat(), strcmp(), strlen().
Опис деяких функцій, для роботи зі стрічками
strcpy(s1, s2) — використовується для копіювання вмісту рядка str2 в вказаний рядок str1;
strcat(s1, s2) — додає рядок s2 до кінця рядка s1, при цьому рядок s2 залишається незмінним. Обидва рядки повинні закінчуватися нулем, результат також закінчується нульовим символом;
strcmp(s1, s2) — порівнює два рядки і повертає 0, якщо вони рівні. Якщо s1 символьно більше s2, функція повертає позитивне число, якщо менше - негативне. Майте на увазі, що якщо рядки рівні, функція strcmp() повертає "false", і якщо ви хочете використовувати цю умову для іншої дії, необхідно записувати оператора логічного заперечення NOT;
strlen(s) – поевертає довжину вказаної стрічки;
Масиви стрічок
У програмуванні часто доводиться використовувати масиви рядків. Наприклад, процесор введення бази даних може порівнювати команди користувача з рядковим масивом дозволених команд. Для створення масиву рядків необхідно використовувати двовимірний масив, в якому розмір лівого індексу визначає число рядків а розмір правого індексу - довжину кожного рядка.
2.4. Програмні засоби
Для роботи програми необхідна ОС: DOS, Windows 1,2,3; Windows 95/98/ME; Windows 2000; Windows XP;
Для компілювання проекту необхідний компілятор Borland С, бібліотечні функції : stdio.h, conio.h, math.h.
2.5. Технічні засоби
Нижче вказані характеристики комп’ютера на якому були створені та відлагоджені програми.
Процесор
Celeron 600 MHz
Материнська плата
Soyo 7iwm/l
Оперативна пам’ять
256 Мб DIMM SD-RAM
Відеокарта
Intel i815
Монітор
LG Studioworks 552V
Жорсткий диск
Samsung 40GB
Для нормальної роботи програми достатньо:
Процесор
33 MHz
Оперативна пам’ять
512 КіБ
Жорсткий диск
1 МіБ
3. Алгоритм розв’язування задачі
3.1. Текстовий опис алгоритму
У програмі підключаються стандартні бібліотеки “stdio.h” та “graphics.h”.
Ініціалізуємо графічний режим за допомогою стандартних бібліотечних функцій. У разі помилки, виводимо повідомлення про помилку.
Створюємо головне вікно програми. Включаємо курсор миші за допомогою програмних переривань ОС MS-DOS. Обмежуємо рух курсора миші прямокутником, який належить головному вікну.
Створюємо елементи інтерфейсу користувача: кнопки вибору числа та ігрову дошку.
Випадковим чином, згідно правил гри, згенерувати елементи на ігровій дошці. Відображаємо ігрову дошку на екрані.
Чекаємо на дії користувача. У разі натиснення на кнопку “Exit”, здійснюємо вихід із програми.
У разі натиснення на кнопку “New Game”, розпочинаємо нову гру.
У разі натиснення на одну із кнопок вибору числа, записати вибране число для подальшого розташування на дошці.
У разі натиснення на одну із клітинок ігрової дошки, перевірити чи вона не є заповненою. Якщо вона не є заповненою, то перевірити, чи, у разі розташування на дошці, вибране число буде унікальним у своєму рядку, стовпці та групі. Якщо задана умова виконується, то розташувати вибране число на дошці. Перевірити, чи кількість розташувань даного числа на дошці досягля максимального значення (розміру дошки). Якщо дана умова виконується, то заблокувати кнопку вибору даного числа. Якщо дошка повністю заповнена, повідомити користувача про це звуковим сигналом та розпочати нову гру.
3.2. Графічний опис алгоритму
Графічний опис алгоритму наведений далі.
4. Опис програми
Назва програми
Назва програми – sudoku.c
Призначення програми
Програма є реалізацією логічної гри Судоку.
Мова програмування на якій написана програма
Програма написана на мові програмування Borland С
Логічна структура програми
Програма розміщена в п’ятьох файлах: sudoku.c, config.c, config.h, gfxlib.h та gfxlibex.h і виконана у вигляді декількох функцій.
Крім функції main() програма містить такі допоміжні функції:
void generate_game_desk(void); -- випадковим чином генерує ігрову дошку (тобто, заповнює декілька клітинок);
void calc_ball_coords(unsigned char x,
unsigned char y,
unsigned short *left,
unsigned short *top,
unsigned short *right,
unsigned short *bottom); -- обчислює координати клітинки на екрані за її координатами на дошці; вхідні дані: x та y – координати клітинки на дошці; вихідні дані: left, top, right, bottom – екранні координати лівого верхнього та правого нижнього кутів кнопки;
void create_and_draw_game_buttons(void); -- створює та відображає кнопки вибору числа;
void draw_copyright(void); -- відображає текст про авторське право;
void select_value(unsigned char value); -- вибирає задане число для подальшого розташування на дошці; вхідні дані: value – число яке вибрав користувач;
void new_game(void); -- розпочинає нову гру
void check_game_over(void); -- перевіряє чи залишилися вільні клітинки; якщо ні, то розпочинає нову гру;
bool put_number(unsigned char x, unsigned char y); -- розташовує вибране число у вказаній клітинці (якщо можливо); у випадку помилки видає звуковий сигнал; вхідні дані: x та y – координати клітинки на дошці;
void on_button_press(char *name); -- обробник події натискання на кпопку; вхідні дані: name – назва натиснутої кнопки;
void init_gui(void); -- ініціалізує графічний режим та відображає основні елементи графічного інтерфейсу;
void close_gui(void); -- завершає графічний режим;
void create_cell(unsigned char x, unsigned char y); -- створює клітинку за заданими координатами; вхідні дані: x та y – координати клітинки на дошці;
void create_desk(void); -- створює ігрову дошку;
void draw_cell(unsigned char x, unsigned char y); -- відображає вказану клітину на екрані; вхідні дані: x та y – координати клітинки на дошці;
void draw_desk(void); -- відображає дошку на екрані;
5. Інструкція користувачеві
Інтерфейс гри реалізований у графічному режимі з використанням функцій заголовочного файлу graphics.h та асемблерних вставок для роботи із мишою. За основу інтерфейсу програми було взято інтерфейс ОС Windows 95.
Керування програмою здійснюється повністю за допомогою миші.
У верхньому правому кутку вікна розташовані кнопки “New Game” та “Exit”, за допомогою яких можна у будь який момент почати нову гру чи вийти з програми.
Справа розташовані кнопки вибору числа. За допомогою них можна вибрати число, яке буде занесено в клітинку під час наступного ходу. Якщо не вибрати число перед ходом, то буде використане число з попереднього ходу.
Основну частину вікна займає ігрове поле, на якому розташовуються цифри (вибрані однією із кнопок вибору числа) натисканням лівої клавіші миші.
Якщо користувач намагається здійснити заборонений хід, то програма повідомляє його про помилку звуковим сигналом.
Якщо користувачеві вдалося заповнити все ігрове поле, то програма повідомляє його про це звуковим сигналом та автоматично розпочинає нову гру.
Вихід із програми, окрім натискання кнопки “Exit”, можна здійснити, натиснувши клавішу Escape.6. Технологія програмування виконання та від лагодження програми
Використання функцій в програмі на С дозволяє практикувати такий підхід, як структурне програмування. При цьому окремі задачі виконуються незалежним фрагментом коду. Тобто структурне програмування і функції тісно між собою пов’язані.
Переваги структурного програмування :
- структурну програму краще писати бо складна задача розбивається на багато простіших задач. Кожна задача виконується функцією, в якій код та змінні ізольовані від інших частин програми.
- структурну програму легше відлагоджувати. Якщо в програмі є помилка, то структуризованість дозволяє локалізувати помилку цій чи іншій частині кода, наприклад в конкретній функції
Використовуючи структурний підхід, програмісти на С фактично слідують методу програмування зверху вниз. Це коли структура програми нагадує перевернуте дерево. Як правило вся фактична робота програми виконується функціями на кінцях “гілок” цього дерева.
В результаті функція main() - тіло багатьох програм на С містить порівняно мало операторів. Основний об’єм кода знаходиться у функціях.
Функція :
- ім’я (у кожної функції є своє неповторне ім’я);
- незалежність (функція може виконувати свою задачу без втручання інших функцій, і в свою чергу, не втручатись в їх роботу);
- cпеціальна задача (окрема частина роботи програми);
- повернення значення (функція може передати певну інформацію назад у викликаючу програму);
7. Контрольний приклад та аналіз результатів програми
В якості вонтрольного прикладу нижче наведено знимок екрану у момент гри:
8. Висновки
Після виконання розрахункової роботи я отримав необхідні знання та практичні навички роботи з із графікою, навчився програмувати розгалужені та циклічні процеси, навчився використовувати вказівники, навчився xвикористовувати масиви даних та вивчив основи роботи з рядками у мові Borland С.
9. Список використаної літератури
Кравець П.О. Методичні вказівки до виконання лабораторних робіт з дисципліни “Проблемно-орієнтовані мови програмування”. – Львів, 2001.
Язык Си - для профессионалов. По матер. кн. Г.Шилдта. И.В.К.- Софт. М.:1992.
С за 21 день – Бредли Л.Джонс, Питер Ейткен.
Конспект з дисципліни “Проблемно – орієнтовані мови програмування”
Керниган Б., Ритчи Д. Язык программирования Си. - СПб.: Невский
Шилдт Г., Полный справочник по C. - СПб.: Невский