Кращий підхід для написання шахового двигуна? [зачинено]


15

Я любитель шахів та програміст. Нещодавно я вирішив почати робити шаховий двигун, використовуючи свої знання з шахів та програмування. Тож ось моє запитання:

Яку мову (я знайомий з Java, C ++ та Python) та методологію я повинен адаптувати під час написання шахового двигуна?

Невелике керівництво буде дуже вдячне.

Редагувати:

Тому я вирішив зробити це в JavaScript. Я завантажую цей шаховий інтерфейс з github і тепер я все налаштовано! Першим моїм кроком було б написати юридичні кроки для цього. То чи може хтось вказати мені в правильному напрямку? (Я новачок у jQuery, але маю багато досвіду програмування).

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


5
Будь-яка основна мова та методологія не зробила б нічого особливого в шаховому двигуні (з цього приводу).
янніс

3
Я б конкретніше ставився до цілей. Якщо ви просто хочете звести його до низки правил, це велика задача, але будь-який програміст може розібратися з цим способом грубої сили. Якщо ви хочете вникнути у такі речі, як розпізнавання візерунка або зважування ризику проти винагороди, саме тут відповіді можуть бути соковитими.
Erik Reppen

Ви перевірили Педагогічний розділ під вікі Шахового двигуна. Вони, мабуть, призначені спеціально для навчання шаховому програмуванню, і всі вони є відкритим кодом. Навіть якщо ви не використовуєте фактичний вихідний код, документація зазвичай пояснює, що стоїть за розробкою: en.wikipedia.org/wiki/Chess_engine#Categorizations
user60812

1
Справді важка частина полягає в тому, як оцінити дану позицію, тому що для того, щоб вибрати, чи краще позиція А, ніж позиція В, потрібно перевірити.

1
Зовсім не ясно, що ти хочеш знати. Ви визначилися з представництвом посади? Якщо так, наступним кроком є ​​написання та тестування генератора переміщення. Не впевнений, що ви думаєте, що jQuery має відношення до цього.
Кевін Клайн

Відповіді:


19

Тут шахматист з 2072 рейтингами. Я створив цей веб-сайт у чистому JavaScript за вихідні. Це не шаховий двигун (я створив його для створення розважальних позицій відкриття як своєрідного збоченого двигуна Chess960), але це вихідний момент. Вихідний код тут .

Існує маса ускладнень, пов'язаних з виготовленням функціональної дошки. До них належать:

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

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

  • Як ефективно зберігати ці дані
  • Як продовжувати цей рекурсивний пошук - зрештою, ви не можете його довічно продовжувати, тому вам доведеться поставити обмеження, а потім розібратися, як розробити алгоритм, щоб зробити найбільш оптимальний і ретельний пошук у межах цієї межі. Наприклад, ви хочете переконатися, що вона принаймні пропонує деяку оцінку для кожного можливого початкового кроку, але ви також можете хотіти, щоб вона витрачала більше часу на оцінку більш перспективних кроків, замість того, щоб приділяти рівному часу кожному кроку.

Це все поверх дизайну алгоритму, в першу чергу, про що є багато інформації.

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

Після того, як вам стане комфортно з тим, що ви робите, наступні ресурси, ймовірно, виявляться справді корисними:

Удачі!


Дякую багато, це, безумовно, допомогло мені багато почати. Хоча ще багато чого вчитися та впроваджувати, шахові двигуни ніколи не легко написати. Але я думаю, що добре працювати з тим, що любиш!
Аднан Захід

Я згоден. Мені хотілося по-справжньому різноманітне резюме проектів, але, чесно кажучи, мені просто подобається більше розвивати шахові речі.
Ендрю Латем

Зараз продається домен lathamcity.com. Чи доступний зараз код на іншому веб-сайті?
IkWeetHetOokNiet

14

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

Рекомендую знайти шахову програму з відкритим кодом (їх має бути багато) і почати вдосконалювати її частини, які вас найбільше цікавлять. Зрештою, ви можете замінити всю програму, одну функцію за один раз, або ви можете навчитися достатньо і вмотивовано кинути її та спроектувати власну програму з нуля. У будь-якому випадку, ключовим є запустити "світло" та вивчити мотузки, перш ніж намагатися архітектувати цілу програму.


Відповідно до одного із встановлених протоколів інтерфейсу, ви можете використовувати будь-який існуючий фронтальний зв’язок зі своїм двигуном.

Я сподіваюся, що альфа-бета не потребує років, щоб писати
Кевін

1
Не роки писати, але роки поробляти :)
ddyer

9

Якщо ви знайомі з шаховими правилами, хорошим відправною точкою щодо основних методів є http://www.frayn.net/beowulf/theory.html Велика колекція матеріалів та посилань ви можете знайти тут: http: // chessprogramming .wikispaces.com / І третє: дізнайтеся про код інших. Погляньте на джерела Crafty . Це провідний двигун з відкритим кодом. Дуже важливо буде подумати про тестові випадки, щоб побачити, чи вдосконалюєте ви: Почніть, наприклад, з декількох простих простих позицій у кінцевій грі з 3 або 4 фігурами.


