diff --git a/src/Game/Game.php b/src/Game/Game.php index 4a778fa..0bcecc0 100644 --- a/src/Game/Game.php +++ b/src/Game/Game.php @@ -434,4 +434,42 @@ class Game { return $result; } + + public static function fromStartPosition(): Game { + return new Game([ + new Pawn(new Position(0, 1), Side::WHITE), + new Pawn(new Position(1, 1), Side::WHITE), + new Pawn(new Position(2, 1), Side::WHITE), + new Pawn(new Position(3, 1), Side::WHITE), + new Pawn(new Position(4, 1), Side::WHITE), + new Pawn(new Position(5, 1), Side::WHITE), + new Pawn(new Position(6, 1), Side::WHITE), + new Pawn(new Position(7, 1), Side::WHITE), + new Rook(new Position(0, 0), Side::WHITE), + new Knight(new Position(1, 0), Side::WHITE), + new Bishop(new Position(2, 0), Side::WHITE), + new Queen(new Position(3, 0), Side::WHITE), + new King(new Position(4, 0), Side::WHITE), + new Bishop(new Position(5, 0), Side::WHITE), + new Knight(new Position(6, 0), Side::WHITE), + new Rook(new Position(7, 0), Side::WHITE), + + new Pawn(new Position(0, 6), Side::BLACK), + new Pawn(new Position(1, 6), Side::BLACK), + new Pawn(new Position(2, 6), Side::BLACK), + new Pawn(new Position(3, 6), Side::BLACK), + new Pawn(new Position(4, 6), Side::BLACK), + new Pawn(new Position(5, 6), Side::BLACK), + new Pawn(new Position(6, 6), Side::BLACK), + new Pawn(new Position(7, 6), Side::BLACK), + new Rook(new Position(0, 7), Side::BLACK), + new Knight(new Position(1, 7), Side::BLACK), + new Bishop(new Position(2, 7), Side::BLACK), + new Queen(new Position(3, 7), Side::BLACK), + new King(new Position(4, 7), Side::BLACK), + new Bishop(new Position(5, 7), Side::BLACK), + new Knight(new Position(6, 7), Side::BLACK), + new Rook(new Position(7, 7), Side::BLACK), + ], Side::WHITE); + } } \ No newline at end of file diff --git a/tests/Game/GameTest.php b/tests/Game/GameTest.php index 2d9d156..9193eea 100644 --- a/tests/Game/GameTest.php +++ b/tests/Game/GameTest.php @@ -632,8 +632,6 @@ final class GameTest extends TestCase { $legalMoves = $subject->getLegalMoves(); - echo join("\n", $legalMoves); - $this->assertCount(5, $legalMoves); $this->assertContainsEqualsOnce(new Move( @@ -697,6 +695,72 @@ final class GameTest extends TestCase { new Rook(new Position(5, 0), Side::WHITE), $pieces ); + } + public function testStartPosition() { + $subject = Game::fromStartPosition(); + + echo $subject->visualize(); + + $pieces = $subject->getAllPieces(); + $this->assertCount(32, $pieces); + + $whitePawns = array_values(array_filter($pieces, fn($p) => $p instanceof Pawn && $p->getSide() == Side::WHITE)); + $blackPawns = array_values(array_filter($pieces, fn($p) => $p instanceof Pawn && $p->getSide() == Side::BLACK)); + $whiteNonPawns = array_values(array_filter($pieces, fn($p) => !($p instanceof Pawn) && $p->getSide() == Side::WHITE)); + $blackNonPawns = array_values(array_filter($pieces, fn($p) => !($p instanceof Pawn) && $p->getSide() == Side::BLACK)); + $kings = array_values(array_filter($pieces, fn($p) => $p instanceof King)); + $queens = array_values(array_filter($pieces, fn($p) => $p instanceof Queen)); + $rooks = array_values(array_filter($pieces, fn($p) => $p instanceof Rook)); + $knights = array_values(array_filter($pieces, fn($p) => $p instanceof Knight)); + $bishops = array_values(array_filter($pieces, fn($p) => $p instanceof Bishop)); + + $this->assertCount(8, $whitePawns); + $this->assertCount(8, $blackPawns); + $this->assertCount(8, $whiteNonPawns); + $this->assertCount(8, $blackNonPawns); + $this->assertCount(2, $kings); + $this->assertCount(2, $queens); + $this->assertCount(4, $rooks); + $this->assertCount(4, $knights); + $this->assertCount(4, $bishops); + + $this->assertEquals( + array_fill(0, 8, 1), + array_map(fn($p) => $p->getPosition()->rank, $whitePawns), + ); + $this->assertEquals( + array_fill(0, 8, 0), + array_map(fn($p) => $p->getPosition()->rank, $whiteNonPawns), + ); + $this->assertEquals( + array_fill(0, 8, 6), + array_map(fn($p) => $p->getPosition()->rank, $blackPawns), + ); + $this->assertEquals( + array_fill(0, 8, 7), + array_map(fn($p) => $p->getPosition()->rank, $blackNonPawns), + ); + + $this->assertEquals( + array_fill(0, 4, 0), + array_map(fn($p) => min($p->getPosition()->file, 7 - $p->getPosition()->file), $rooks), + ); + $this->assertEquals( + array_fill(0, 4, 1), + array_map(fn($p) => min($p->getPosition()->file, 7 - $p->getPosition()->file), $knights), + ); + $this->assertEquals( + array_fill(0, 4, 2), + array_map(fn($p) => min($p->getPosition()->file, 7 - $p->getPosition()->file), $bishops), + ); + $this->assertEquals( + array_fill(0, 2, 3), + array_map(fn($p) => $p->getPosition()->file, $queens), + ); + $this->assertEquals( + array_fill(0, 2, 4), + array_map(fn($p) => $p->getPosition()->file, $kings), + ); } } \ No newline at end of file