@ -48,19 +48,83 @@ bool is_valid_position(int x, int y){
y < 8 & & y > = 0 ) ;
}
std : : vector < Position > get_possible_movers ( Position pn , std : : array < PieceType , 64 > board ) {
std : : vector < Position > pns = { Position : : A1 } ;
std : : unordered_set < Position > get_possible_movers ( Position pn , std : : array < PieceType , 64 > board ) {
std : : unordered_set < Position > pns = { Position : : A1 } ;
return pns ;
}
std : : vector < Position > get_possible_moves ( Position pn , std : : array < PieceType , 64 > board ) {
std : : vector < Position > pns = { Position : : A1 } ;
std : : unordered_set < Position > get_possible_moves ( Position pn , std : : array < PieceType , 64 > board ) {
std : : unordered_set < Position > pns = { Position : : A1 } ;
return pns ;
}
std : : vector < Position > get_all_moves ( Position pn , std : : array < PieceType , 64 > board ) {
void _push_if_valid_pos ( int x , int y , std : : unordered_set < Position > * pns ) {
if ( is_valid_position ( x , y ) ) {
pns - > insert ( pair_to_pos ( x , y ) ) ;
}
}
void _get_all_moves_rook ( int x , int y , std : : unordered_set < Position > * pns ) {
for ( int offset = 1 ; offset < 8 ; offset + + ) {
int xpoff = x + offset ;
int ypoff = y + offset ;
int xnoff = x - offset ;
int ynoff = y - offset ;
_push_if_valid_pos ( xpoff , y , pns ) ;
_push_if_valid_pos ( x , ypoff , pns ) ;
_push_if_valid_pos ( xnoff , y , pns ) ;
_push_if_valid_pos ( x , ynoff , pns ) ;
}
}
void _get_all_moves_bishop ( int x , int y , std : : unordered_set < Position > * pns ) {
for ( int offset = 1 ; offset < 8 ; offset + + ) {
int xpoff = x + offset ;
int ypoff = y + offset ;
int xnoff = x - offset ;
int ynoff = y - offset ;
_push_if_valid_pos ( xpoff , ypoff , pns ) ;
_push_if_valid_pos ( xpoff , ynoff , pns ) ;
_push_if_valid_pos ( xnoff , ypoff , pns ) ;
_push_if_valid_pos ( xnoff , ynoff , pns ) ;
}
}
void _get_all_moves_knight ( int x , int y , std : : unordered_set < Position > * pns ) {
for ( int xo = 1 ; xo < = 2 ; xo + + ) {
int yo = ( xo = = 1 ) ? 2 : 1 ;
_push_if_valid_pos ( x + xo , y + yo , pns ) ;
_push_if_valid_pos ( x - xo , y + yo , pns ) ;
_push_if_valid_pos ( x + xo , y - yo , pns ) ;
_push_if_valid_pos ( x - xo , y - yo , pns ) ;
}
}
void _get_all_moves_king ( int x , int y , std : : unordered_set < Position > * pns ) {
_push_if_valid_pos ( x + 1 , y + 1 , pns ) ;
_push_if_valid_pos ( x + 1 , y - 1 , pns ) ;
_push_if_valid_pos ( x - 1 , y + 1 , pns ) ;
_push_if_valid_pos ( x - 1 , y - 1 , pns ) ;
_push_if_valid_pos ( x , y + 1 , pns ) ;
_push_if_valid_pos ( x , y - 1 , pns ) ;
_push_if_valid_pos ( x + 1 , y , pns ) ;
_push_if_valid_pos ( x - 1 , y , pns ) ;
}
void _get_all_moves_w_pawn ( int x , int y , std : : unordered_set < Position > * pns ) {
_push_if_valid_pos ( x , y + 1 , pns ) ;
_push_if_valid_pos ( x , y + 2 , pns ) ;
_push_if_valid_pos ( x + 1 , y + 1 , pns ) ;
_push_if_valid_pos ( x - 1 , y + 1 , pns ) ;
}
void _get_all_moves_b_pawn ( int x , int y , std : : unordered_set < Position > * pns ) {
_push_if_valid_pos ( x , y - 1 , pns ) ;
_push_if_valid_pos ( x , y - 2 , pns ) ;
_push_if_valid_pos ( x - 1 , y - 1 , pns ) ;
_push_if_valid_pos ( x + 1 , y - 1 , pns ) ;
}
std : : unordered_set < Position > get_all_moves ( Position pn , std : : array < PieceType , 64 > board ) {
PieceType pt = board [ pn ] ;
std : : vector < Position > pns ;
std : : unordered_set < Position > pns ;
int x = pos_to_pair ( pn ) . first ;
int y = pos_to_pair ( pn ) . second ;
std : : vector < int > kg_dx = { - 1 , 0 , 1 , - 1 , 0 , 1 , - 1 , 0 , 1 } ;
@ -70,75 +134,49 @@ std::vector<Position> get_all_moves(Position pn, std::array<PieceType, 64> board
std : : vector < int > Wpa_dx = { 0 , 0 , - 1 , 0 , 1 , 0 } ;
std : : vector < int > Wpa_dy = { 2 , 1 , 0 , 0 , 0 , - 1 } ;
switch ( pt ) {
case PieceType : : B_QUEEN :
case PieceType : : W_QUEEN :
_get_all_moves_rook ( x , y , & pns ) ;
_get_all_moves_bishop ( x , y , & pns ) ;
break ;
case PieceType : : B_ROOK :
case PieceType : : W_ROOK :
for ( int j = 7 ; j > = 0 ; j - - ) {
if ( j ! = y ) {
pns . push_back ( pair_to_pos ( std : : make_pair ( x , j ) ) ) ;
}
for ( int i = 0 ; i < 8 ; i + + ) {
if ( j = = y ) {
pns . push_back ( pair_to_pos ( std : : make_pair ( i , y ) ) ) ;
}
}
}
break ;
_get_all_moves_rook ( x , y , & pns ) ;
break ;
case PieceType : : B_BISHOP :
case PieceType : : W_BISHOP :
for ( int r = 7 ; r > = 0 ; r - - ) {
for ( int f = 0 ; f < 8 ; f + + ) {
for ( int i = 0 ; i < 8 ; i + + ) {
if ( ( f - i = = x & & r - i = = y ) | |
( f + i = = x & & r + i = = y ) | |
( f - i = = x & & r + i = = y ) | |
( f + i = = x & & r - i = = y ) ) {
pns . push_back ( pair_to_pos ( std : : make_pair ( f , r ) ) ) ;
break ;
}
}
}
}
break ;
_get_all_moves_bishop ( x , y , & pns ) ;
break ;
case PieceType : : B_KNIGHT :
case PieceType : : W_KNIGHT :
for ( int xo = 1 ; xo < = 2 ; xo + + ) {
int yo = ( xo = = 1 ) ? 2 : 1 ;
if ( is_valid_position ( x + xo , y + yo ) ) {
pns . push_back ( pair_to_pos ( std : : make_pair ( x + xo , y + yo ) ) ) ;
}
if ( is_valid_position ( x - xo , y - yo ) ) {
pns . push_back ( pair_to_pos ( std : : make_pair ( x - xo , y - yo ) ) ) ;
}
if ( is_valid_position ( x - xo , y + yo ) ) {
pns . push_back ( pair_to_pos ( std : : make_pair ( x - xo , y + yo ) ) ) ;
}
if ( is_valid_position ( x + xo , y - yo ) ) {
pns . push_back ( pair_to_pos ( std : : make_pair ( x + xo , y - yo ) ) ) ;
}
}
break ;
_get_all_moves_knight ( x , y , & pns ) ;
break ;
case PieceType : : B_KING :
case PieceType : : W_KING :
for ( int j = 7 ; j > = 0 ; j - - ) {
for ( int i = 0 ; i < 8 ; i + + ) {
for ( int k = 0 ; k < 9 ; k + + ) {
if ( std : : make_pair ( x + kg_dx [ k ] , y + kg_dy [ k ] ) = = std : : make_pair ( i , j ) )
pns . push_back ( pair_to_pos ( std : : make_pair ( i , j ) ) ) ;
}
}
}
_get_all_moves_king ( x , y , & pns ) ;
// for (int j = 7; j >= 0; j--){
// for (int i = 0; i < 8; i++){
// for (int k = 0; k < 9; k++){
// if (std::make_pair(x+kg_dx[k],y+kg_dy[k]) == std::make_pair(i,j))
// pns.push_back(pair_to_pos(std::make_pair(i,j)));
// }
// }
// }
break ;
case PieceType : : B_PAWN :
for ( int j = 7 ; j > = 0 ; j - - ) {
for ( int i = 0 ; i < 8 ; i + + ) {
for ( int k = 0 ; k < 6 ; k + + ) {
if ( std : : make_pair ( x + Bpa_dx [ k ] , y + Bpa_dy [ k ] ) = = std : : make_pair ( i , j ) )
pns . push_back ( pair_to_pos ( std : : make_pair ( i , j ) ) ) ;
}
}
}
_get_all_moves_b_pawn ( x , y , & pns ) ;
// for (int j = 7; j >= 0; j--){
// for (int i = 0; i < 8; i++){
// for (int k = 0; k < 6; k++){
// if (std::make_pair(x+Bpa_dx[k],y+Bpa_dy[k]) == std::make_pair(i,j))
// pns.push_back(pair_to_pos(std::make_pair(i,j)));
// }
// }
// }
break ;
case PieceType : : W_PAWN :
_get_all_moves_w_pawn ( x , y , & pns ) ;
/*
for ( int j = 7 ; j > = 0 ; j - - ) {
for ( int i = 0 ; i < 8 ; i + + ) {
for ( int k = 0 ; k < 6 ; k + + ) {
@ -146,7 +184,7 @@ std::vector<Position> get_all_moves(Position pn, std::array<PieceType, 64> board
pns . push_back ( pair_to_pos ( std : : make_pair ( i , j ) ) ) ;
}
}
}
} */
break ;
default :
break ;