List representation

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


СПИСКИ ХОДОВ

В каждом узле мы генерируем список возможных ходов.
Допустим, количество ходов в позиции 255 и мы считаем на глубину 20 полуходов. Получается, что когда мы достигнем дна, у нас в оперативке будет храниться 255*20=5100 ходов.
С другой стороны нам нужно сортировать списки и желательно делать это быстрее.
Таким образом, желательно иметь максимально компактные списки.

Структура, реализующая список, имеет следующий вид

// список возможных ходов
struct T_list_surplus_moves {

int move[256];
/*
в целом числе массива move мы упаковали следующую информацию (используем 27 бит)
--3 бит-- --6 бит-- --6 бит-- --6 бит-- --6 бит--
ходящая фигура, куда ходим, откуда ходим, тип хода, взятая фигура


идем справа, т.е. с младшего бита
--6 бит--
взятая фигура

0 - нет фигуры
1 - пешка
2 - конь
3 - слон
4 - ладья
5 - ферзь
6 - король

запись move = тип фигуры
чтение move & 63 ( 63 это ...000111111)

--6 бит--
тип хода
0 - нет хода
1 – простой ход
2 – взятие
3 – длинная рокировка
4 – короткая рокировка
5 – взятие на проходе

12 - превращение в конь
13 - превращение в слон
14 - превращение в ладья
15 - превращение в ферзь

22 - взятие с превращением в конь
23 - взятие с превращением в слон
24 - взятие с превращением в ладья
25 - взятие с превращением в ферзь

запись move = move | (тип хода << 6)
чтение (move>>6) & 63

--6 бит--
откуда ходим (0 -63)
запись move = move | (откуда ходим << 12)
чтение (move>>12) & 63

--6 бит--
куда ходим (0 -63)
запись move = move | (куда ходим << 18)
чтение (move>>18) & 63

--3 бит--
ходящая фигура
0 - нет фигуры
1 - пешка
2 - конь
3 - слон
4 - ладья
5 - ферзь
6 - король
запись move = move | (куда ходим << 24)
чтение (move>>24) & 7 (7 это ...000111)
*/

// оценка используемая для сортировки ходов
int sorting_score[256];

// конец взятий в списке точнее первое не взятие
int end_captures;

// конец списка точнее первая пустая позиция
int end_list;

};//struct T_list_surplus_moves {


Заполняем списки в генераторе ходов в функциях вида:

// заполняем список ходов - взятия за белых
// две функции только из-за разного контроля списков (строки взятия)
static inline void list_capture_white(int name,int type_move,int & from,int & to,int & count,const struct T_Bitboard * bitboard,struct T_list_surplus_moves * list_surplus_moves){
int capture;// взятая фигура

#if KONTROL_B
   KONTROL_captures_W(bitboard,&from,&to,&count,name);
#endif//KONTROL_B

// взятая фигура
capture = bitboard->black_name_from_coord[to];

// записываем оценку взятия (mvv/lva в моем понимании) для последующей сортировки
list_surplus_moves->sorting_score[count] = capture - name;

// 6 бит
// записали имя взятой фигуры (1 - пешка 2 - конь 3 - слон 4 - ладья 5 - ферзь 6 - король)
list_surplus_moves->move[count] = capture

// 6 бит
// записали тип хода (0 - нет хода 1 – простой ход 2 – взятие 3 – длинная рокировка)
//4 – короткая рокировка 5 – взятие на проходе
//12 - превращение в конь, 13 - превращение в слон, 14 - превращение в ладья, 15 - превращение в ферзь
//22 - взятие с превращением в конь, 23 - взятие с превращением в слон, 24 - взятие с превращением в ладья
//25 - взятие с превращением в ферзь)
| (type_move << 6)

// 6 бит
// записали откуда ходим (0 -63)
| (from << 12)

// 6 бит
// записали куда ходим (0 -63)
| (to << 18)

// 3 бит
// ходящая фигура (0 - 6)
| (name << 24);

использую для тестирования
//-------------------------------------------------------------------------------
//cout << "list_surplus_moves->move[count]= "<< list_surplus_moves->move[count] << "\n";
//
//cout << "bitboard->black_name_from_coord[to]= "<< bitboard->black_name_from_coord[to] << "\n";
//cout << "bitboard->black_name_from_coord[to]= "<< ( list_surplus_moves->move[p] & 63) << "\n";
//
//cout << "type_move= "<< type_move << "\n";
//cout << "type_move= "<< ((list_surplus_moves->move[count]>>6)& 63) << "\n";
//
//cout << "from= "<< from << "\n";
//cout << "from= "<< ((list_surplus_moves->move[count]>>12)& 63) << "\n";
//
//cout << "to= "<< to << "\n";
//cout << "to= "<< ((list_surplus_moves->move[count]>>18)& 63) << "\n";
//
//cout << "name= "<< name << "\n";
//cout << "name= "<< ((list_surplus_moves->move[count]>>24)& 7) << "\n";
//-------------------------------------------------------------------------------

count = count + 1;

}