int QPosition::FindBPawnsMoves(void){ QBitBoard bpmov(BlackPawnMovement(bpawns())); const int nbp = bpmov.PopCount(); for(int i=0; i<nbp; i++){ const int loc = bpmov.PopFirst(); const U64& to = Piece[loc]; const int cpiece = CheckWPiece(to); if(cpiece == -1){ const U64 from = nortOne(to);// forward movements if(from & bpawns()) moves.push_back(QMove(from,to,0,true,cpiece)); else moves.push_back(QMove(nortOne(from),to,0,true,cpiece)); } else{ const U64 fromNoEa = noEaOne(to); if(fromNoEa & bpawns()){ moves.push_back(QMove(fromNoEa,to,0,true,cpiece)); cap_moves.push_back(moves.size()-1); } const U64 fromNoWe = noWeOne(to); if(fromNoWe & bpawns()){ moves.push_back(QMove(fromNoWe,to,0,true,cpiece)); cap_moves.push_back(moves.size()-1); } } } return moves.size(); }
int QPosition::FindWPawnsMoves(void){ QBitBoard wpmov(WhitePawnMovement(wpawns())); const int nwp = wpmov.PopCount(); for(int i=0; i<nwp; i++){ const int loc = wpmov.PopFirst(); const U64& to = Piece[loc]; const int cpiece = CheckBPiece(to); if(cpiece == -1){ const U64 from = soutOne(to);// forward movements if(from & wpawns()) moves.push_back(QMove(from,to,0,false,cpiece)); else moves.push_back(QMove(soutOne(from),to,0,false,cpiece)); } else{ const U64 fromSoEa = soEaOne(to); if(fromSoEa & wpawns()){ moves.push_back(QMove(fromSoEa,to,0,false,cpiece)); cap_moves.push_back(moves.size()-1); } const U64 fromSoWe = soWeOne(to); if(fromSoWe & wpawns()){ moves.push_back(QMove(fromSoWe,to,0,false,cpiece)); cap_moves.push_back(moves.size()-1); } } } return moves.size(); }
int QPosition::FindKingMoves(void){ const U64& k = turnFlag ? bking() : wking(); const U64& occ = turnFlag ? boccupancy : woccupancy; QBitBoard kmov(KingMovement(k,occ)); const int nkmov = kmov.PopCount(); for(int j=0; j<nkmov; j++){ const int to_loc = kmov.PopFirst(); const int cpiece = turnFlag ? CheckWPiece(Piece[to_loc]) : CheckBPiece(Piece[to_loc]); moves.push_back(QMove(k,Piece[to_loc],5,turnFlag,cpiece)); if(cpiece != -1) cap_moves.push_back(moves.size()-1); } return moves.size(); }
void SPlotRect( IRect *irect ) { float xmin = XTRANS(irect->xmin); float ymin = YTRANS(irect->ymin); float xmax = XTRANS(irect->xmax); float ymax = YTRANS(irect->ymax); QMove( xmin , ymin ); QPlot( xmin , ymax ); QPlot( xmax , ymax ); QPlot( xmax , ymin ); QPlot( xmin , ymin ); }
int QPosition::FindQueenMoves(void){ QBitBoard q(turnFlag ? bqueens() : wqueens()); const int nq = q.PopCount(); for(int i=0; i<nq; i++){ const int from_loc = q.PopFirst(); const U64& occ = turnFlag ? boccupancy : woccupancy; QBitBoard qmov(RookMovement(Piece[from_loc],occ)); const int nqmov = qmov.PopCount(); for(int j=0; j<nqmov; j++){ const int to_loc = qmov.PopFirst(); const int cpiece = turnFlag ? CheckWPiece(Piece[to_loc]) : CheckBPiece(Piece[to_loc]); moves.push_back(QMove(Piece[from_loc],Piece[to_loc],4,turnFlag,cpiece)); if(cpiece != -1) cap_moves.push_back(moves.size()-1); } } return moves.size(); }
int QPosition::FindBishopMoves(void){ QBitBoard b(turnFlag ? bbishops() : wbishops()); const int nb = b.PopCount(); for(int i=0; i<nb; i++){ const int from_loc = b.PopFirst(); const U64& occ = turnFlag ? boccupancy : woccupancy; QBitBoard bmov(BishopMovement(Piece[from_loc],occ)); const int nbmov = bmov.PopCount(); for(int j=0; j<nbmov; j++){ const int to_loc = bmov.PopFirst(); const int cpiece = turnFlag ? CheckWPiece(Piece[to_loc]) : CheckBPiece(Piece[to_loc]); moves.push_back(QMove(Piece[from_loc],Piece[to_loc],2,turnFlag,cpiece)); if(cpiece != -1) cap_moves.push_back(moves.size()-1); } } return moves.size(); }
int QPosition::FindKnightMoves(void){ QBitBoard kn(turnFlag ? bknights() : wknights()); const int nkn = kn.PopCount(); for(int i=0; i<nkn; i++){ const int from_loc = kn.PopFirst(); const U64& occ = turnFlag ? boccupancy : woccupancy; QBitBoard knmov(KnightMovement(Piece[from_loc],occ)); const int nmov = knmov.PopCount(); for(int j=0; j<nmov; j++){ const int to_loc = knmov.PopFirst(); const int cpiece = turnFlag ? CheckWPiece(Piece[to_loc]) : CheckBPiece(Piece[to_loc]); moves.push_back(QMove(Piece[from_loc],Piece[to_loc],1,turnFlag,cpiece)); if(cpiece != -1) cap_moves.push_back(moves.size()-1); } } return moves.size(); }
void SMove( int x , int y ) { QMove( XTRANS(x) , YTRANS(y) ); }