fixed bug where rook would also be able to initialize castling
This commit is contained in:
+7
-11
@@ -201,6 +201,7 @@ class ChessBoard:
|
||||
self.num_moves = max(0, self.num_moves - 1)
|
||||
return True
|
||||
|
||||
# creates all theoretically possible moves which can be performed by the piece at a position
|
||||
def moves_unchecked(self, piece: Piece, pos: BoardPos) -> List[List[Tuple[int, int]]]:
|
||||
row, column = pos.p
|
||||
rays: List[List[Tuple[int, int]]] = []
|
||||
@@ -310,19 +311,12 @@ class ChessBoard:
|
||||
row_height = 7 if color == Color.WHITE else 0
|
||||
expected_king_pos = BoardPos((row_height, 4))
|
||||
|
||||
king_lhs_dest = BoardPos((row_height, 2))
|
||||
king_rhs_dest = BoardPos((row_height, 6))
|
||||
|
||||
# if king moved
|
||||
if self.has_piece_moved(expected_king_pos):
|
||||
return moves
|
||||
|
||||
expected_lhs_rook_pos = BoardPos((row_height, 0))
|
||||
expected_rhs_rook_pos = BoardPos((row_height, 7))
|
||||
|
||||
lhs_rook_dest = BoardPos((row_height, 3))
|
||||
rhs_rook_dest = BoardPos((row_height, 6))
|
||||
|
||||
# squares that must be empty between rook and king
|
||||
lhs_pieces_inbetween = [BoardPos((row_height, i)) for i in range(1, 4)] # cols 1,2,3
|
||||
rhs_pieces_inbetween = [BoardPos((row_height, i)) for i in range(5, 7)] # cols 5,6
|
||||
@@ -331,17 +325,19 @@ class ChessBoard:
|
||||
lhs_fields_attacked = [BoardPos((row_height, i)) for i in (4, 3, 2)]
|
||||
rhs_fields_attacked = [BoardPos((row_height, i)) for i in (4, 5, 6)]
|
||||
|
||||
# queenside
|
||||
if (not self.has_piece_moved(expected_lhs_rook_pos)
|
||||
and self.are_pieces_none(lhs_pieces_inbetween)
|
||||
and not self.are_fields_attacked(lhs_fields_attacked, color.opposite)):
|
||||
king_lhs_dest = BoardPos((row_height, 2))
|
||||
moves.append(BoardMove(expected_king_pos, king_lhs_dest, MoveType.CASTLING_QUEENSIDE))
|
||||
moves.append(BoardMove(expected_lhs_rook_pos, lhs_rook_dest, MoveType.CASTLING_QUEENSIDE))
|
||||
|
||||
# kingside
|
||||
if (not self.has_piece_moved(expected_rhs_rook_pos)
|
||||
and self.are_pieces_none(rhs_pieces_inbetween)
|
||||
and not self.are_fields_attacked(rhs_fields_attacked, color.opposite)):
|
||||
king_rhs_dest = BoardPos((row_height, 6))
|
||||
moves.append(BoardMove(expected_king_pos, king_rhs_dest, MoveType.CASTLING_KINGSIDE))
|
||||
moves.append(BoardMove(expected_rhs_rook_pos, rhs_rook_dest, MoveType.CASTLING_QUEENSIDE))
|
||||
return moves
|
||||
|
||||
def has_piece_moved(self, pos: BoardPos) -> bool:
|
||||
@@ -447,7 +443,7 @@ class ChessBoard:
|
||||
# do a move and then check, if the king is still in check
|
||||
# if it isnt, add the move to the possibles ones
|
||||
if not self.make_move(move, color):
|
||||
raise ValueError("self moves basic created a move, which cannot be done (hopefully unreachable)")
|
||||
raise ValueError(f"self.moves_basic created a move, which cannot be done (hopefully unreachable). move: {move}")
|
||||
|
||||
all_basic_enemy_moves = self.moves_basic(color.opposite)
|
||||
king_pos = self.pos_of_king(color)
|
||||
@@ -544,7 +540,7 @@ def play_random_game(board: Optional[ChessBoard] = None, max_moves: int = 400, v
|
||||
return board, moves_played
|
||||
|
||||
|
||||
def run_random_games(n: int = 100, max_moves: int = 400, verbose: bool = False):
|
||||
def run_random_games(n: int = 20, max_moves: int = 200, verbose: bool = False):
|
||||
for i in range(n):
|
||||
final_board, moves = play_random_game(None, max_moves=max_moves, verbose=verbose)
|
||||
if verbose:
|
||||
|
||||
Reference in New Issue
Block a user