|
||
СПИСКИ ХОДОВ В каждом узле мы генерируем список возможных ходов. Допустим, количество ходов в позиции 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; } |