diff --git a/src/Game/Bishop.php b/src/Game/Bishop.php new file mode 100644 index 0000000..0bd5e80 --- /dev/null +++ b/src/Game/Bishop.php @@ -0,0 +1,43 @@ +position->file + $i * ($d % 2 == 0 ? 1 : -1), + $this->position->rank + $i * ($d < 2 ? 1 : -1) + ); + if ($candidate->isValid()) { + if ($captureable->has($candidate)) { + $result->add($candidate); + $directions[$d] = false; + } else if ($occupied->has($candidate)) { + $directions[$d] = false; + } else { + $result->add($candidate); + } + } else { + $directions[$d] = false; + } + } + } + } + + return $result; + } +} \ No newline at end of file diff --git a/tests/Game/BishopTest.php b/tests/Game/BishopTest.php new file mode 100644 index 0000000..72f71fb --- /dev/null +++ b/tests/Game/BishopTest.php @@ -0,0 +1,98 @@ +getMoveCandidateMap(FieldBitMap::empty(), FieldBitMap::empty(), FieldBitMap::empty()); + + $this->assertTrue( + $result->equals(new FieldBitMap([ + new Position(2, 3), + new Position(1, 2), + new Position(0, 1), + new Position(4, 5), + new Position(5, 6), + new Position(6, 7), + new Position(4, 3), + new Position(5, 2), + new Position(6, 1), + new Position(7, 0), + new Position(2, 5), + new Position(1, 6), + new Position(0, 7), + ])) + ); + } + + public function testMoves_obstructed() { + $subject = new Bishop(new Position( + 3, 2 + ), Side::WHITE); + + $result = $subject->getMoveCandidateMap( + new FieldBitMap([ + new Position(4, 3), + new Position(5, 0) + ]), + new FieldBitMap([ + new Position(2, 1) + ]), + FieldBitMap::empty() + ); + + $this->assertTrue( + $result->equals(new FieldBitMap([ + new Position(4, 1), + new Position(2, 1), + new Position(2, 3), + new Position(1, 4), + new Position(0, 5) + ])) + ); + } + + public function testCaptureable() { + $subject = new Bishop( + new Position(5, 6), + Side::WHITE, + ); + + $this->assertTrue( + $subject->getCaptureableMap(true)->equals(new FieldBitMap([ + new Position(5, 6) + ])) + ); + } + + public function testCaptureMap() { + $subject = new Bishop(new Position( + 5, 2 + ), Side::WHITE); + + $result = $subject->getCaptureMap( + new FieldBitMap([ + new Position(6, 3), + new Position(3, 4) + ]) + ); + + $this->assertTrue( + $result->equals(new FieldBitMap([ + new Position(6, 1), + new Position(7, 0), + new Position(4, 3), + new Position(4, 1), + new Position(3, 0), + ])) + ); + } +} \ No newline at end of file