コード例 #1
0
        /// <summary>
        /// Gets all possible moves of bishops of given player
        /// </summary>
        private static List <GameMove> GetMovesForBishops(ChessboardModel chessboard, PlayerColor playerColor)
        {
            var acumulator = new List <GameMove>();

            var upLeft    = new GameMoveVector(-1, 1);
            var upRight   = new GameMoveVector(1, 1);
            var downLeft  = new GameMoveVector(-1, -1);
            var downRight = new GameMoveVector(1, -1);

            for (int x = 0; x < 8; x++)
            {
                for (int y = 0; y < 8; y++)
                {
                    var position = new ChessPosition(x, y);
                    var figure   = chessboard.GetFigureOnPosition(position);
                    if (
                        figure != null &&
                        figure.Type == FigureType.Bishop &&
                        figure.Color == playerColor
                        )
                    {
                        acumulator.AddRange(CanMoveOrAttackIterative(chessboard, playerColor, position, upLeft));
                        acumulator.AddRange(CanMoveOrAttackIterative(chessboard, playerColor, position, upRight));
                        acumulator.AddRange(CanMoveOrAttackIterative(chessboard, playerColor, position, downLeft));
                        acumulator.AddRange(CanMoveOrAttackIterative(chessboard, playerColor, position, downRight));
                    }
                }
            }

            acumulator.RemoveAll(x => x == null);
            return(acumulator);
        }
コード例 #2
0
        /// <summary>
        /// Gets all possible moves of king of given player
        /// </summary>
        private static List <GameMove> GetMovesForKing(ChessboardModel chessboard, PlayerColor playerColor)
        {
            var acumulator = new List <GameMove>();

            var up        = new GameMoveVector(0, 1);
            var left      = new GameMoveVector(-1, 0);
            var down      = new GameMoveVector(0, -1);
            var right     = new GameMoveVector(1, 0);
            var upLeft    = new GameMoveVector(-1, 1);
            var upRight   = new GameMoveVector(1, 1);
            var downLeft  = new GameMoveVector(-1, -1);
            var downRight = new GameMoveVector(1, -1);

            for (int x = 0; x < 8; x++)
            {
                for (int y = 0; y < 8; y++)
                {
                    var position = new ChessPosition(x, y);
                    var figure   = chessboard.GetFigureOnPosition(position);
                    if (
                        figure != null &&
                        figure.Type == FigureType.King &&
                        figure.Color == playerColor
                        )
                    {
                        acumulator.Add(CanMoveOrAttack(chessboard, playerColor, position, position.Add(up)));
                        acumulator.Add(CanMoveOrAttack(chessboard, playerColor, position, position.Add(left)));
                        acumulator.Add(CanMoveOrAttack(chessboard, playerColor, position, position.Add(down)));
                        acumulator.Add(CanMoveOrAttack(chessboard, playerColor, position, position.Add(right)));
                        acumulator.Add(CanMoveOrAttack(chessboard, playerColor, position, position.Add(upLeft)));
                        acumulator.Add(CanMoveOrAttack(chessboard, playerColor, position, position.Add(upRight)));
                        acumulator.Add(CanMoveOrAttack(chessboard, playerColor, position, position.Add(downLeft)));
                        acumulator.Add(CanMoveOrAttack(chessboard, playerColor, position, position.Add(downRight)));
                    }
                }
            }

            acumulator.RemoveAll(x => x == null);
            return(acumulator);
        }
コード例 #3
0
 /// <summary>
 /// Get position after translating by given vector
 /// </summary>
 /// <param name="vector">Vector move translation</param>
 /// <returns>Transalted position</returns>
 public ChessPosition Add(GameMoveVector vector)
 {
     return(new ChessPosition(this.X + vector.X, this.Y + vector.Y));
 }
コード例 #4
0
        /// <summary>
        /// Gets moves in direction of vector, until figure of playing player is encountered, or positions ain't valid
        /// </summary>
        /// <param name="playerColor">Capturing player</param>
        /// <param name="from">Position to move from</param>
        /// <param name="vector">Vector to move to</param>
        private static List <GameMove> CanMoveOrAttackIterative(ChessboardModel chessboard, PlayerColor playerColor, ChessPosition from, GameMoveVector vector)
        {
            var acumulator = new List <GameMove>();

            var temp = from;

            while (true)
            {
                temp = temp.Add(vector);

                var attack = CanAttack(chessboard, playerColor, from, temp);
                var move   = CanMove(chessboard, playerColor, from, temp);

                acumulator.Add(move);
                acumulator.Add(attack);

                if (attack != null)
                {
                    return(acumulator);
                }

                if (move == null)
                {
                    return(acumulator);
                }
            }
        }