From 2624fb191a16ff380a3308c0a69f547ffb1e9251 Mon Sep 17 00:00:00 2001 From: overflowerror Date: Sat, 30 Dec 2023 13:26:28 +0100 Subject: [PATCH] feat: Add knights to game system --- src/Game/Knight.php | 33 ++++++++++++++ tests/Game/KnightTest.php | 93 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 126 insertions(+) create mode 100644 src/Game/Knight.php create mode 100644 tests/Game/KnightTest.php diff --git a/src/Game/Knight.php b/src/Game/Knight.php new file mode 100644 index 0000000..11ea38d --- /dev/null +++ b/src/Game/Knight.php @@ -0,0 +1,33 @@ +position->file + $fileOffset, + $this->position->rank + $rankOffset + ); + if ($candidate->isValid() && !$occupied->has($candidate)) { + $result->add($candidate); + } + } + + return $result; + } +} \ No newline at end of file diff --git a/tests/Game/KnightTest.php b/tests/Game/KnightTest.php new file mode 100644 index 0000000..42913bf --- /dev/null +++ b/tests/Game/KnightTest.php @@ -0,0 +1,93 @@ +getMoveCandidateMap(FieldBitMap::empty(), FieldBitMap::empty(), FieldBitMap::empty()); + + $this->assertTrue( + $result->equals(new FieldBitMap([ + new Position(4, 2), + new Position(4, 6), + new Position(2, 2), + new Position(2, 6), + new Position(5, 3), + new Position(5, 5), + new Position(1, 3), + new Position(1, 5), + ])) + ); + } + + public function testMoves_obstructed() { + $subject = new Knight(new Position( + 3, 1 + ), Side::WHITE); + + $result = $subject->getMoveCandidateMap( + new FieldBitMap([ + new Position(2, 3), + new Position(5, 2) + ]), + new FieldBitMap([ + new Position(4, 3) + ]), + FieldBitMap::empty() + ); + + $this->assertTrue( + $result->equals(new FieldBitMap([ + new Position(4, 3), + new Position(1, 2), + new Position(1, 0), + new Position(5, 0) + ])) + ); + } + + public function testCaptureable() { + $subject = new Knight( + new Position(5, 6), + Side::WHITE, + ); + + $this->assertTrue( + $subject->getCaptureableMap(true)->equals(new FieldBitMap([ + new Position(5, 6) + ])) + ); + } + + public function testCaptureMap() { + $subject = new Knight(new Position( + 5, 2 + ), Side::WHITE); + + $result = $subject->getCaptureMap( + new FieldBitMap([ + new Position(6, 4), + new Position(4, 4), + new Position(3, 1), + new Position(7, 1), + ]) + ); + + $this->assertTrue( + $result->equals(new FieldBitMap([ + new Position(3, 3), + new Position(7, 3), + new Position(6, 0), + new Position(4, 0), + ])) + ); + } +} \ No newline at end of file