Exemplo n.º 1
0
char *PrMove(const int move) {

	static char MvStr[6];

	int ff = FilesBrd[FROMSQ(move)];
	int rf = RanksBrd[FROMSQ(move)];
	int ft = FilesBrd[TOSQ(move)];
	int rt = RanksBrd[TOSQ(move)];

	int promoted = PROMOTED(move);

	if (promoted) {
		char pchar = 'q';
		if (IsKn(promoted)) {
			pchar = 'n';
		}
		else if (IsRQ(promoted) && !IsBQ(promoted))  {
			pchar = 'r';
		}
		else if (!IsRQ(promoted) && IsBQ(promoted))  {
			pchar = 'b';
		}
		sprintf(MvStr, "%c%c%c%c%c", ('a' + ff), ('1' + rf), ('a' + ft), ('1' + rt), pchar);
	}
	else {
		sprintf(MvStr, "%c%c%c%c", ('a' + ff), ('1' + rf), ('a' + ft), ('1' + rt));
	}

	return MvStr;
}
Exemplo n.º 2
0
int ParseMove(char *ptrChar, CHESS_BOARD *pos) {

	ASSERT(CheckBoard(pos));

	if (ptrChar[1] > '8' || ptrChar[1] < '1') return NOMOVE;
	if (ptrChar[3] > '8' || ptrChar[3] < '1') return NOMOVE;
	if (ptrChar[0] > 'h' || ptrChar[0] < 'a') return NOMOVE;
	if (ptrChar[2] > 'h' || ptrChar[2] < 'a') return NOMOVE;

	int from = FR2SQ(ptrChar[0] - 'a', ptrChar[1] - '1');
	int to = FR2SQ(ptrChar[2] - 'a', ptrChar[3] - '1');

	ASSERT(SqOnBoard(from) && SqOnBoard(to));

	MOVELIST list[1];
	GenerateAllMoves(pos, list);
	int MoveNum = 0;
	int Move = 0;
	int PromPce = EMPTY;

	for (MoveNum = 0; MoveNum < list->count; ++MoveNum) {
		Move = list->moves[MoveNum].move;
		if (FROMSQ(Move) == from && TOSQ(Move) == to) {
			PromPce = PROMOTED(Move);
			if (PromPce != EMPTY) {
				if (IsRQ(PromPce) && !IsBQ(PromPce) && ptrChar[4] == 'r') {
					return Move;
				}
				else if (!IsRQ(PromPce) && IsBQ(PromPce) && ptrChar[4] == 'b') {
					return Move;
				}
				else if (IsRQ(PromPce) && IsBQ(PromPce) && ptrChar[4] == 'q') {
					return Move;
				}
				else if (IsKn(PromPce) && ptrChar[4] == 'n') {
					return Move;
				}
				continue;
			}
			return Move;
		}
	}

	return NOMOVE;
}
Exemplo n.º 3
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;
}