Browse Source

Rochieren Implementiert + Test, Anton Lohrey

remotes/origin/Läufer-fertig,-Hendrik-Voß
fdai7492 11 months ago
parent
commit
e0880edba8
  1. 36
      src/Koenig.c
  2. 1
      src/Koenig.h
  3. 21
      test/test_Koenig.c

36
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;
}
}
}

1
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

21
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
Loading…
Cancel
Save