Дневник разработчика шахматной программы

часть 2

на главную страницу

 GENIE

Дневник разработчика шахматной программы Джин
часть 1

______________________________________________________________________________________________
Четверг, 16 ноября 2006 г.
Решил завести файл «история разработки проги». Ну, на самом деле это всего лишь продолжение «ANDREY_CHESS_дневник_разработки.doc».
Просто всегда, когда разработка проги заходит в тупик, хочется поразмышлять и проанализировать причины
остановки творческого процесса.
Обычно после некоторой паузы я открываю код и тупо пялюсь в него, не в состоянии что либо понять, а уж тем
более что либо улучшить. И это несмотря на то, что я все комментирую.
Всегда трудно продолжать заброшенный на время проект.
Тем более когда он заглох и не было сил его продолжать.
Теперь я его переименовал в GENIE т.е. Джин.
Кстати, на сайте я давно так назвал свою прогу, но сама она называлась по старинке And_chessK.
Ну а теперь я все привел в соответствие.

Возобновляя заброшенный проект, начну с некоторых общих идей:

1) Нужно разделять шахматную оболочку и движок так, чтобы оболочка могла работать с различными
движками, и движки должны уметь работать с различными оболочками. Для этого необходимо иметь четко
прописанный интерфейс. Очень хотелось бы иметь возможность подключать к своей оболочке сторонние
движки, но для этого она должна уметь держать интерфейсы винбоарда или уки.

2) Назовем основные пакеты так:

Genie_shell оболочка шахматной программы.
Genie_shell_resource ресурсы оболочки шахматной программы.
Genie_shell_rules шахматные правила для оболочки.
Genie_shell_save запись партий в оболочке.

Genie_engine шахматный движок - переборщик вариантов.
Genie_engine_rules шахматный движок - блок шахматных правил.
Genie_engine_estimation шахматный движок - блок оценки позиции.

3) Между оболочкой и движком должен быть единый интерфейс. Нужно понять, какого вида он должен быть.

Хотелось бы чего?
Чтобы был объект или функция, у которых, мы знаем, в описании содержал следующие моменты:

**************************************
– решаемая ею задача;
– входные и выходные данные;
– способ решения задачи;
– проблемы;
– последняя редакция.
**************************************

Вот мы ее и написали, описали и оттестировали – потом можно пользоваться.

Ну а как же объекты и структуры используемые в объектах? Их тоже протаскивать через интерфейс?
Их тоже нужно описывать? Тогда интерфейс оказывается неподъемным!
Так же часто можно встретить случай, когда описание кода сложнее и запутаннее самого кода!

_______________________________________________________________________________________________
Пятница, 17 ноября 2006 г.
И все-таки код становится все более понятным и лучше закомментированным. Все таки постоянная наработка
дает о себе знать. Сложность проги для меня избыточна и это заставляет искать методы оптимизации. Основной –
это заголовок класса, как я его вчера описал и конечно файл справки в пакете и корневой папке. Все-таки я верю,
что со временем код станет удобочитаемым и прозрачным!
_______________________________________________________________________________________________
Среда, 13 декабря 2006 г.
Прошло много времени. Я написал движок на основе старого, но он не заработал. Пришлось переписывать заново с поэтапным тестированием. Кстати, надо сказать, что прорыв в тестировании произошел, когда я догадался пропечатывать позицию в консоле. Так я смог наблюдать за перебором. Этот этап у меня не описан, потому что там ничего нового – просто загнал по новой старое и все. Ну еще ввел подфункции и комментарии и это все. Скажу только, что сделал я его где-то за неделю. Ну а теперь я веду дневник разработки и буду писать о возникающих проблемах и их решении.
Сейчас используем полный перебор как наиболее простой и будем его использовать, пока не реализуем все правила.
Главная проблема сейчас – это реализация всех правил для движка, ну кроме шаха, мата, пата и ничьей повторением ходов. Дальше нужно, чтобы движок выдавал правильный вариант. Это текущие задачи, их и надо решать.

