diff --git a/src/Koenig.c b/src/Koenig.c index 0acb55c..9fc69cf 100644 --- a/src/Koenig.c +++ b/src/Koenig.c @@ -273,3 +273,27 @@ void bewegeKoenig(char** Brett, int startX, int startY, int endX, int endY, Play } } } +bool kannRochieren(char** Brett, int startX, int startY, Player player, Spielstatus* status, bool kingside) { + // Simple Checks um zu schauen ob es möglich ist zu rochieren + if (player == PLAYER_WHITE) { + if (status->BewegteSichWeißerKoenig) return false; + if (kingside && status->WeißerTurmKoenigSeiteBewegt) return false; + if (!kingside && status->WeißerTurmDameSeiteBewegt) return false; + } else { // PLAYER_BLACK + if (status->BewegteSichSchwarzerKoenig) return false; + if (kingside && status->SchwarzerTurmKoenigSeiteBewegt) return false; + if (!kingside && status->SchwarzerTurmDameSeiteBewegt) return false; + } + + // Extra checks: Pfad muss frei sein, könig nicht im schach, und nicht sich durch Schach bewegen oder in Schach enden. + int dir = kingside ? 1 : -1; // Schauen in welche richtung man Rochiert + for (int offset = 1; offset <= (kingside ? 2 : 3); ++offset) { // Zwei Felder auf der kurzen, drei für lange Seite + int checkX = startX + dir * offset; + if (Brett[startY][checkX] != ' ' || istFeldUnsicher(Brett, checkX, startY, player)) { + return false; + } + } + + //wenn alles passt ist eine Rochade machbar + return true; +} diff --git a/src/Koenig.h b/src/Koenig.h index f3bcf6f..f9831fc 100644 --- a/src/Koenig.h +++ b/src/Koenig.h @@ -12,4 +12,5 @@ bool istFeldUnsicher(char** Brett, int x, int y, Player player); 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); #endif // Koenig