Реализатор ходов

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

Реализатор ходов.

Реализатор состоит из двух частей - прямой ход и возврат хода. Мы делаем ход, а потом возвращаем ход.

Номер хода по списку, список возможных ходов, позиция, список реальных ходов:
Onward_moves_816(int i,T_list_possible_moves * list_possible_moves,T_board_list_816 * board_list_816)
Принимаем список возможных ходов; номер хода в этом списке и позицию, в которой нужно сделать ход.

В реализаторе основой является обработка информации из описателя типа хода:
является ли ход ходом - 0, взятием - 1, взятием на проходе - 2, рокировкой - 3, превращением - 4, превращением с взятием - 5.

Прямой ход.

При любом ходе мы запоминаем флаг взятия на проходе, а потом запрещаем взятие. И это понятно, ведь берем либо сейчас, либо никогда.
В списке возможных ходов пришлось даже сделать поле:
list_possible_moves->return_taking_passage

-----------------------------------------------------
Обычный ход - 0.
Стираем фигуру на старом месте и рисуем на новом.

Особые случаи:
- если пешку двинули на два поля, то отмечаем битое поле и разрешение на взятие на проходе следующим ходом;
- если двинули короля, то запоминаем флаг и запрещаем его рокировку;
- если двинули ладью, то запоминаем флаг и запрещаем рокировку с участием этой ладьи.

-----------------------------------------------------
Взятие - 1.
С нового места фигуру заносим в "list_possible_moves->name_taking_figure[i]".
Если съели ладью, то помечаем флаг рокировки в доске и списке.
Стираем фигуру на старом месте рисуем на новом.

-----------------------------------------------------
Взятие на проходе - 2.
Стираем фигуру на старом месте и рисуем на новом.
Стираем проскочившую пешку.

-----------------------------------------------------
Рокировка - 3.
Рисуем короля и ладью на новом месте и стираем на старом.
Помечаем флаг рокировки в доске и списке.

-----------------------------------------------------
Превращение пешки - 4.
Стираем пешку на старом месте на новом рисуем ферзя.

-----------------------------------------------------
Превращение пешки с взятием - 5.
С нового места фигуру заносим в "list_possible_moves->name_taking_figure[i]".
Если съели ладью, то помечаем флаг рокировки в доске и списке.
Стираем пешку на старом месте, на новом рисуем ферзя.

-----------------------------------------------------

Вывод тестовой информации по блоку ходов в этом модуле не производиться. Тестируем их в модуле перебора.
___________________________________________________________________________________
Модульная реализация генератора и реализатора ходов.

Генератор создает всевозможные ходы из данной позиции, причем, в списке указывается, что за фигура ходит, откуда и куда, и тип хода. Третье поле нужно хотя бы для передачи того, во что превращается пешка. Так что, запись типа хода оправдана. И еще она нужна для сортировки взятий до ходов.
Итак, принципиально нужно генерить все ходы и описывать тип хода.

В модуле Rules_816 находится функция:
// 0 - нет фигуры, 1 - пешка, 2 - ладья, 3 - конь, 4 - слон, 5 - ферзь, 6 - король.
// аргументы :"name-имя фигуры,n-координата фигуры,board_816-доска,list_possible_moves" - список возможных ходов.
"void Rules_816(int name,int n,T_board_list_816 board_list_816,T_list_possible_moves * list_possible_moves)" - в ней мы рассчитываем возможные ходы для одной фигуры.

В результате выдается список возможных ходов.

В модуле Possible_moves находится функция:
"void Generator_possible_moves(T_list_possible_moves * list_possible_moves,T_board_list_816 board_list_816)" - это генератор всевозможных ходов из данной позиции.

В результате его работы выдается список всевозможных ходов из данной позиции.
Благодаря этому мы разделяем генератор ходов и реализатор ходов. Причем, при альфа-бета отсечении получается, что мы генерируем огромное количество ходов, которые никогда не используем. Обосновать данный прием можно, только если мы используем сортировку с нахождением всех взятий. Так как взятия с большой вероятностью вызывают отсечение, то данный прием должен компенсировать недостатки полной генерации списка. Если же это будет не так - придется переделывать.

В модуле Move_816 находятся функции:
номер хода по списку, список возможных ходов, позиция, список реальных ходов -
"void Onward_moves_816(int i,T_list_possible_moves * list_possible_moves,T_board_list_816 * board_list_816)"
и
"void Backs_moves_816(int i,T_list_possible_moves list_possible_moves,T_board_list_816 * board_list_816)".

Реализатор состоит из двух частей - это прямой ход и возврат хода. Мы делаем ход, а потом возвращаем ход.
В результате работы мы получаем новую позицию либо возвращаемся на шаг назад.