public bool CheckAndMakeAMove(ChessMove move) { if (plField.CheckEmpty(move.StartY, move.StartX) || !plField[move.StartY, move.StartX].CheckMove(move)) { return(false); } ChessFigure capturedFigure = plField[move.EndY, move.EndX]; MakeOrCancelAMove(move); if (IsWhitesTurn ? WhiteKing.IsChecked : BlackKing.IsChecked) { Console.WriteLine("----------------------------------------"); MakeOrCancelAMove(move.Reverse(), capturedFigure); return(false); } else { if (OppositeKing.IsChecked) { TryToCheckmateOppositeKing(); } CheckAvailableMoves(); IsWhitesTurn = !IsWhitesTurn; return(true); } }
private void MakeOrCancelAMove(ChessMove move, ChessFigure capturedFigure = null) { if (plField[move.StartY, move.StartX].IsKing()) { if (plField[move.StartY, move.StartX].IsWhite()) { whiteKingX = move.EndX; whiteKingY = move.EndY; } else { blackKingX = move.EndX; blackKingY = move.EndY; } } plField[move.EndY, move.EndX] = plField[move.StartY, move.StartX]; plField[move.StartY, move.StartX] = capturedFigure; ResetKingsChecks(); CalculateAvailableMoves(); TryCheckKings(); Console.WriteLine("White king is in check: {0}", WhiteKing.IsChecked); Console.WriteLine("Black king is in check: {0}", BlackKing.IsChecked); }
public void TryCheckBy(ChessFigure figure, int Y, int X) { foreach (var move in figure.AvailableMoves) { if (move.EndX == X && move.EndY == Y) { IsChecked = true; } } }
public void CheckAvailableMoves() { ChessPlayingField tempPlField = plField.Clone() as ChessPlayingField; int tempWhiteKingX = whiteKingX, tempWhiteKingY = whiteKingY; int tempBlackKingX = blackKingX, tempBlackKingY = blackKingY; for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { if (!plField.CheckEmpty(i, j)) { foreach (var move in plField[i, j].AvailableMoves) { if (plField.CheckEmpty(move.EndY, move.EndX) || !plField[move.EndY, move.EndX].IsKing()) { ChessFigure capturedFigure = plField[move.EndY, move.EndX]; MakeOrCancelAMove(move); Console.WriteLine("----------------------------------------"); if (OppositeKing.IsChecked) { tempPlField[i, j].AvailableMoves.Remove(move); } MakeOrCancelAMove(move.Reverse(), capturedFigure); } } } } } plField = tempPlField; whiteKingX = tempWhiteKingX; whiteKingY = tempWhiteKingY; blackKingX = tempBlackKingX; blackKingY = tempBlackKingY; }
public void TryToCheckmateOppositeKing() { if (!OppositeKing.IsChecked) { throw new ArgumentException("Must be checked", "ChessKing king"); } bool kingCanBeUnchecked = false; for (int i = 0; i < 8 && !kingCanBeUnchecked; i++) { for (int j = 0; j < 8 && !kingCanBeUnchecked; j++) { if (!plField.CheckEmpty(i, j) && OppositeKing.IsSameColourAs(plField[i, j])) { foreach (var move in plField[i, j].AvailableMoves) { ChessFigure capturedFigure = plField[move.EndY, move.EndX]; MakeOrCancelAMove(move); if (!OppositeKing.IsChecked) { Console.WriteLine("Uncheck: {0}, {1}, {2}, {3}", move.StartY, move.StartX, move.EndY, move.EndX); kingCanBeUnchecked = true; MakeOrCancelAMove(move.Reverse(), capturedFigure); break; } Console.WriteLine("----------------------------------------"); MakeOrCancelAMove(move.Reverse(), capturedFigure); } } } } OppositeKing.IsCheckmated = !kingCanBeUnchecked; }
public bool IsSameColourAs(ChessFigure figure) { return(IsWhite() == figure.IsWhite()); }