|
||
Реализуем ходы назад Используем структуру 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; |