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:
parent
0378f849a5
commit
fc6b977686
2 changed files with 23 additions and 10 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue