/** * {@inheritdoc} */ public function configureWalker(BoardWalker $walker, GameInterface $game) { $walker->omnidirectional(1); $kingPosition = BoardHelper::getKingPosition($game->getBoard(), $game->getCurrentColor()); $kingColumn = BoardHelper::getColumnFromPosition($kingPosition); $kingRow = BoardHelper::getRowFromPosition($kingPosition); $board = $game->getBoard(); $king = $board->getSquare($kingPosition)->getPiece(); $track = $kingPosition === SquareInterface::POSITION_E1; // check for possible castle move if (empty($game->getMovesByPiece($king->getId()))) { // see if one of the rooks did not make any moves $rookCriteria = ['piece_type' => PieceInterface::TYPE_ROOK, 'piece_color' => $game->getCurrentColor()]; foreach ($board->getPiecesBy($rookCriteria) as $rookPosition => $rook) { if (empty($game->getMovesByPiece($rook->getId()))) { // see if there are no pieces between the king and this rook $rookColumn = BoardHelper::getColumnFromPosition($rookPosition); $columnDiff = abs($kingColumn - $rookColumn) - 1; $track = $track === true && $columnDiff === 3; if ($columnDiff > 1) { $skip = false; for ($x = 1; $x <= $columnDiff; $x++) { if ($rookColumn > $kingColumn) { $cursor = $rookColumn - $x . $kingRow; } else { $cursor = $rookColumn + $x . $kingRow; } if (null !== ($piece = $board->getSquare($cursor)->getPiece())) { $skip = true; break; } } if ($skip) { continue; } if ($kingColumn > $rookColumn) { if ($game->getCurrentColor() === Color::WHITE) { $walker->jump(BoardWalker::DIRECTION_LEFT, 2); } else { $walker->jump(BoardWalker::DIRECTION_RIGHT, 2); } } else { if ($game->getCurrentColor() === Color::WHITE) { $walker->jump(BoardWalker::DIRECTION_RIGHT, 2); } else { $walker->jump(BoardWalker::DIRECTION_LEFT, 2); } } } } } } }
/** * @param Move[] $moves * @param int $ownColor * @param BoardInterface $board * * @return Move[] */ private function filterOwnKingChecks(array $moves, $ownColor, BoardInterface $board) { $opposingColor = $ownColor === Color::WHITE ? Color::BLACK : Color::WHITE; $safeMoves = []; foreach ($moves as $move) { $futureBoard = $this->mockMove($move, $board); $checksKing = false; $ownKingPosition = BoardHelper::getKingPosition($futureBoard, $ownColor); foreach ($board->getSquaresBy(['piece_color' => $opposingColor]) as $square) { foreach ($this->possibleMovesFrom($square->getPosition(), $futureBoard, false, true) as $miscMove) { if ($miscMove->getTo() == $ownKingPosition) { $checksKing = true; break 2; } } } if ($checksKing === false) { $safeMoves[] = $move; } } return $safeMoves; }