Move up

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


Реализуем ходы вперед

Вся информация, нужная для реализации хода, находится в целой переменной, которая входит в структуру list_surplus_moves->move[i]
Именно в переменой move в сжатом виде находится нужная информация.

Мы используем следующие величины
исходная позиция фигуры ((list_surplus_moves->move[i]>>12) & 63)
финальная позиция фигуры ((list_surplus_moves->move[i]>>18) & 63)
взятая фигура (list_surplus_moves->move[i] & 63)
тип хода ((list_surplus_moves->move[i]>>6) & 63)

Используется кодировка типа хода следующего вида
0 - нет хода
1 – простой ход
2 – взятие
3 – длинная рокировка
4 – короткая рокировка
5 – взятие на проходе

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

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

Таким образом, каждый тип хода обрабатывается в своей ветке (оператор switch)
Опишу только основные случаи. Все остальные делаются подобным образом.
Еще надо сказать, что для возможности возвращения хода мы заполняем структуру undo, которую опишу в разделе о возврате ходов.

Перед любым ходом
// запоминаем флаг взятия на проходе
undo->return_taking_passage = bitboard->taking_passage_yes;

// запрещаем взятие на проходе
bitboard->taking_passage_yes = 0;


Простой ход

//стираем фигуру на старом месте---------------------------------------------
//стираем фигуру из маски всех белых фигур
bitboard->all_white_piece = bitboard->all_white_piece ^ move_masks_m[i_p];

//стираем фигуру из битового списка фигур
bitboard->white_piece[bitboard->white_name_from_coord[i_p]] =
bitboard->white_piece[bitboard->white_name_from_coord[i_p]] ^ move_masks_m[i_p];

//переносим имя фигуры в новую координату и зануляем его по старой координате
bitboard->white_name_from_coord[f_p] = bitboard->white_name_from_coord[i_p];
bitboard->white_name_from_coord[i_p] = 0;
//---------------------------------------------------------------------------

//рисуем фигуру на новом месте------------------
// рисуем фигуру в маске всех белых фигур
bitboard->all_white_piece = bitboard->all_white_piece ^ move_masks_m[f_p];
// рисуем фигуру в битовом списке фигур
bitboard->white_piece[bitboard->white_name_from_coord[f_p]] =
bitboard->white_piece[bitboard->white_name_from_coord[f_p]] ^ move_masks_m[f_p];

//--------------------------------------------------------------------------------
// особо отмечаем случаи, влияющие на рокировку и взятие на проходе
// мы тут смотрим, какой фигурой ходили и если это пешка, то проверяем не нужно
// ли отметить взятие на проходе, если это король, то отменяем его рокировки
// а если ладья, то отменяем рокировку с ней
//-------------------------------------------------------
// пешка - флаг взятия на проходе
if(bitboard->white_name_from_coord[f_p] == 1){
   if(f_p - i_p == 16){
       undo->taking_passage_x = bitboard->taking_passage_x;
       undo->taking_passage_y = bitboard->taking_passage_y;
       bitboard->taking_passage_yes =1;
       bitboard->taking_passage_x =(i_p + 8) % 8;
       bitboard->taking_passage_y =(i_p + 8) / 8;
    }
//-------------------------------------------------------
// король - флаг рокировки
} else if(bitboard->white_name_from_coord[f_p] == 6){
      // запоминаем флаги рокировок
     undo->return_castling_K = bitboard->castling_K;
     undo->return_castling_Q = bitboard->castling_Q;
     bitboard->castling_K = 0;
     bitboard->castling_Q = 0;
//-------------------------------------------------------
// ладья - флаг рокировки
} else if(bitboard->white_name_from_coord[f_p] == 4){
    if(i_p == 0){
         undo->return_castling_Q = bitboard->castling_Q;
         bitboard->castling_Q = 0;
    }
    if(i_p == 7){
        undo->return_castling_K = bitboard->castling_K;
        bitboard->castling_K = 0;
   }
}
// корректируем маску всех фигур
bitboard->all_piece = bitboard->all_white_piece | bitboard->all_black_piece;

Взятие

// убираем фигуру из маски всех белых фигур
bitboard->all_white_piece = bitboard->all_white_piece ^ move_masks_m[i_p];
// убираем взятую фигуру из маски всех черных фигур
bitboard->all_black_piece = bitboard->all_black_piece ^ move_masks_m[f_p];

// убираем фигуру из битового списка фигур
bitboard->white_piece[bitboard->white_name_from_coord[i_p]] =
bitboard->white_piece[bitboard->white_name_from_coord[i_p]] ^ move_masks_m[i_p];
// кроме того убираем взятую фигуру из битового списка фигур
bitboard->black_piece[bitboard->black_name_from_coord[f_p]] =
bitboard->black_piece[bitboard->black_name_from_coord[f_p]] ^ move_masks_m[f_p];

