diff --git a/src/Koenig.c b/src/Koenig.c index 9fc69cf..19b1c0e 100644 --- a/src/Koenig.c +++ b/src/Koenig.c @@ -297,3 +297,39 @@ bool kannRochieren(char** Brett, int startX, int startY, Player player, Spielsta //wenn alles passt ist eine Rochade machbar return true; } +void rochiere(char** Brett, Player player, bool kingside, Spielstatus* status) { + int startY = player == PLAYER_WHITE ? 0 : 7; // Startreihe basierend auf dem Spieler + int koenigStartX = 4; // König x position + if (!kannRochieren(Brett,koenigStartX, startY, player, status, kingside)) { + printf("Rochieren ist unter den aktuellen Bedingungen nicht möglich.\n"); + return; // Beende die Funktion, wenn Rochieren nicht möglich ist + } + int koenigEndX = kingside ? 6 : 2; // König bewegt sich zwei Felder + int turmStartX = kingside ? 7 : 0; // Turm Startposition + int turmEndX = kingside ? 5 : 3; // Turm bewegt sich neben den könig + + // Den zug darstellen + char koenig = player == PLAYER_WHITE ? 'K' : 'k'; + char turm = player == PLAYER_WHITE ? 'R' : 'r'; + Brett[startY][koenigStartX] = ' '; // Königs startposition Leeren + Brett[startY][koenigEndX] = koenig; // Plaziert König auf dem neuen Feld + Brett[startY][turmStartX] = ' '; // Turm startposition Leeren + Brett[startY][turmEndX] = turm; // Plaziert Turm auf dem neuen Feld + + // Spielstatus updaten weil eine Rochade ausgeführt wurde + if (player == PLAYER_WHITE) { + status->BewegteSichWeißerKoenig = true; + if (kingside) { + status->WeißerTurmKoenigSeiteBewegt = true; + } else { + status->WeißerTurmDameSeiteBewegt = true; + } + } else { + status->BewegteSichSchwarzerKoenig = true; + if (kingside) { + status->SchwarzerTurmKoenigSeiteBewegt = true; + } else { + status->SchwarzerTurmDameSeiteBewegt = true; + } + } +} diff --git a/src/Koenig.h b/src/Koenig.h index f9831fc..8bd6b03 100644 --- a/src/Koenig.h +++ b/src/Koenig.h @@ -13,4 +13,5 @@ bool istKoenigImSchach(char** Brett, Player player); bool istzugerlaubt_Koenig(char** Brett, int startX, int startY, int endX, int endY, Player player); 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); #endif // Koenig diff --git a/test/test_Koenig.c b/test/test_Koenig.c index 4974f90..b36ecdb 100644 --- a/test/test_Koenig.c +++ b/test/test_Koenig.c @@ -74,4 +74,25 @@ void test_Koenigbewegung_InvalidMove(void) { TEST_ASSERT_FALSE(status.BewegteSichWeißerKoenig);//Schauen ob sich der spielstatus passend verhält Schachbrettspeicher_freigeben(Brett); } +void test_Rochieren(void) { + char** testBrett = Schachbrett_erstellen(); + Spielstatus status = {0}; + Player player = PLAYER_WHITE; + testBrett[0][5] = ' '; + testBrett[0][6] = ' '; + + rochiere(testBrett, player, true, &status); // Assuming 'true' indicates kingside castling + + // Assertions to verify castling was performed correctly + TEST_ASSERT_EQUAL(' ', testBrett[0][4]); // King's original position is empty + TEST_ASSERT_EQUAL(' ', testBrett[0][7]); // Rook's original position is empty + TEST_ASSERT_EQUAL('K', testBrett[0][6]); // King is moved to the correct position + TEST_ASSERT_EQUAL('R', testBrett[0][5]); // Rook is moved next to the king + + TEST_ASSERT_TRUE(status.BewegteSichWeißerKoenig); + TEST_ASSERT_TRUE(status.WeißerTurmKoenigSeiteBewegt); + + // Clean up + Schachbrettspeicher_freigeben(testBrett); +} #endif // TEST