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; }
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; }
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; }