3

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

Якщо це просто весела вправа, ви можете скопіювати її в Javascript і розгорнути як веб-сторінку. Якщо ви ніколи не захочете перетворити його в експертну шахову гру, принаймні інші зможуть пограти з нею та її вихідним кодом.

Якщо ви хочете вивчити певну технологію одночасно, скажімо, WPF, то це може бути хорошим способом вбити двох птахів одним каменем. MVVM може бути надмірним для цього додатка, але ви хоч би це навчилися.

Якщо ви хочете націлити на Android пристрої, то Java буде хорошим вибором. Аналогічно Objective-C для пристроїв iOS.

Довгий і короткий вибір мови не існує у вакуумі.


3

Я припускаю, що ви вже знаєте про концепцію Min-Max, дерева та обрізку, евристичні та інші основи, і те, що я тут пишу, - лише деякі деталі, які, можливо, були недооцінені.

Я з товаришем по друку писав свій шаховий двигун іноді тому. Я поділяю деякі проблеми та ідеї, які ми мали, і сподіваюся, ви вважаєте їх корисними.

Оскільки ми обидва були програмістами Java, наша мова перетворилася на java, і ми почали з об'єктно-орієнтованого підходу. Шматки були предметами, дошка - об’єктом, файли та ранги (рядки та стовпці в шаховій літературі) - об’єкти. І це було неправильно. Накладні витрати були масивними, і програма намагалася пройти далі, ніж два кроки (4-х шарів) у дереві пошуку.

Тож з деяким пошуком у нас виникла геніальна ідея (не наша, проте!): Представляючи шматки та плату у вигляді довгих цілих чисел (64 біт). Це має сенс, оскільки шахова дошка має 64 квадрата. Решта - трохи розумні операції (працює дуже близько до cpu = надзвичайно швидко). Наприклад, розглянемо двійкове 64-бітове ціле число, в якому представлені квадрати на дошці, на які ваш шматок може атакувати. Тепер, якщо ви виконаєте логічне "І" між двома подібними числами, ненульовий результат зазначає, що у вас є квадрат з нападниками. Існує кілька способів подання шахової дошки та фігур. Отже:

1 - прийняти рішення про презентацію вашої ради

Тоді вам потрібно і відкрити базу даних. Відкриття шахів якимось чином вирішено, тому дуже рекомендується мати та відкривати книгу. У цьому випадку у вас є багато додаткового часу в бліц-іграх.

2 - Знайдіть собі відкриття книги.

Ми зробили це, але все ж нам було далеко не добре:

3 - Хороший шаховий двигун повинен мати можливість бачити на 6 кроків (12 шарів) попереду.

