Beispiel #1
0
        public void Checkmate3()
        {
            var field   = new VirtualField(VirtualFieldUtils.CreateEmptyField());
            var factory = new PieceMasterFactory();

            field[0, 0] = ChessPiece.WhiteKing;
            field[1, 2] = ChessPiece.BlackKing;

            field[7, 0] = ChessPiece.BlackQueen;

            bool isCheck;

            Assert.IsTrue(CheckMateLogic.IsCheckMate(PlayerColor.Black, field, factory, out isCheck));
            Assert.IsTrue(isCheck);
        }
Beispiel #2
0
        public void NoCheckmate3()
        {
            var field   = new VirtualField(VirtualFieldUtils.CreateEmptyField());
            var factory = new PieceMasterFactory();

            field[7, 0] = ChessPiece.WhiteRook;
            field[6, 4] = ChessPiece.WhiteRook;
            field[1, 1] = ChessPiece.BlackKing;
            field[6, 7] = ChessPiece.WhiteKing;

            bool isCheck;

            Assert.IsFalse(CheckMateLogic.IsCheckMate(PlayerColor.White, field, factory, out isCheck));
            Assert.IsFalse(isCheck);
        }
Beispiel #3
0
        public void NoCheckmate2()
        {
            var field   = new VirtualField(VirtualFieldUtils.CreateEmptyField());
            var factory = new PieceMasterFactory();

            field[1, 1] = ChessPiece.WhiteKing;
            field[5, 6] = ChessPiece.BlackKing;

            field[7, 0] = ChessPiece.BlackRook;
            field[0, 7] = ChessPiece.BlackRook;

            // Eat for no checkmate
            field[2, 2] = ChessPiece.BlackQueen;

            bool isCheck;

            Assert.IsFalse(CheckMateLogic.IsCheckMate(PlayerColor.Black, field, factory, out isCheck));
            Assert.IsTrue(isCheck);
        }
Beispiel #4
0
        /// <inheritdoc/>
        protected override IEnumerable <ChessPoint> GetAvailableMovements(bool onlySteps = false)
        {
            /*******************
            * (-1,-1)(0,-1)(1,-1)
            * (-1,0) (King) (1,0)
            * (-1,1) (0,1) (1,1)
            *******************/

            // АЛГОРИТМ
            // Выясняем куда ВСЕ фигуры могу ходить, затем создаём поле где проставляем все движения всех фигур и выясняем куда можно куда нельзя ходить. НЕ ЗАБЫВАЕМ что
            // Стоит не забывать что фигура достающая до союзной - защищает НО НАМ ЭТО НЕ НАДО
            // Check cells around
            var movements = new[]
            {
                new ChessVector(-1, -1),
                new ChessVector(0, -1),
                new ChessVector(1, -1),
                new ChessVector(-1, 0),
                new ChessVector(1, 0),
                new ChessVector(-1, 1),
                new ChessVector(0, 1),
                new ChessVector(1, 1),
            };

            var avaliableMovements =
                movements.Select(vector => ChessPoint.Add(Position, vector))
                .Where(CanMove);

            if (onlySteps)
            {
                return(avaliableMovements);
            }

            var piecePlayerColor       = Field[Position].GetPlayerColor().Value;
            var opponentColorInitiator = piecePlayerColor.Invert();
            var underAttackPoints      = CheckMateLogic.UnderAttackPoints(opponentColorInitiator, Field, new PieceMasterFactory());
            var r = avaliableMovements.Where(point => !underAttackPoints.Contains(point));

            var d = r.ToArray();

            return(d);
        }
Beispiel #5
0
        /// <inheritdoc/>
        public void Move(string sessionId, ChessPoint from, ChessPoint to)
        {
            if (!_isInitialized)
            {
                throw new InvalidOperationException("Game isn't initialized");
            }

            // Who makes a movement
            var initiator = GetPlayer(sessionId);

            // His opponent
            var opponent = Player1 == initiator ? Player2 : Player1;
            var piece    = _virtualField[from.X, from.Y];

            // Check for hacker movements
            CheaterCheck(initiator, from, to);

            ThreadPool.QueueUserWorkItem(
                obj =>
            {
                _virtualField[to.X, to.Y]     = piece;
                _virtualField[from.X, from.Y] = ChessPiece.Empty;

                bool isCheck;
                var isCheckMate = CheckMateLogic.IsCheckMate(
                    initiator.PlayerColor,
                    _virtualField,
                    _masterFactory,
                    out isCheck);

                _checkedPlayer = isCheck ? opponent.PlayerColor : (PlayerColor?)null;

                if (isCheckMate)
                {
                    NotifyAboutCheckMate(initiator, opponent, from, to);
                }
                else
                {
                    NotifyFieldChanged(initiator, opponent, from, to);
                }
            });
        }