Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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));
        }
Beispiel #3
0
        /// <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;
        }
Beispiel #4
0
        /// <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);
        }
Beispiel #5
0
        /// <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);
        }
Beispiel #6
0
 /// <summary>
 /// Constructor for <see cref="PawnMaster"/>.
 /// </summary>
 public PawnMaster(VirtualField field, ChessPoint point, IPieceMasterFactory master)
     : base(field, point, master, ChessPiece.BlackPawn, ChessPiece.WhitePawn)
 {
 }
Beispiel #7
0
 /// <summary>
 /// Constructor for <see cref="QueenMaster"/>.
 /// </summary>
 public QueenMaster(VirtualField field, ChessPoint point, IPieceMasterFactory master)
     : base(field, point, master, ChessPiece.BlackQueen, ChessPiece.WhiteQueen)
 {
 }
Beispiel #8
0
 /// <summary>
 /// Constructor for <see cref="BishopMaster"/>.
 /// </summary>
 public BishopMaster(VirtualField field, ChessPoint point, IPieceMasterFactory master)
     : base(field, point, master, ChessPiece.BlackBishop, ChessPiece.WhiteBishop)
 {
 }
Beispiel #9
0
 /// <summary>
 /// Constructor for <see cref="KnightMaster"/>.
 /// </summary>
 public KnightMaster(VirtualField field, ChessPoint point, IPieceMasterFactory master)
     : base(field, point, master, ChessPiece.BlackKnight, ChessPiece.WhiteKnight)
 {
 }
Beispiel #10
0
 /// <summary>
 /// Constructor for <see cref="RookMaster"/>.
 /// </summary>
 public RookMaster(VirtualField field, ChessPoint point, IPieceMasterFactory master)
     : base(field, point, master, ChessPiece.BlackRook, ChessPiece.WhiteRook)
 {
 }
Beispiel #11
0
 /// <summary>
 /// Constructor for <see cref="KingMaster"/>.
 /// </summary>
 public KingMaster(VirtualField field, ChessPoint point, IPieceMasterFactory master)
     : base(field, point, master, ChessPiece.BlackKing, ChessPiece.WhiteKing)
 {
 }
Beispiel #12
0
 /// <summary>
 /// Constructor for <see cref="Game"/>.
 /// </summary>
 public Game(IPieceMasterFactory masterFactory, Player player1, Player player2)
 {
     _masterFactory = masterFactory;
     Player1        = player1;
     Player2        = player2;
 }