Fixes #78 - When we have two attackers in a chess game, both pieces should be red

Part-of: <https://gitlab.gnome.org/GNOME/gnome-chess/-/merge_requests/52>
This commit is contained in:
azibom 2023-10-05 01:02:14 +03:30 committed by Michael Catanzaro
parent 0378f849a5
commit fc6b977686
2 changed files with 23 additions and 10 deletions

View file

@ -390,10 +390,17 @@ public class ChessGame : Object
public bool is_piece_at_position_threatening_check (int rank, int file)
{
int threatening_rank, threatening_file;
int[] threatening_rank, threatening_file;
if (current_state.get_position_threatening_king (current_player, out threatening_rank, out threatening_file) && threatening_rank == rank && threatening_file == file)
return true;
if (current_state.get_positions_threatening_king (current_player, out threatening_rank, out threatening_file))
{
assert (threatening_rank.length == threatening_file.length);
for (int i = 0; i < threatening_rank.length; i++)
{
if (threatening_rank[i] == rank && threatening_file[i] == file)
return true;
}
}
return false;
}

View file

@ -595,9 +595,10 @@ public class ChessState : Object
return CheckState.NONE;
}
public bool get_position_threatening_king (ChessPlayer player, out int rank, out int file)
public bool get_positions_threatening_king (ChessPlayer player, out int[] rank, out int[] file)
{
var opponent = player.color == Color.WHITE ? players[Color.BLACK] : players[Color.WHITE];
bool found = false;
/* Is in check if any piece can take the king */
for (int king_index = 0; king_index < 64; king_index++)
@ -606,6 +607,8 @@ public class ChessState : Object
if (p != null && p.player == player && p.type == PieceType.KING)
{
/* See if any enemy pieces can take the king */
int[] ranks = {};
int[] files = {};
for (int start = 0; start < 64; start++)
{
if (move_with_coords (opponent,
@ -613,21 +616,24 @@ public class ChessState : Object
get_rank (king_index), get_file (king_index),
PieceType.QUEEN, false, false))
{
rank = get_rank (start);
file = get_file (start);
return true;
ranks += get_rank (start);
files += get_file (start);
found = true;
}
}
rank = ranks;
file = files;
}
}
return false;
return found;
}
public bool is_in_check (ChessPlayer player)
{
int rank, file;
return get_position_threatening_king (player, out rank, out file);
int[] rank, file;
return get_positions_threatening_king (player, out rank, out file);
}
private bool is_in_checkmate (ChessPlayer player)