Генератор списка ходов

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

Генератор избыточных ходов.
Данные:

// список возможных ходов 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".

Очевидно, что при таком методе, т.е. при передаче списка ходов из генератора в реализатор, переход на битбоард, видимо, либо вообще не даст прироста, либо даст очень маленький, а возможно вообще будет не прирост, а замедление из-за многочисленных извлечений по маске.

Ход короля мы обязаны проверять на шах. Значит, совершенно необходим детектор шахов.