Exemplo n.º 1
0
 /**
  * {@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));
 }
Exemplo n.º 2
0
 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;
 }
Exemplo n.º 3
0
 /**
  * @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;
 }