feat: Add start position to game system

This commit is contained in:
overflowerror 2024-01-07 16:17:14 +01:00
parent 64b29a881b
commit 4a748d7ea2
2 changed files with 104 additions and 2 deletions

View file

@ -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);
}
}

View file

@ -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),
);
}
}