/** * {@inheritdoc} */ public function configureWalker(BoardWalker $walker, GameInterface $game) { $pawnMoves = $game->getMovesByPiece($game->getBoard()->getSquare($walker->getStartingPosition())->getPiece()->getId()); if (empty($pawnMoves)) { if ($game->getCurrentColor() === Color::WHITE && $walker->getRow() == 2 || $game->getCurrentColor() === Color::BLACK && $walker->getRow() == 7) { $newPosition = $walker->peek(BoardWalker::DIRECTION_FORWARD, 1); // allowed to make two steps forward if ($newPosition && !$game->getBoard()->getSquare($newPosition)->getPiece()) { $newPosition = $walker->peek(BoardWalker::DIRECTION_FORWARD, 2); if ($newPosition && !$game->getBoard()->getSquare($newPosition)->getPiece()) { // temporary check because walker does not seem to consider obstructing pieces of own color $walker->jump(BoardWalker::DIRECTION_FORWARD, 2)->restart(); } } } } $walker->forward(1, false)->restart(); $forwardLeftCapture = $walker->peek(BoardWalker::DIRECTION_FORWARDLEFT, 1, null, false, true); $forwardRightCapture = $walker->peek(BoardWalker::DIRECTION_FORWARDRIGHT, 1, null, false, true); if ($forwardLeftCapture !== null) { $walker->forwardLeft(1)->restart(); } if ($forwardRightCapture !== null) { $walker->forwardRight(1)->restart(); } $this->walkEnPassant($walker, $game->getLastMove(false)); }
protected function createPersistableState(GameInterface $game, GameState $gameState, $class) { $persistableGameState = $this->createPersistableGameStateObject($class); $squares = []; foreach ($game->getBoard()->getSquares() as $square) { $squareData = ['position' => $square->getPosition(), 'piece' => null]; if ($piece = $square->getPiece()) { $squareData['piece'] = ['id' => $piece->getId(), 'type' => $piece->getType(), 'color' => $piece->getColor()]; } $squares[] = $squareData; } $persistableGameState->setSquares($squares); //$lastMove = $this->createMoveFromGameState($gameState); $lastMove = $game->getLastMove(); if ($lastMove !== null) { $persistableGameState->setFrom($lastMove->getFrom()); $persistableGameState->setTo($lastMove->getTo()); $persistableGameState->setPiece(['id' => $lastMove->getPiece()->getId(), 'type' => $lastMove->getPiece()->getType(), 'color' => $lastMove->getPiece()->getColor()]); if (null !== ($capture = $lastMove->getCapture())) { $persistableGameState->setCapture(['captured_id' => $capture->getCapturedPiece()->getId(), 'captured_type' => $capture->getCapturedPiece()->getType(), 'captured_color' => $capture->getCapturedPiece()->getColor(), 'capturing_id' => $capture->getPiece()->getId(), 'capturing_type' => $capture->getPiece()->getType(), 'capturing_color' => $capture->getPiece()->getColor(), 'position' => $capture->getPosition()]); } $persistableGameState->setMoveType($lastMove->getType()); $persistableGameState->setColor($lastMove->getPiece()->getColor()); } return $persistableGameState; }
/** * @param MoveInterface $move * @param GameInterface $game * * @return int|null */ private static function determineEnPassantType(MoveInterface $move, GameInterface $game) { if (null !== ($lastMove = $game->getLastMove())) { if ($lastMove->getPiece()->getType() === PieceInterface::TYPE_PAWN) { if (abs(BoardHelper::getColumnFromPosition($lastMove->getTo()) - BoardHelper::getColumnFromPosition($move->getFrom())) === 1 && abs(BoardHelper::getRowFromPosition($lastMove->getTo()) - BoardHelper::getRowFromPosition($lastMove->getFrom())) === 2 && BoardHelper::getRowFromPosition($move->getFrom()) === BoardHelper::getRowFromPosition($lastMove->getTo())) { $toPiece = $game->getBoard()->getSquare($move->getTo())->getPiece(); $rowDiff = abs(BoardHelper::getRowFromPosition($move->getFrom()) - BoardHelper::getRowFromPosition($move->getTo())); $columnDiff = abs(BoardHelper::getColumnFromPosition($move->getFrom()) - BoardHelper::getColumnFromPosition($move->getTo())); if ($rowDiff === 1 && $columnDiff === 1) { if ($toPiece === null) { // en passant capture return MoveInterface::TYPE_CAPTURE_EN_PASSANT; } else { return MoveInterface::TYPE_CAPTURE; } } } } } return null; }