Какая заходная глубина? Мы берем позицию первого уровня и получаем второго. Что писать в вызове функции 1 или 2? Тут надо подумать, какая самая маленькая глубина? Очевидно это 1 полуход. Так как 0 полуходов это вообще не ход, так как позиция не меняется и фигуры не двигаются. Итак, глубина максимальная – это на сколько полуходов считать и ее минимум это 1 полуход, меньше уже не бывает. В класс мы так и передаем, как есть. Если стоит флажок на 1 полуход, то именно 1 мы в функцию и передаем, и это правильно! Даже больше того, на всех уровнях используем входную переменную, что уже вообще говоря не правильно :)
А вот для текущей глубины есть неоднозначность, ведь мы переходим с одного уровня на другой, и что тут брать за основу? Предыдущий или последующий уровень? Думаю что последующий, ведь именно так мы сможем увеличивать уровень в рекурсивном вызове и с самого начала указать, что мы должны рассмотреть позицию именно 1 полухода, а не 0 что было бы смешно!
______________________________________________________________________________________________
Воскресенье, 17 декабря 2006 г.
Что-то рокировка не работает так, как я задумывал. Причина в том, что у меня записывался массив последней позиции;
теперь с этим порядок, я массив рокировки переписываю в функции, где переписываю и лучшую позицию, ведь нас интересует массив рокировки именно для нее. Ну и еще накололся на ссылке, т.е. передавал ее не по значению. Наверняка есть еще, что надо будет смотреть.

