| | """ |
| | Endgame Detection for Nexus-Core |
| | Simplified endgame handling |
| | """ |
| |
|
| | import chess |
| |
|
| |
|
| | class EndgameDetector: |
| | """Basic endgame phase detection""" |
| | |
| | def __init__(self): |
| | self.phase = 'middlegame' |
| | |
| | def detect_phase(self, board: chess.Board) -> str: |
| | """Detect game phase""" |
| | |
| | |
| | total_material = 0 |
| | piece_values = { |
| | chess.PAWN: 1, |
| | chess.KNIGHT: 3, |
| | chess.BISHOP: 3, |
| | chess.ROOK: 5, |
| | chess.QUEEN: 9 |
| | } |
| | |
| | for piece_type in piece_values: |
| | count = len(board.pieces(piece_type, chess.WHITE)) |
| | count += len(board.pieces(piece_type, chess.BLACK)) |
| | total_material += count * piece_values[piece_type] |
| | |
| | |
| | if board.fullmove_number < 10: |
| | self.phase = 'opening' |
| | elif total_material <= 16: |
| | self.phase = 'endgame' |
| | else: |
| | self.phase = 'middlegame' |
| | |
| | return self.phase |
| | |
| | def is_known_draw(self, board: chess.Board) -> bool: |
| | """Check for known draws""" |
| | |
| | if board.is_insufficient_material(): |
| | return True |
| | |
| | if board.halfmove_clock >= 100: |
| | return True |
| | |
| | return False |
| | |
| | def adjust_evaluation(self, board: chess.Board, eval_score: float) -> float: |
| | """Adjust evaluation for endgame""" |
| | |
| | phase = self.detect_phase(board) |
| | |
| | if self.is_known_draw(board): |
| | return 0.0 |
| | |
| | |
| | if phase == 'endgame': |
| | |
| | king_activity = self._king_activity_bonus(board) |
| | eval_score += king_activity |
| | |
| | return eval_score |
| | |
| | def _king_activity_bonus(self, board: chess.Board) -> float: |
| | """King activity in endgame""" |
| | bonus = 0.0 |
| | |
| | for color in [chess.WHITE, chess.BLACK]: |
| | king_sq = board.king(color) |
| | if king_sq is None: |
| | continue |
| | |
| | |
| | rank, file = divmod(king_sq, 8) |
| | center_distance = abs(rank - 3.5) + abs(file - 3.5) |
| | |
| | activity = (7 - center_distance) * 5 |
| | |
| | if color == chess.WHITE: |
| | bonus += activity |
| | else: |
| | bonus -= activity |
| | |
| | return bonus |