//------------------------------------------------------------------------------
Пошагово вычисляем оценку материала
// взятие белыми
// к оценке мы прибавляем значение взятой фигуры
// потому что в начале баланс получен +белые и -черные
bitboard->eval = bitboard->eval + kod[bitboard->black_name_from_coord[f_p]];
//------------------------------------------------------------------------------

// зануляем взятую фигуру
bitboard->black_name_from_coord[f_p] = 0;
// переносим имя фигуры и зануляем по старой координате
bitboard->white_name_from_coord[f_p] = bitboard->white_name_from_coord[i_p];
bitboard->white_name_from_coord[i_p] = 0;

//рисуем фигуру на новом месте------------------
// рисуем берущую фигуру в маске всех белых фигур
bitboard->all_white_piece = bitboard->all_white_piece ^ move_masks_m[f_p];
// рисуем берущую фигуру в битовом списке фигур
bitboard->white_piece[bitboard->white_name_from_coord[f_p]] =
bitboard->white_piece[bitboard->white_name_from_coord[f_p]] ^ move_masks_m[f_p];

// король - флаг рокировки
if(bitboard->white_name_from_coord[f_p] == 6){
    // запоминаем флаги рокировок
    undo->return_castling_K = bitboard->castling_K;
    undo->return_castling_Q = bitboard->castling_Q;
    bitboard->castling_K = 0;
    bitboard->castling_Q = 0;
//-------------------------------------------------------
// смотрим, а не ходили ли мы ладьей и если да то рокировки с ней отменяем
} else if(bitboard->white_name_from_coord[f_p] == 4){
    if(i_p == 0){
         undo->return_castling_Q = bitboard->castling_Q;
         bitboard->castling_Q = 0;
    }
    if(i_p == 7){
        undo->return_castling_K = bitboard->castling_K;
        bitboard->castling_K = 0;
    }
}

// если сьедена ладья, то запрещаем рокировки с ее участием
if(t_f == 4){
    if(f_p == 56){
         undo->return_castling_q = bitboard->castling_q;
         bitboard->castling_q =0;
    }
    if(f_p == 63){
         undo->return_castling_k = bitboard->castling_k;
         bitboard->castling_k = 0;
    }
}

bitboard->all_piece = bitboard->all_white_piece | bitboard->all_black_piece;


Превращение пешки с взятием

// убираем фигуру из маски всех белых фигур
bitboard->all_white_piece = bitboard->all_white_piece ^ move_masks_m[i_p];
// убираем взятую фигуру из маски всех черных фигур
bitboard->all_black_piece = bitboard->all_black_piece ^ move_masks_m[f_p];

// убираем фигуру из битового списка фигур
bitboard->white_piece[bitboard->white_name_from_coord[i_p]] =
bitboard->white_piece[bitboard->white_name_from_coord[i_p]] ^ move_masks_m[i_p];
// кроме того убираем взятую фигуру из битового списка фигур
bitboard->black_piece[bitboard->black_name_from_coord[f_p]] =
bitboard->black_piece[bitboard->black_name_from_coord[f_p]] ^ move_masks_m[f_p];

//------------------------------------------------------------------------------
// взятие с превращением белыми
// к оценке мы прибавляем значение фигуры превращения и отнимаем пешку
// к оценке мы прибавляем значение взятой фигуры
// потому что в начале баланс получен +белые и -черные
bitboard->eval = bitboard->eval + QUEEN - PAWN + kod[bitboard->black_name_from_coord[f_p]];
//------------------------------------------------------------------------------

// зануляем взятую фигуру
bitboard->black_name_from_coord[f_p] = 0;
// переносим имя фигуры и зануляем по старой координате
bitboard->white_name_from_coord[f_p] = 5;
bitboard->white_name_from_coord[i_p] = 0;

//рисуем фигуру на новом месте------------------
// рисуем берущую фигуру в маске всех белых фигур
bitboard->all_white_piece = bitboard->all_white_piece ^ move_masks_m[f_p];
// рисуем берущую фигуру в битовом списке фигур
bitboard->white_piece[bitboard->white_name_from_coord[f_p]] =
bitboard->white_piece[bitboard->white_name_from_coord[f_p]] ^ move_masks_m[f_p];

// если сьедена ладья, то запрещаем рокировки с ее участием
if(t_f == 4){
    if(f_p == 56){
        undo->return_castling_q = bitboard->castling_q;
        bitboard->castling_q = 0;
    }
    if(f_p == 63){
        undo->return_castling_k = bitboard->castling_k;
        bitboard->castling_k = 0;
    }
}

bitboard->all_piece = bitboard->all_white_piece | bitboard->all_black_piece;