_______________________________________________________________________________________________
Понедельник, 18 декабря 2006 г.
Часть правил написанная давным-давно в оболочке работает прекрасно. Сегодня я ее протестировал, но не ради нее, а ради того, чтобы посмотреть ее взаимосвязь с движком – передается ли массив. Но у нее есть недостаток – если ладью срубят, то рокировка останется и ладья возникнет при рокировке :). Честно говоря, лезть сейчас в оболочку неохота, но с другой стороны, не оставлять же этот баг! Даже не знаю что делать :). Баг оставлю, так как смысла корректировать этот класс я не вижу, если что просто его потом заменю. Теперь рокировка вроде работает, хотя я проверял ее на одном полуходе. Конечно нужно посмотреть как минимум на двух, чтобы видеть, что массивы нормально передаются. Но этим я займусь завтра.
_______________________________________________________________________________________________
Четверг, 21 декабря 2006 г.
С рокировкой вроде разобрался. Подправил на случай когда у нас больше двух ладей. Вроде все нормально работает. Заметил, что у меня перебор на следующей глубине делается два раза, ну по крайней мере, так кажется, когда видишь распечатку позиций :). Надо посмотреть что это за хрень. Все, кажется, понял. Тут все нормально и не два, а столько раз, на сколько клеток может встать фигура. Также не понятно, почему иногда доска вообще очищается и бывает это, когда съели короля. Или когда мало фигур. Надо подумать, что это такое. Видимо тут все дело в оценке позиции, но как тут отловить этот момент я пока не понимаю.
_______________________________________________________________________________________________
Пятница, 22 декабря 2006 г.
Вообще, оценка позиции – это на потом. Сейчас меня интересуют рокировка и ее я уже сделал взятие на проходе. В оболочке оно у меня уже есть, надо его вспомнить и перенести на движок.
_______________________________________________________________________________________________
Суббота, 23 декабря 2006 г.
Похоже, превращение пешки в ферзь в движке я не сделал. Больше того, он даже не хочет ставить пешки на последнюю горизонталь! Сделал отображение количества просчитанных позиций. Нашел баг. Я в массив цветов фигур вписывал ферзя! И самое интересное, что компилятор не ругался :). Теперь пешки превращаются в ферзи. Дальше займемся взятием на проходе.
_______________________________________________________________________________________________
Воскресенье, 24 декабря 2006 г.
Сегодня два часа делал взятие на проходе. Вроде сделал. Нужно теперь тщательно протестировать. Если тут все будет нормально, тогда займемся шахом и матом. Я уже знаю, как их сделать, правда, для этого придется переписать блок правил. Работы тут конечно много, но принципиальных проблем я не вижу. Так что, если раньше я даже не представлял себе, как делать шах и мат, то сейчас я это знаю – остальное дело техники. Кстати, увидел что у меня для каждого хода движок заново создается. Это конечно неприемлемо. Надо решить, что тут делать – либо заняться этим после прохода, либо после мата.
_______________________________________________________________________________________________
Суббота, 30 декабря 2006 г.
Для того, чтобы перейти к шаху и мату, надо будет переписать блок правил. Теперь у нас будет
0-запрет хода, 1-ход на пустое поле, 2-рокировка, 3-превращение пешки, 4-взятие, 5-взятие на проходе, 6-взятие короля.
Правила переписал неожиданно быстро. Есть еще неясности с взятием на проходе, но тут надо тестировать и разбираться.
Теперь надо подумать над шахом.
_______________________________________________________________________________________________
Понедельник, 1 января 2007 г.
Накопилось много неясностей, так что я потерял уверенность в программе. Надо будет описать решения, которые я использовал в движке. Это касается и перебора, и других моментов. Нужно в отдельном текстовом файле описать суть программы, а то за деревьями не видно леса. Одно дело – идея, а другое – ее программная реализация. Это как душа и тело. Да и для другого программиста это важно, так как позволяет понять, стоит ли вообще лезть в этот код. Так же бывает, что идея плохая и даже хороший код тут не поможет, а бывает и наоборот – дикая реализация дискредитирует хорошую идею.
Новую редакцию правил я протестировал. Вроде работает. С шахом и матом что-то у меня не прет. Простых идей, как это реализовать у меня нет. Кроме того, что на выходе проверять позицию и если прога съела или отдала короля, то писать, что мат и не менять позицию. Внешне будет приемлемо. Так и сделал. Правила трех повторений и 50 ходов оставлю на потом. Сейчас займусь описанием движка и его тестированием.
_______________________________________________________________________________________________
Среда, 3 января 2007 г.
Сделал передачу позиции в движок посредством протокола фен, что является составной частью уки. Конечно, это большой шаг вперед, потому что позволяет полностью развязать внутреннюю реализацию движка. Опять интересный пример, как трехдневная работа вообще незаметна для пользователя. Конечно, потом изменения накопятся и это станет явным, например, когда станет возможным подключать внешние движки. Но это только начало. Дальше надо добиться перехода на полную поддержку уки. Интересно, что согласно этого протокола оболочке безразлично, кто с ней играет – человек или движок, она так же должна принимать и обрабатывать ходы. И это правильно, ведь не известно, насколько вредный и глючный попадется движок.
И так выход оболочки и вход движка полностью соответствуют протоколу уки. Теперь надо так же сделать и обратный поток. Все сделано! Теперь движок. Весь вывод и ввод ведет полностью в рамках протокола уки. Но обмен идет не посредством консольных потоков, а посредством строковых переменных. Теперь надо попробовать пустить взаимодействие посредством потоков. Вот тогда можно будет сказать о полной готовности, подкличать внешние движки. А вот что делать со своим движком, я не знаю. Если на джаве, в принципе, нельзя состряпать экзешник, тогда, видимо, придется переписывать его на си. Прога консольная, так что особых проблем я не вижу, но все-таки это же надо будет все переписать! Да и вообще – джава мне нравиться, а си не очень.
_______________________________________________________________________________________________
Четверг, 4 января 2007 г.
Итак, сдвиг произошел принципиальный. Благодаря интерфейсу уки мы развязали реализации оболочки и движка. Теперь они совершенно независимы! Теперь попытаемся подключить внешний движок, а именно тогу.
_______________________________________________________________________________________________
Пятница, 5 января 2007 г.
Тогу я подключил. Хотя система иногда повисает, но это из-за недоработки графической оболочки. Например, она позволяет ходить, когда король под шахом, и конечно от такой наглости Тога сразу затыкается. Но это все не существенно. Гораздо хуже то, что я не могу в джаве сделать екзешник, а значит не смогу подключить свой движок к внешней базе. Но и зачем тогда вообще нужна поддержка уки? Самое же главное то, что такой движок совершенно бесперспективен. Обязательным условием является интеграция его в стандартные базы. И так дальнейшее развитие движка на джаве считаю бесперспективным. Надо переходить на другой язык. Это либо Си, либо Дельфи, либо Бейсик.
На всех трех я довольно много писал.