|
||
Реализуем ходы вперед Вся информация, нужная для реализации хода, находится в целой переменной, которая входит в структуру 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; |