Move down

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


Реализуем ходы назад

Используем структуру list_surplus_moves->move[i]
и структуру undo
struct T_undo {
   // флаг возврата взятия на проходе 1/0
   int return_taking_passage;
   // х координата битого поля (конвертируем из буквы)
   int taking_passage_x;
   // у координата битого поля
   int taking_passage_y;
   // рокировка белых в длинную сторону 1/0
   int return_castling_Q;
   // рокировка белых в короткую сторону 1/0
   int return_castling_K;
   // флаг рокировки черных в длинную сторону
   int return_castling_q;
   // флаг рокировки черных в короткую сторону
   int return_castling_k;

};

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

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


Простой ход

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

//стираем фигуру на старом месте-----------------
// все белые фигуры
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];
// переносим имя фигуры и зануляем по старой координате
bitboard->white_name_from_coord[i_p] = bitboard->white_name_from_coord[f_p];
bitboard->white_name_from_coord[f_p] = 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->all_piece = bitboard->all_white_piece | bitboard->all_black_piece;

Взятие

// король - флаг рокировки
if(bitboard->white_name_from_coord[f_p] == 6){
    // запоминаем флаги рокировок
    bitboard->castling_K = undo->return_castling_K;
    bitboard->castling_Q = undo->return_castling_Q;

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

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

//стираем фигуру на старом месте-----------------
// стираем фигуру из списка всех белых фигур
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];

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

// востанавливаем имя взятой фигуры
bitboard->black_name_from_coord[f_p] = t_f;

//------------------------------------------------------------------------------
// взятие белыми
Так как при ходе вперед
// к оценке мы прибавляли значение взятой фигуры
// потому что в начале баланс получен +белые и –черные
то сейчас все наоборот
bitboard->eval = bitboard->eval - kod[t_f];
//------------------------------------------------------------------------------

//рисуем фигуру на новом месте------------------
// в маске все белые фигуры
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->all_piece = bitboard->all_white_piece | bitboard->all_black_piece;


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

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

//-------------------------------------------------------
//стираем фигуру на старом месте-----------------
// стираем фигуру из списка всех белых фигур
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];

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

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

// востанавливаем имя взятой фигуры
bitboard->black_name_from_coord[f_p] = t_f;

//рисуем фигуру на новом месте------------------
// в маске все белые фигуры
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->all_piece = bitboard->all_white_piece | bitboard->all_black_piece;