Пример #1
0
void UpdateListsMaterial(S_BOARD *pos) {

	int piece,sq,index,colour;

	for(index = 0; index < BRD_SQ_NUM; ++index) {
		sq = index;
		piece = pos->pieces[index];
		ASSERT(PceValidEmptyOffbrd(piece));
		if(piece!=OFFBOARD && piece!= EMPTY) {
			colour = PieceCol[piece];
			ASSERT(SideValid(colour));

		    if( PieceBig[piece] == TRUE) pos->bigPce[colour]++;
		    if( PieceMin[piece] == TRUE) pos->minPce[colour]++;
		    if( PieceMaj[piece] == TRUE) pos->majPce[colour]++;

			pos->material[colour] += PieceVal[piece];

			ASSERT(pos->pceNum[piece] < 10 && pos->pceNum[piece] >= 0);

			pos->pList[piece][pos->pceNum[piece]] = sq;
			pos->pceNum[piece]++;


			if(piece==wK) pos->KingSq[WHITE] = sq;
			if(piece==bK) pos->KingSq[BLACK] = sq;

			if(piece==wP) {
				SETBIT(pos->pawns[WHITE],SQ64(sq));
				SETBIT(pos->pawns[BOTH],SQ64(sq));
			} else if(piece==bP) {
				SETBIT(pos->pawns[BLACK],SQ64(sq));
				SETBIT(pos->pawns[BOTH],SQ64(sq));
			}
		}
	}
}
Пример #2
0
int SqAttacked(const int sq, const int side, const S_BOARD *pos) {
	int piece;
	int tmpSQ;
	int dir;
	int i;

	ASSERT(SqOnBoard(sq));
	ASSERT(SideValid(side));
	ASSERT(checkBoard(pos));

	//pawn attacks
	if(side == WHITE) {
		if(pos->pieces[sq-11] == wP || pos->pieces[sq-9] == wP)  return TRUE;
	} else { //BLACK
		if(pos->pieces[sq+11] == bP || pos->pieces[sq+9] == bP) return TRUE;
	}

	//knight attacks
	for(i = 0; i < 8; i++) {
		piece = pos->pieces[ sq + KnDir[i] ];
		if(piece != OFFBOARD && IsKn(piece) && PieceColor[piece]==side) return TRUE;
	}

	
	//king attacks
	for(i = 0; i < 8; i++) {
		piece = pos->pieces[ sq + KiDir[i] ];
		if(piece != OFFBOARD && IsKi(piece) && PieceColor[piece]==side)  {
			return TRUE;
		}
	}

	//rook and Queen attacks
	for(i = 0; i < 4; i++) {
		dir = RkDir[i];
		tmpSQ = sq + dir;
		piece = pos->pieces[tmpSQ];

		while(piece != OFFBOARD) {
			if(piece != EMPTY) {
				if(piece != OFFBOARD && IsRQ(piece) && PieceColor[piece] == side) return TRUE;
				break;
			}

			tmpSQ += dir;
			piece = pos->pieces[tmpSQ];
		}
	}

	//bishop and queen attacks
	for(i = 0; i < 4; i++) {
		dir = BiDir[i];
		tmpSQ = sq + dir;
		piece = pos->pieces[tmpSQ];

		while(piece != OFFBOARD) {
			if(piece != EMPTY) {
				if(piece != OFFBOARD && IsBQ(piece) && PieceColor[piece] == side) return TRUE;
				break;
			}

			tmpSQ += dir;
			piece = pos->pieces[tmpSQ];
		}
	}

	return FALSE;
}