/// <summary> /// Check for check mate. /// </summary> /// <param name="initiatorColor">Initiator color.</param> /// <param name="field">Game field.</param> /// <param name="masterFactory">Master factory implementation.</param> /// <param name="isCheck">Is check on table.</param> /// <returns>Checkmate flag.</returns> public static bool IsCheckMate( PlayerColor initiatorColor, VirtualField field, IPieceMasterFactory masterFactory, out bool isCheck) { isCheck = false; // Check for check now if (IsCheck(initiatorColor, field, masterFactory)) { isCheck = true; var opponentColor = initiatorColor.Invert(); // Otherwise do all possible movements, in the case of no possibility to prevent being attacked = initiator wins foreach (var opponmentPiecePoint in FindPieces(p => p.GetPlayerColor() == opponentColor, field)) { PieceMasterBase master; if (masterFactory.TryGetMaster(field, opponmentPiecePoint, out master)) { foreach (var movement in master.GetMovements()) { var fieldCopy = new VirtualField(field.CloneMatrix()); if (fieldCopy[movement].GetPlayerColor() == fieldCopy[opponmentPiecePoint].GetPlayerColor()) { // Step on free space var temp = fieldCopy[opponmentPiecePoint]; fieldCopy[opponmentPiecePoint] = fieldCopy[movement]; fieldCopy[movement] = temp; } else { // Eat opponent piece fieldCopy[movement] = fieldCopy[opponmentPiecePoint]; fieldCopy[opponmentPiecePoint] = ChessPiece.Empty; } if (!IsCheck(initiatorColor, fieldCopy, masterFactory)) { return(false); } } } } // Passed all steps and no possibilities to prevent a check return(true); } return(false); }
/// <summary> /// Is king in check status. /// </summary> /// <param name="initiatorColor">Initiator color.</param> /// <param name="field">Game field.</param> /// <param name="masterFactory">Master factory implementation.</param> /// <returns>Check flag.</returns> public static bool IsCheck( PlayerColor initiatorColor, VirtualField field, IPieceMasterFactory masterFactory) { var opponentColor = initiatorColor.Invert(); ChessPoint opponentKingPoint = FindPieces(p => p == MapKing(opponentColor), field).FirstOrDefault(); if (opponentKingPoint == null) { return(false); } var initiatorAttacked = UnderAttackPoints(initiatorColor, field, masterFactory); return(initiatorAttacked.Any(point => point == opponentKingPoint)); }
/// <summary> /// Constructor for <see cref="PieceMasterBase"/>. /// </summary> protected PieceMasterBase(VirtualField field, ChessPoint point, IPieceMasterFactory master, params ChessPiece[] pieces) { Field = field; Pieces = pieces; Piece = Field[point]; if (!pieces.Any()) { throw new InvalidOperationException("Need more then one piece"); } if (!pieces.Contains(Piece)) { throw new InvalidOperationException($"x={point.X} y={point.Y} [{Piece}] isn't {string.Join(", ", pieces)}"); } Position = point; Master = master; }
/// <summary> /// Constructor for <see cref="GameViewModel"/>. /// </summary> public GameViewModel( IGameServiceProvider gameServiceProvider, IEndpointInfo endpointInfo, IUserMessage userMessage, IPieceMasterFactory masterFactory, LocalNavigator navigator) { _masterFactory = masterFactory; _navigator = navigator; _gameServiceProvider = gameServiceProvider; _endpointInfo = endpointInfo; _userMessage = userMessage; var chessDefaultField = VirtualFieldUtils.CreateDefaultField(); _gameField = new VirtualField(chessDefaultField); _controller = new GameController(); _controller.Movement += OnChessPieceMovement; PlayMoreCommand = new DelegateCommand(PlayMoreHandler); DisconnectCommand = new DelegateCommand(DisconnectHandler); }
/// <summary> /// Get all points under attack by initiator. /// </summary> /// <param name="initiatorColor">Initiator color.</param> /// <param name="field">Game field.</param> /// <param name="masterFactory">Masters factory.</param> /// <returns></returns> public static IEnumerable <ChessPoint> UnderAttackPoints( PlayerColor initiatorColor, VirtualField field, IPieceMasterFactory masterFactory) { var movements = new HashSet <ChessPoint>(); foreach (var point in FindPieces(piece => piece.GetPlayerColor() == initiatorColor, field)) { PieceMasterBase master; if (masterFactory.TryGetMaster(field, point, out master)) { foreach (var movement in master.GetRealMovements()) { movements.Add(movement); } } } return(movements); }
/// <summary> /// Constructor for <see cref="PawnMaster"/>. /// </summary> public PawnMaster(VirtualField field, ChessPoint point, IPieceMasterFactory master) : base(field, point, master, ChessPiece.BlackPawn, ChessPiece.WhitePawn) { }
/// <summary> /// Constructor for <see cref="QueenMaster"/>. /// </summary> public QueenMaster(VirtualField field, ChessPoint point, IPieceMasterFactory master) : base(field, point, master, ChessPiece.BlackQueen, ChessPiece.WhiteQueen) { }
/// <summary> /// Constructor for <see cref="BishopMaster"/>. /// </summary> public BishopMaster(VirtualField field, ChessPoint point, IPieceMasterFactory master) : base(field, point, master, ChessPiece.BlackBishop, ChessPiece.WhiteBishop) { }
/// <summary> /// Constructor for <see cref="KnightMaster"/>. /// </summary> public KnightMaster(VirtualField field, ChessPoint point, IPieceMasterFactory master) : base(field, point, master, ChessPiece.BlackKnight, ChessPiece.WhiteKnight) { }
/// <summary> /// Constructor for <see cref="RookMaster"/>. /// </summary> public RookMaster(VirtualField field, ChessPoint point, IPieceMasterFactory master) : base(field, point, master, ChessPiece.BlackRook, ChessPiece.WhiteRook) { }
/// <summary> /// Constructor for <see cref="KingMaster"/>. /// </summary> public KingMaster(VirtualField field, ChessPoint point, IPieceMasterFactory master) : base(field, point, master, ChessPiece.BlackKing, ChessPiece.WhiteKing) { }
/// <summary> /// Constructor for <see cref="Game"/>. /// </summary> public Game(IPieceMasterFactory masterFactory, Player player1, Player player2) { _masterFactory = masterFactory; Player1 = player1; Player2 = player2; }