Тож, що ми зробили тоді, було використовувати мертвий час (якщо це людина від комп'ютера).

4 - Використовуйте час, коли противник думає, щоб створити деякі рівні вашого дерева.

І все-таки ми були далеко від 12 верств. Шляхом більшого вивчення ми виявимо деякі хитрощі! Наприклад, було запропоновано пропустити один шар дерева і почати з наступного (наприклад, немає суперника). Ідея полягає в тому, що якщо рух є вкрай ідіотським, то навіщо витрачати час і бачити, які відповіді на цей хід відповідають опоненти. Однак один хороший двигун повинен вміти розрізняти і ідіотський хід і геніальну жертву королеви.

5 - Вивчіть прийоми програмування цієї конкретної проблеми (шахи).

Мені та моєму другові в цьому стані було все ще погано: / Що ми могли зробити - і ми частково зробили - це зберегти обчислені позиції. Якщо ви обчислюєте позицію, то збережіть її на майбутнє! Те саме стосується циклів у дереві пошуку. Сенс полягав у ефективному збереженні / відновленні:

6 - Збережіть отримані вами дані ... Ефективно!

і, нарешті:

7 - Код з максимальною оптимізацією.

Ця проблема надзвичайно дорога як у процесорі, так і в пам'яті. Дуже важливо дуже ефективно написати свій код. Пам'ятайте, що ми говоримо про галузевий коефіцієнт 35. Це означає марне "якщо" десь у вашій евристиці, може перетворитися на 3.3792205e+18марне "якщо" десь глибоко у вашому дереві пошуку.

Шахове програмування - дуже цікавий виклик, і саме час ви можете поставити свої можливості програмування в серйозне випробування. Я можу запропонувати ще декілька моментів, але я впевнений, що ви їх відкриєте самі. Є ще багато пунктів, про які я не знаю, але їх можна знайти в Інтернеті!

Хай щастить!

ps Я не знаю JavaScript дуже добре, але щось говорить мені на основі складності проблеми, можливо, враховуючи все, що може запропонувати C ++, було б краще кинути javascript і зробити це на C ++.


2

Згідно з вашою редакцією, ви перебуваєте на етапі визначення "законних" кроків.

Існує два способи опису рухів у шахах. Описові позначення та алгебраїчні позначення. Напевно, ви хочете, це функція, яка приймає частину, вихідну позицію та кінцеву позицію як параметри. напр. Лицар від QN1 до QB2 недійсний, але Knight від QN1 до Q2 є дійсним. Думаючи про це, алгебраїчні позначення можуть бути простішими завдяки здатності легко обчислювати «відносне» позиціонування.

Щоб переконатися, що ви пишете мінімально необхідну кількість коду, я спершу розпочну з написання тестів для цієї функції . Якщо ви використовуєте алгебраїчні позначення, вам, ймовірно, не знадобиться тест за штуку / початок / кінець. Приступайте до кожного тесту та випробовуйте дублювання, перш ніж перейти до наступного "переміщення". Ваш код стане чистішим.

Після того, як ви достатньо висвітлили легальні та незаконні кроки для кожного твору, я б почав додавати чеки на інші змінні (наприклад, переведення короля в умови "чек" та "товариш").

Я рекомендую квіта для одиничних тестів та жасмін для поведінкових тестів у JavaScript.


1

Я фактично написав шаховий двигун. Підготуйте себе як до частування, так і до кошмару. Коли ми з друзями це зробили, це було на змаганнях з програмування приурочених програм, і мова, з якою ми вирішили піти, - Java. Я вважаю, що Java або C - ваш найкращий вибір, але я бачу, що ви вирішили перейти з Javascript. Я не можу насправді стукати, бо я незнайомий з цим.

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

Щасти


1

Для частини гри, яка приймає рішення для комп'ютерних гравців, я не можу рекомендувати достатньо книги "Штучний інтелект: сучасний підхід" (книжковий веб-сайт http://aima.cs.berkeley.edu/ ). Залежно від вашого досвіду в математиці (теорія графіків допомагає), це може бути трохи високий рівень, але він написаний так просто, як це може бути, і він містить дуже сучасний огляд (і деяку глибину) методик змусити програми вирішувати речі.

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

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

Лише тоді я би розглядав оптимізацію подання, щоб зробити індивідуальні обчислення швидшими, наприклад, використовуючи довгі цілі числа, як було запропоновано. Незалежно від того, наскільки швидко ви зможете зробити єдине порівняння, якщо спосіб проходження проблемного простору не має хорошої евристики, для цього знадобиться вік.


0

Ви можете піти дійсно будь-яким бажаним способом, але це мої думки з цього приводу:

Я б використовував Java як це дозволяє вам бути дуже високим рівнем і мати бібліотеки користувальницького інтерфейсу (AWT, Swing) у вашому безпосередньому розпорядженні. Для моделювання шахової дошки та фігур можна використовувати об’єктно-орієнтований підхід. Інші об’єкти можуть стояти за історію ходу та забивання. Навіть гравці можуть бути об’єктами, і тоді ви можете в майбутньому розширити свій Playerклас, щоб забезпечити штучний інтелектуальний комп'ютерний програвач.

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

Ви також можете застосувати тестову розробку , яка не тільки гарантує, що всі методи ведуть себе так, як ви очікуєте, але і змушує вас писати перевірений модульний код.


4
Шаховий двигун не має нічого спільного з інтерфейсом користувача, лише «розум», який обчислює найкращий хід.
CSE

@CSE - Це залежить від вашого визначення двигуна .
Daniel AA Pelsmaeker

@CSE - редагувати шоу , як Аднан, він був на самому ділі також шукає UI. Тож моя відповідь актуальна.
Daniel AA Pelsmaeker

-8

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

Тепер, якщо ви хочете зробити AI з шаховими іграми, який візьме на себе роль одного з гравців, ось дещо стає складним. Але знову ж таки, вибір мови не є найбільшою проблемою тут; розуміння задіяних принципів ШІ - це. Це буде набагато важливішим фактором.

(Сказавши це, подібний процес прийняття рішень може бути надзвичайно обчислювальним, і ви, мабуть, захочете використовувати щось, що компілюється в рідний код, а не на скриптовій мові. І C ++ - це дуже поганий вибір, не тому, що це не дуже добре - підходить до цієї проблеми, але просто тому, що це взагалі дуже погана мова, і намагання втілити в неї складні речі - це хороший спосіб кодувати всілякі головні болі для себе.)


15
Я думаю, вам доведеться бути трохи більш конкретними щодо того, чому C ++ не підходить до цієї конкретної задачі, щоб уникнути святого варцу.
Ерік Реппен

9
-1 за спробу розпочати святу війну.
Doc Brown

1
Чому ви вважаєте, що C ++ взагалі дуже погана мова?
Ентоні

Я думаю, ти точно помилився з ним. Я, наприклад, поділяюсь його думкою, C ++ - це хороша мова для початку, але це стає болем, коли ти маєш справу зі складними речами!
Аднан Захід
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.