|
||
Генератор избыточных ходов. Данные: // список возможных ходов 1501 struct T_list_possible_moves { // имя фигуры 1- пешка; 2- ладья; 3- конь; 4- слон; 5- ферзь; 6- король int name_figure[300]; // начальное положение фигуры(откуда фигура ходит) int initial_position[300]; // конечное положение фигуры(куда фигура ходит) int final_position[300]; // является ли ход ходом - 0, взятием - 1, взятием на проходе - 2, рокировкой - 3, // превращением - 4, превращением с взятием - 5 int description_move[300]; // имя взятой фигуры: 1- пешка; 2- ладья; 3- конь; 4- слон; 5- ферзь; 6- король int name_taking_figure[300]; // флаг возврата взятия на проходе int return_taking_passage; // флаг рокировки белых в длинную сторону int return_castling_Q; // флаг рокировки белых в короткую сторону int return_castling_K; // флаг рокировки черных в длинную сторону int return_castling_q; // флаг рокировки черных в короткую сторону int return_castling_k; // количество ходов в списке int amount_moves; }; // полная доска реализующая принцип 8 на 16 struct T_board_list_816 { // цвет хода int colour_move; // содержит имена фигур: 0 - нет фигуры, 1 - пешка, 2 - ладья, 3 - конь, 4 - слон, 5 - ферзь, 6 - король, 9 - выход за пределы доски int name_figure_816[129]; // содержит цвет фигур: 1 - белые, 2 - черные, 3 - выход за пределы доски int colour_figure_816[129]; // разрешение взятия на проходе 1/0 int taking_passage_yes; // х координата битого поля (конвертируем из буквы) int taking_passage_x; // у координата битого поля (у нас инверсная относительно нормальной доски) int taking_passage_y; // рокировка белых в длинную сторону int castling_Q; // рокировка белых в короткую сторону int castling_K; // рокировка черных в длинную сторону int castling_q; // рокировка черных в короткую сторону int castling_k; }; Доска представлена следующим массивом: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 8 на 16 = 128 x = 0..7 n&15 или n/16 y = 0..7 n>>4 или n%16 n = y*16 + x Generator_possible_moves(T_list_possible_moves * list_possible_moves,T_board_list_816 board_list_816) Генератор получает текущую позицию и выдает список возможных ходов. В генераторе просто бежим по доске и вызываем блок правил для фигур ходящей стороны. Вся работа проводится в блоке правил: Rules_816(int name,int n,T_board_list_816 board_list_816,T_list_possible_moves * list_possible_moves) Блок правил получает имя фигуры, ее координату, текущую позицию и выдает список возможных ходов для данной фигуры. В блоке правил в список возможных ходов записываем: - имя фигуры; - начальное положение фигуры; - конечное положение фигуры; - описатель типа хода; - количество ходов. Причем, имя фигуры не используется в реализаторе, оно только для тестового вывода. В описателе типа хода записываем: является ли ход ходом - 0, взятием - 1, взятием на проходе - 2, рокировкой - 3, превращением - 4, превращением с взятием - 5. Может тут надо будет что то уточнить? Дальше посмотрим. Ладья, конь, слон, ферзь - генерируют либо просто ход, либо взятие. Используется способ лучей. Мы просто бежим по массиву цвета в нужном направлении, пока не натыкаемся на фигуру, если она чужая мы ее бьем. Одновременно заполняем списки возможных ходов. Вывод тестовой информации по блоку правил производиться в файл "f_Test_Rules_816.txt". Очевидно, что при таком методе, т.е. при передаче списка ходов из генератора в реализатор, переход на битбоард, видимо, либо вообще не даст прироста, либо даст очень маленький, а возможно вообще будет не прирост, а замедление из-за многочисленных извлечений по маске. Ход короля мы обязаны проверять на шах. Значит, совершенно необходим детектор шахов. |