Автор работы: Пользователь скрыл имя, 02 Мая 2013 в 22:08, курсовая работа
Розробка програм для аналізу шахових комбінацій представляє великий інтерес в дослідженнях з області штучного інтелекту. На сьогоднішній день існує дуже багато програмних засобів для повноцінної гри в шахи та, навіть, спеціалізовані шахові комп’ютери, призначені тільки для шахів.
Історія шахових машин старша, ніж історія комп'ютерів. Ідея створити машину, що грає в шахи, датується ще вісімнадцятим століттям. Близько 1769 р. з'явився шаховий автоматМеханічний турок. Він був призначений для розваги королеви Марії Терезії. Машина дійсно непогано грала — усередині неї сидів сильний шахіст, який і робив ходи.
Таблиця 3.1 – позначення фігур в масиві board та номери елементів масива figuresNumberдля кожного виду фігур
Фігура |
Позначення в board |
Номер елемета масива в figuresNumber | ||
Білі |
Чорні |
Білі |
Чорні | |
Ферзь |
1 |
2 |
8 |
9 |
Слон |
3, 5 |
4, 6 |
2 |
3 |
Кінь |
7, 9 |
8, 10 |
4 |
5 |
Ладья |
11, 13 |
12, 14 |
6 |
7 |
Пішак |
15, 17, 19, 21, 23, 25, 27, 29 |
16, 18, 20, 22, 24, 26, 28, 30 |
0 |
1 |
Король |
31 |
32 |
10 |
11 |
Таблиця 3.2– Позначення рівнів контролю поля фігурою
Значення |
Розшифровка |
0 |
Ніяких можливостей відносно цього поля |
1 |
Поле пусте. Можна ходити, але не можна бити (прямий хід в пішаків) |
2 |
Поле криється королем, але походити він туди не може (враховуєтсья тільки для іншого короля) |
3 |
Поле пусте, бите, але походити туди не можна (бите поле в пішаків) |
4 |
Поле пусте, бите, можна ходити |
5 |
Поле бите, зайняте ворожою фігурою |
6 |
Поле бите, зайняте дружньою фігурою |
Основні методи (функції) класу chess (ті, що можуть бути викликані зовні, з модифікатором доступу public):
- randomCombination() – заповнює масив boardвипадковими числами, що позначають фігури, потім викликає функції підрахунку фігур, аналізу і т.д. Основні вимоги до випадкової комбінації описані в розділі 2. Усі вони дотримані. Детальніше про роботу підпрограми описано в наступному підрозділі;
- defaultCombination()–розставля
є шахи в початкове положення, після чого також викликає функції аналізу; - setFigure() – записує координати розстановки для кожної фігури з board, встановлює відповідним фігурам прапор присутності;
- analyze() – викликає функії підрахунку фігур, підрахунку балів за фігурами, визначення можливих ходів і битих полів для кожної фігури і для сторони в цілому, функції аналізу комбінації на шах, пат, мат.Детальніше роботу функції описано в відповідному підрозділі.
Private-методи класу chess, викликаються з інших методів:
- checkAnalyze() – аналіз комбінації на шах;
- countFigures() – підрахунок фігур кожного виду;
- scanWays() – аналіз можливих ходів і битих полів для кожної фігури;
- setFields() – аналіз всіх контрольованих полів за білими і чорними;
- kingWays() – уточнює можливі ходи короля.
Клас chessмістить масив об’єктів з 32 елементів класу figures. Структура цього класу наведена на рисунку 3.6.
Рисунок 3.6 – структура класу figures
Вміст цього класу був перелічений вище. Детальніше його можна подивитись в лістингу.
3.3Генерація випадкових
За генерацію випадкових комбінацій відповідає метод randomCombination() класу chess. Основні вимоги до випадкових комбінацій наведені в розділі 2.
Як вже було сказано, інформація
про розташування фігур на дошці
представляється у вигляді
Крім розташування фігур для кожної комбінації задається черга ходу.
Генерація випадкових комбінацій полягає в заповненні масиву розташування фігур та черги ходу випадковими значеннями. Відбувається це наступним чином:
- Випадковим числом вибирається черга ходу.
- В циклі перебираються числа від 1 до 30 (всі фігури, крім королів);
- Для кожної фігури викликається метод setRandomкласу figures, який генерує випадкові координати, дотримуюючись певних правил залежно від номеру фігури;
- Після отримання координат метод randomCombination() перевіряє значення, що повернула функція setRandom(). Якщо фігура вимагає встановлення (setRandom = true) і поле, на яке вона посилається вільне, то поставити її на це поле. Виконувати кроки 3-4, доки не поле з згенерованими координатами не буде вільним;
- Виконати кроки 3-4 для всіх фігур від 1 до 30 (крім королів);
- Обрати того короля, чий зараз хід і поставити на випадкове вільне поле (метод setRandom);
- Проаналізувати биті поля (метод analyze());
- Обрати іншого короля і поставити на випадкове, вільне, не бите поле;
- Проаналізувати згенеровану комбінацію (метод analyze()).
Метод setRandom(intbuf) генерує випадкові координати. Точніше не генерує, а вираховує відносноцілочисельного аргумента buf. Аргумент випадковий і генеруєтьсяоб’єктом класу System.Randomв діапазоні значень від 0 до 127 в методі randomCombination(), що викликає setRandom(intbuf). Таке ускладнення зроблене для того, щоб не створювати багато об’єктів класу System.Random.
В найпростішому випадку x-
Для деяких фігур координати вираховуються особливим чином:
- Якщо фігура – офіцер з ID3 або 4, то вибрати координати однієї з білих клітинок;
- Якщо фігура – офіцер з ID 5 або 6, то вибрати координати однієї з чорних клітинок;
- Якщо фігура – білий пішак, то y-координату задати випадково в діапазоні від 2 до 7, а x-координату задати як суму початкової x-координати та випадкового зміщення, що не перевищує y-координату;
- Якщо фігура – чорний пішак, виконати всі дії, визначені для білого пішака та інвертувати (відносно 8) його y-координату;
- Якщо фігура – король, то y-координата вираховується, як результат від ділення аргументу bufна 16.
Будь яка фігура, крім короля, може мати згенеровану y-координату, що не входить в діапазон шахової дошки. В такому випадку фігура на дошку не ставиться. Таким чином досягається випадковість встановлення фігури (встановлювати фігуру чи ні), при чому король ставиться завжди. Належність y-координати діапазону дошки перевіряється в самому методі setRandom, що повертає значення типу bool (true якщо фігура знаходиться в заданому діапазоні).
Алгоритм генерування
3.4 Аналіз комбінацій
Аналіз шахових комбінацій виконує метод analyze() класу chess. По суті він всього лиш викликає набір інших методів. Послідовність дій цих методів така:
- Задати всім елементам масиву figure[32] координати та видимість відповідно до їх розташування в масиві board[8, 8] – метод setFigures();
- Підрахувати кількість фігур кожного виду (заповнити масив figuresNumber[12])–метод countFigures();
- Визначити всі можливі ходи, биті та криті поля кожної фігури та чорних і білих загалом–метод scanWays();
- Уточнити ходи королів – метод kingWays();
- Проаналізувати комбінацію на шах – метод checkAnalyze().
Оскільки всі ходи позначаються через велику кількість текстових міток (загальна їх кількість для позначення ходів – 64), то керувати ними, звертаючись окремо до кожного, досить складно. Тому було вирішено створити клас ways з полем класу Label і створити масив об’єктів цього класу. Для централізації керування цим масивом його приховано в клас action, єдиним полем якого є масив ways.
На панелі фігур (зправа від дошки) кожен елемент є об’єктом класу items. Цей клас містить об’єкт PictureBox (для позначення фігури) і об’єкт Label (для позначення їх кількості). Як видно з головного вікна, таких об’єктів 12. Вони утворюють масив, прихований в класі panel (Не System.Windows.Forms.Panel). Крім цього масиву клас panelмає ще одне поле типу int – номер обраного елементу при розстановці шахів вручну. Тобто клас panel містить інформацію з панелі фігур, клас action – про відображення ходів фігур на дошці.
4 РЕАЛІЗАЦІЯ ПРОГРАМИ МОВОЮ С# НА ПЛАТФОРМІ .NET
4.1 Проект WindowsForms
Програму реалізовано, як проект WindowsForms. Для створення цього проекту необхідно запустити середовище VisualStudio (в даному випадку розглядається VisualStudio 2012). Далі створити новий проект. Зявиться наступне вікно:
Рисунок 4.1 – Створення нового проекту в VisualStudio 2012
У цьому вікні потрібно обрати мову C#, підрозділ Windowsпроект WindowsFormsApplication. В полі nameнеобхідно ввести ім’я, після чого натиснути ОК.
Після цього створиться проект і
пуста форма – головне вікно
програми. Це клас Form1 унаслідуваний від
класу FormбібліотекиSystem.Windows.
Список компонентів, які можна додавати на форму міститься у вікні Toolbox. Якщо воно вимкнене, то увімкнути його можна обравши пункт Toolbox меню VIEW або натиснувши комбінацію клавіш Ctrl+Alt+X.
Усі компоненти WindowsFormsзнаходятся в dll-бібліотеці System.Windows.Forms. Для того щоб в файлі лістингу можна було їх викоритовувати необхідно підключити цю бібліотеку до файлу *.cs:
4.2 Розробка інтерфейсу
Бібліотека System.Windows.
- MenuStrip – для головного меню;
- StatusStrip – для панелі стану;
- Label – для всіх текстових написів у вікні програми;
- PictureBox – контейнер для виведення зображень. Сюди поміщатимуться всі фігури, дошка та інші графічні елементи інтерфейсу;
- Panel – елемент для групування кількох елементів. В даному випадку буде використаний для об’єднання шахової дошки та всіх фігур;
- Button – кнопка. Це досить зручний елемент керування. Доцільно використати для основних функцій цільової програми;
- OpenFileDialogта SaveFileDialog – діалогові вікна для вибору файлу для відкривання і зберігання відповідно. Необхідно використати, оскільки в програмі має бути можливість зберігання і завантаження комбінацій.
Після вибору і розташування необхідних компонентів та задання їх властивостей головне вікно набуло остаточного вигляду. Вигляд головного вікна наведений на рисунку 4.2.
Рисунок 4.2 – Остаточний вигляд вікна пограми
Основні елементи вікна програми:
- Головне меню;
- Шахова дошка;
- Панельфігур(ліворучвідшаховоїд
ошки); - Кнопки керування комбінаціями(нижче панелі фігур);
- Рядок стану.
Головне меню має наступні пункти:
- Файл - робота з файлами, вихід з програми:
- Відкрити комбінацію - завантажує шахову комбінацію з файлу і аналізує її;
- Зберегти комбінацію - зберігає поточну комбінацію в файл;
- Вихід - закриває програму;
- Керування - маніпулювання комбінаціями:
- Генерувати комбінацію - випадковим чином розставляє шахи на дошці;
- Розставити шахи вручну - дозволяє самостійно розставити фігури і вибрати, чий хід;
- Відновити початкову комбінацію - розставляє фігури в їх початкові позиції;
- Вигляд дошки - задає стиль дошки:
- Коричневий (за замовчуванням);
- Червоний;
- Натуральний;
- Довідка - інформація про програму та довідка до неї:
- Про програму;
- Довідка.
Додаткового пояснення потребує панель фігур праворуч від шахової дошки. На цій панелі позначається кількість фігур кожного виду, що присутні на дошці. Також з цієї панелі виконується вибір фігури, якщо увімкнена ручна розстановка шахів. Кількість фігур позначається в правому нижньому кутку піктограми фігури. Максимальна кількість фігур відповідає їх початковій комбінації. Якщо максимальна кількість фігур якогось виду досягнена, то кількість відображається сірим кольором. Якщо ні - то чорним. Наприклад, на рисунку 4.3 зображена ситуація, коли кількість чорних пішаків - 8 (максимальна), а білих – 7.