Я предполагаю, что вы уже знаете о концепции Min-Max, деревьях и обрезках, эвристических и других основах, и то, что я пишу здесь, это лишь некоторые детали, которые могли быть недооценены.
Я с компанией подруги иногда писал наш собственный шахматный движок. Я делюсь некоторыми проблемами и идеями, которые у нас были, и я надеюсь, что вы найдете их полезными.
Поскольку мы оба были программистами Java, наш язык превратился в Java, и мы начали с объектно-ориентированного подхода. Части были объектами, доска была объектом, файлы и ранги (строки и столбцы в шахматной литературе) были объектами. И это было неправильно. Затраты были огромными, и программа изо всех сил пыталась пройти дальше, чем 2 шага (4 слоя) в дереве поиска.
Таким образом, после некоторого поиска мы получили блестящую идею (но не нашу!): Представлять фигуры и доску в виде длинных целых чисел (64 бита). Это имеет смысл, потому что шахматная доска имеет 64 квадрата. Остальные были немного мудрыми операциями (работающими очень близко к процессору = очень быстро). Например, рассмотрим двоичное 64-битное целое число, в котором те представляют квадраты на доске, на которые ваша фигура может атаковать. Теперь, если вы выполнили логическое «И» между двумя числами, как это, ненулевой результат означает, что у вас есть квадрат с атакующими. Есть несколько способов сделать шахматную доску и фигуры, поэтому:
1 - Определитесь с вашей презентацией на доске
Тогда вам нужно и открыть базу данных. Шахматное открытие каким-то образом решено, и настоятельно рекомендуется иметь и открывающую книгу. В этом случае у вас много дополнительного времени в блиц-играх.
2 - Найди себе вводную книгу.
Мы сделали это, но все же мы были далеко не хороши:
3 - Хороший шахматный движок должен видеть впереди 6 ходов (12 сгибов).
Итак, то, что мы сделали тогда, было использовать мертвое время (если это человеческий или компьютерный движок).
4 - Используйте время, когда противник думает, чтобы создать несколько уровней вашего дерева.
И все же мы были далеко от 12 слоев. Путем дополнительного изучения мы обнаружим некоторые хитрости! Например, было предложено пропустить один слой дерева и начать со следующего (как будто нет противника). Идея состоит в том, что если ход крайне идиотский, то зачем тратить время и смотреть, как противники реагируют на этот ход. Тем не менее, один хороший двигатель должен уметь различать идиотский ход и гениальную жертву королевы.
5 - Изучите приемы программирования для этой конкретной задачи (шахматы).
Я и мой друг в этом состоянии были все еще плохи: / То, что мы могли сделать - и мы частично сделали, - это сохранить рассчитанные позиции. Если вы рассчитываете позицию, то сохраните ее на будущее! То же самое касается циклов в дереве поиска. Задача состояла в том, чтобы эффективно сохранить / извлечь:
6 - Сохраните данные, которые вы генерируете ... Эффективно!
и наконец:
7 - Код с максимальной оптимизацией.
Эта проблема чрезвычайно дорогая как в процессоре, так и в памяти. Очень важно писать свой код очень эффективно. Помните, что мы говорим о факторе ветвления 35. Это означает, что бесполезное «если» где-то в вашей эвристике может быть превращено в 3.3792205e+18
бесполезное «если» где-то глубоко в вашем дереве поиска.
Шахматное программирование - очень очень интересная задача, и это время, когда вы можете подвергнуть свои возможности программирования серьезному испытанию. Есть еще несколько моментов, которые я могу предложить, но я уверен, что вы сами их обнаружите. Есть еще много моментов, которые я не знаю, но вы можете найти их в Интернете!
Удачи и приятного времяпровождения!
PS Я не очень хорошо знаю javascript, но кое-что говорит мне о сложности проблемы, может быть, учитывая все, что может предложить C ++, было бы лучше отказаться от javascript и сделать это на C ++.