/** * @depends testGetBoard */ public function testGetBasicTargetSquaresEnPassant(Board $board) { $board->getGame()->setTurns(10); $piece = $board->getPieceByKey('f2'); $piece->setY('5'); $piece->setFirstMove(1); $board->getPieceByKey('g7')->setY(5); $board->getPieceByKey('g7')->setFirstMove(9); $board->compile(); $expected = array('f6'); $this->assertSquareKeys($expected, $piece->getBasicTargetKeys()); }
protected function getKeysByProjection($dx, $dy) { $keys = array(); $continue = true; $x = $this->x; $y = $this->y; while ($continue) { $x += $dx; $y += $dy; if ($x > 0 && $x < 9 && $y > 0 && $y < 9) { $key = Board::posToKey($x, $y); if ($piece = $this->board->getPieceByKey($key)) { if ($piece->getColor() !== $this->color) { $keys[] = $key; } $continue = false; } else { $keys[] = $key; } } else { $continue = false; } } return $keys; }
/** * @depends testGetBoard */ public function testGetBasicTargetSquaresSecondMove(Board $board) { $piece = $board->getPieceByKey('b1'); $piece->setX(3); $piece->setY(4); $board->compile(); $expected = array('a3', 'a5', 'b6', 'd6', 'e5', 'e3'); $this->assertSquareKeys($expected, $piece->getBasicTargetKeys()); }
/** * @depends testGetBoard */ public function testGetBasicTargetSquaresSecondMove(Board $board) { $piece = $board->getPieceByKey('d1'); $piece->setX(3); $piece->setY(4); $board->compile(); $expected = array('b3', 'b5', 'a6', 'd5', 'e6', 'f7', 'd3', 'a4', 'b4', 'd4', 'e4', 'f4', 'g4', 'h4', 'c3', 'c5', 'c6', 'c7'); $this->assertSquareKeys($expected, $piece->getBasicTargetKeys()); }
/** * Add castling moves if available * * @return array the squares where the king can go **/ protected function addCastlingSquares(King $king, array $squares) { $player = $king->getPlayer(); $rooks = PieceFilter::filterNotMoved(PieceFilter::filterClass(PieceFilter::filterAlive($player->getPieces()), 'Rook')); if (empty($rooks)) { return $squares; } $opponentControlledKeys = $this->getPlayerControlledKeys($player->getOpponent(), true); foreach ($rooks as $rook) { $kingX = $king->getX(); $kingY = $king->getY(); $rookX = $rook->getX(); $dx = $kingX > $rookX ? -1 : 1; $newKingX = 1 === $dx ? 7 : 3; $newRookX = 1 === $dx ? 6 : 4; $possible = true; // Unattacked $rangeMin = min($kingX, $newKingX); $rangeMax = min(8, max($kingX, $newKingX) + 1); for ($_x = $rangeMin; $_x !== $rangeMax; $_x++) { if (in_array(Board::posToKey($_x, $kingY), $opponentControlledKeys)) { $possible = false; break; } } // Unimpeded $rangeMin = min($kingX, $rookX, $newKingX, $newRookX); $rangeMax = min(8, max($kingX, $rookX, $newKingX, $newRookX) + 1); for ($_x = $rangeMin; $_x !== $rangeMax; $_x++) { if ($piece = $this->board->getPieceByKey(Board::posToKey($_x, $kingY))) { if ($piece !== $king && $piece !== $rook) { $possible = false; break; } } } if ($possible) { // If King moves one square or less (Chess variant) if (1 >= abs($kingX - $newKingX)) { $newKingSquare = $rook->getSquare(); } else { $newKingSquare = $this->board->getSquareByPos($newKingX, $kingY); } $squares[] = $newKingSquare; } } return $squares; }
/** * @depends testBoardCreation */ public function testGetPieceByPos(Board $board) { $this->assertSame($board->getPieceByKey('a1'), $board->getPieceByPos(1, 1)); }