void SEARCHER::do_move(const int& move) {

	int from = m_from(move),to = m_to(move),sq;

	/*remove captured piece*/
	if(m_capture(move)) {
		if(is_ep(move)) {
			sq = to - pawn_dir[player];
		} else {
			sq = to;
		}
		pcRemove(m_capture(move),sq);
		board[sq] = empty;
	}

	/*move piece*/
	if(m_promote(move)) {
		board[to] = m_promote(move);
		board[from] = empty;
		pcAdd(m_promote(move),to);
		pcRemove(COMBINE(player,pawn),from);
	} else {
		board[to] = board[from];
		board[from] = empty;
		pcSwap(from,to);
	}

	/*move castle*/
	if(is_castle(move)) {
        int fromc,toc;
		if(to > from) {
           fromc = to + RR;
		   toc = to + LL;
		} else {
           fromc = to + 2*LL;
		   toc = to + RR;
		}
		board[toc] = board[fromc];
		board[fromc] = empty;
		pcSwap(fromc,toc);
	} 

	/*update current state*/
	epsquare = 0;
	fifty++;
	if(DECOMB(player,m_piece(move)) == pawn) {
		fifty = 0;
	    if(to - from == (2 * pawn_dir[player])) {
            epsquare = ((to + from) >> 1);
		}
Beispiel #2
0
/*init data*/
void SEARCHER::init_data() {
    register int i,sq,pic;

    ply = 0;
    pstack = stack + 0;

    for(i = wking;i < elephant;i++) {
       plist[i] = 0;
    }

    for(sq = A1;sq <= H8;sq++) {
        if(!(sq & 0x88)) { 
            list[sq]->sq = sq;
            list[sq]->prev = 0;
            list[sq]->next = 0;
            pic = board[sq];
            if(pic != empty) {
                pcAdd(pic,sq);
            }
        }
    }
}