Наверняка многие, встретившись на разных этапах своей жизни с шахматами и программированием, задумывались над тем, чтобы как-то соединить эти две стихии самостоятельно. Стараясь игнорировать любую информацию, которую я до этого слышал о принципах шахматных движков, я попробовал с нуля научить этой игре Matlab (зацепил его в последних классах школы, тогда даже получилось реализовать убогий интерфейс для змейки).
Начать рассказывать правила я решил тупо через расчет разрешенных клеток для конкретной фигуры в конкретной позиции. Во время отладки понял, что, оказывается, не знал некоторых нюансов типа условий, при которых можно рокироваться. В итоге научив всех коней прыгать, а пешек — превращаться в другие фигуры и делать взятие на проходе, я получил более-менее рабочий вариант. Для игры с вдвоем с другим человеком.
Обучение самостоятельной игре я изначально планировал основать на алгоритме, который по первым ходам соперника начинает из массива загруженных партий постепенно отбирать победный вариант. По такой же логике я сначала реализовал крестики-нолики, базу партий которых посчитал на листе бумаги. Вдохновленный успехом, за базой шахматных партий я полез уже в интернет.
Бестолковость своей задумки я понял достаточно быстро. Изначально желая не портить свои зарисовки знанием существующих принципов, я в итоге два дня просидел за статьями, описывающими теорию создания (настольно-)игрового движка. Во-первых, опора на базу партий невозможна — ее просто нет. Если в крестиках-ноликах на девяти клетках все возможные партии можно сыграть за обедом, то в шахматах, внезапно, все чуточку сложнее. Наличие миллионов разветвлений уже после нескольких ходов заставляет нас прибегнуть к такому механизму, как анализ позиции. И тут я растерялся, так как просто не знал, как к этому делу подступиться. Если мой шахматный уровень позволял мне просчитывать, какие два хода следующими сделает мой дед, то попытка прописать подобный просчет в программе уже на следующем ходе теряла свою актуальность.
Изучив комментарии к алгоритмам Стокфиша — до сих пор в шоке, что подобная технология открыта, — мне показалось странным, что теоретические основы движка в целом очень логичны, но при постановке себе задачи я о них даже не подумал. Пусть и для обывателя вариант с базой партий очень напрашивается, но, когда этот вариант не прокатил, я буквально не знал, как ко всему этому подступиться. Все последующие идеи так или иначе опирались на дерганье из массива. К слову, в шахматах все-таки есть некоторые просчитанные вещи — пешечным дебютам научить мне программу все же удалось, но опять же, можно ли это назвать уроком.
В связи со всем этим хотел поинтересоваться, чем у кого увенчивались попытки создать подобный алгоритм — необязательно шахматы, тут меня даже больше волнует стратегия поиска подхода к задаче, в которой казалось бы все решается большими данными.