public virtual bool IsInCheck(Player player)
{
if (player == Player.None)
{
throw new ArgumentException("IsInCheck: Player.None is an invalid argument.");
}
Cache<bool> cache = player == Player.White ? inCheckCacheWhite : inCheckCacheBlack;
if (cache.CachedAt == Moves.Count)
{
return cache.Value;
}
Position kingPos = new Position(File.None, -1);
for (int r = 1; r <= Board.Length; r++)
{
for (int f = 0; f < Board[8 - r].Length; f++)
{
Piece curr = GetPieceAt((File)f, r);
if (curr is King && curr.Owner == player)
{
kingPos = new Position((File)f, r);
break;
}
}
if (kingPos != new Position(File.None, -1))
{
break;
}
}
if (kingPos.File == File.None)
return cache.UpdateCache(false, Moves.Count);
for (int r = 1; r <= Board.Length; r++)
{
for (int f = 0; f < Board[8 - r].Length; f++)
{
Piece curr = GetPieceAt((File)f, r);
if (curr == null) continue;
Player p = curr.Owner;
Move move = new Move(new Position((File)f, r), kingPos, p);
List<Move> moves = new List<Move>();
if (curr is Pawn && ((move.NewPosition.Rank == 8 && move.Player == Player.White) || (move.NewPosition.Rank == 1 && move.Player == Player.Black)))
{
moves.Add(new Move(move.OriginalPosition, move.NewPosition, move.Player, 'Q'));
moves.Add(new Move(move.OriginalPosition, move.NewPosition, move.Player, 'R'));
moves.Add(new Move(move.OriginalPosition, move.NewPosition, move.Player, 'B'));
moves.Add(new Move(move.OriginalPosition, move.NewPosition, move.Player, 'N'));
moves.Add(new Move(move.OriginalPosition, move.NewPosition, move.Player, 'K'));
}
else
{
moves.Add(move);
}
foreach (Move m in moves)
{
if (IsValidMove(m, false, false))
{
return cache.UpdateCache(true, Moves.Count);
}
}
}
}
return cache.UpdateCache(false, Moves.Count);
}