diff --git a/src/Koenig.c b/src/Koenig.c index 19b1c0e..ecd0dce 100644 --- a/src/Koenig.c +++ b/src/Koenig.c @@ -333,3 +333,30 @@ void rochiere(char** Brett, Player player, bool kingside, Spielstatus* status) { } } } +bool KannKoenigEntkommen(char** Brett, int koenigX, int koenigY, Player player) { + int directions[8][2] = {{1, 0}, {1, 1}, {0, 1}, {-1, 1}, {-1, 0}, {-1, -1}, {0, -1}, {1, -1}}; + for (int i = 0; i < 8; i++) { + int neuX = koenigX + directions[i][0]; + int neuY = koenigY + directions[i][1]; + + if (neuX >= 0 && neuX < 8 && neuY >= 0 && neuY < 8) { + char zielFeld = Brett[neuY][neuX]; + if ((player == PLAYER_WHITE && (zielFeld == ' ' || islower(zielFeld))) || + (player == PLAYER_BLACK && (zielFeld == ' ' || isupper(zielFeld)))) { + if (!istFeldUnsicher(Brett, neuX, neuY, player)) { + return true; + } + } + } + } + return false; +} +bool istSchachmatt(char** Brett, int koenigX, int koenigY, Player player) { + // Überprüfen, ob der König im Schach steht + if (istKoenigImSchach(Brett, player)) { + return true; // Nicht Schachmatt, wenn der König nicht im Schach steht. + } + + // Überprüfen, ob der König entkommen kann + return !KannKoenigEntkommen(Brett, koenigX, koenigY, player); +} diff --git a/src/Koenig.h b/src/Koenig.h index 8bd6b03..f2c2637 100644 --- a/src/Koenig.h +++ b/src/Koenig.h @@ -14,4 +14,6 @@ bool istzugerlaubt_Koenig(char** Brett, int startX, int startY, int endX, int en void bewegeKoenig(char** Brett, int startX, int startY, int endX, int endY, Player player, Spielstatus* status); bool kannRochieren(char** Brett, int startX, int startY, Player player, Spielstatus* status, bool kingside); void rochiere(char** Brett, Player player, bool kingside, Spielstatus* status); +bool KannKoenigEntkommen(char** Brett, int koenigX, int koenigY, Player player); +bool istSchachmatt(char** Brett, int koenigX, int koenigY, Player player); #endif // Koenig diff --git a/test/test_Koenig.c b/test/test_Koenig.c index b36ecdb..a0ae758 100644 --- a/test/test_Koenig.c +++ b/test/test_Koenig.c @@ -95,4 +95,28 @@ void test_Rochieren(void) { // Clean up Schachbrettspeicher_freigeben(testBrett); } +void test_KoenigKannEntkommen(void) { + char** testBrett = Schachbrett_erstellen(); + testBrett[4][4] = 'k'; + print_Schachfeld(testBrett); + + TEST_ASSERT_TRUE(KannKoenigEntkommen(testBrett, 4, 4, PLAYER_BLACK)); + TEST_ASSERT_FALSE(KannKoenigEntkommen(testBrett, 4, 7, PLAYER_BLACK)); +} +void test_KingInCheckmate(void) { + char** testBrett = Schachbrett_erstellen(); + testBrett[4][4] = 'K'; + + TEST_ASSERT_FALSE(istSchachmatt(testBrett, 4, 4 ,PLAYER_WHITE)); + testBrett[4][0] = 'q'; + testBrett[5][0] = 'q'; + TEST_ASSERT_FALSE(istSchachmatt(testBrett, 4, 4 ,PLAYER_WHITE)); + testBrett[3][0] = 'q'; + testBrett[3][7] = 'q'; + testBrett[4][7] = 'q'; + testBrett[5][7] = 'q'; + testBrett[7][4] = ' '; + print_Schachfeld(testBrett); + TEST_ASSERT_TRUE(istSchachmatt(testBrett, 4, 4 ,PLAYER_WHITE)); +} #endif // TEST