|
||
Реализатор ходов. Реализатор состоит из двух частей - прямой ход и возврат хода. Мы делаем ход, а потом возвращаем ход. Номер хода по списку, список возможных ходов, позиция, список реальных ходов: 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)" - в ней мы рассчитываем возможные ходы для одной фигуры. В результате выдается
список возможных ходов. В результате его работы
выдается список всевозможных ходов из
данной позиции. |