Esempio n. 1
0
        private Square pgnLength5(GameState gameState, string newPgnMove)
        {
            var _file = NotationEngine.FileToInt(newPgnMove[1]);
            var _rank = 0;

            Int32.TryParse(newPgnMove[2].ToString(), out _rank);
            var pos = NotationEngine.CoordinatePairToPosition(_file, _rank);

            return(gameState.Squares.GetSquare(pos));
        }
Esempio n. 2
0
        private void getPawnDiagonalAttack(List <Square> squares, Square square, Color pieceColor, int fileIndicator, int nextRank, List <AttackedSquare> attacks)
        {
            var pos            = NotationEngine.CoordinatePairToPosition(fileIndicator, nextRank);
            var attackedSquare = squares.GetSquare(pos);

            if (attackedSquare.Occupied && attackedSquare.Piece.Color != pieceColor)
            {
                attacks.Add(new AttackedSquare(square, attackedSquare, false, true));
            }
            else
            {
                attacks.Add(new AttackedSquare(square, attackedSquare, false, true, true));
            }
        }
Esempio n. 3
0
        private void getPawnAttacks(GameState gameState, Square square, List <AttackedSquare> accumulator)
        {
            var squares    = gameState.Squares;
            var position   = square.Index;
            var pieceColor = square.Piece.Color;
            var coord      = NotationEngine.PositionToCoordinate(position);
            int file       = NotationEngine.FileToInt(coord[0]);
            int rank       = NotationEngine.PositionToRankInt(position);

            var directionIndicator = pieceColor == Color.White ? 1 : -1;
            var homeRankIndicator  = pieceColor == Color.White ? 2 : 7;

            var nextRank             = (rank + directionIndicator);
            var aheadOneRankPosition = NotationEngine.CoordinatePairToPosition(file, nextRank);
            var aheadOneRankSquare   = squares.GetSquare(aheadOneRankPosition);
            var attacks = new List <AttackedSquare>();

            if (!aheadOneRankSquare.Occupied)
            {
                //can't attack going forward
                attacks.Add(new AttackedSquare(square, aheadOneRankSquare, true));
            }

            managePawnAttacks(squares, square, pieceColor, file, rank, directionIndicator, homeRankIndicator, nextRank, attacks, aheadOneRankSquare.Occupied);

            //add en passant position: -1 indicates null here
            if (gameState.EnPassantTargetSquare != "-")
            {
                var enPassantTargetPosition = NotationEngine.CoordinateToPosition(gameState.EnPassantTargetSquare);
                var leftPos  = NotationEngine.CoordinatePairToPosition(file - 1, nextRank);
                var rightPos = NotationEngine.CoordinatePairToPosition(file + 1, nextRank);
                if (enPassantTargetPosition == leftPos || enPassantTargetPosition == rightPos)
                {
                    var enPassantSquare = squares.GetSquare(enPassantTargetPosition);
                    attacks.Add(new AttackedSquare(square, enPassantSquare));
                }
            }
            if (attacks.Any())
            {
                accumulator.AddRange(attacks);
            }
        }
Esempio n. 4
0
        private void managePawnAttacks(List <Square> squares, Square square, Color pieceColor, int file, int rank, int directionIndicator, int homeRankIndicator, int nextRank, List <AttackedSquare> attacks, bool aheadOneRankSquareOccupied)
        {
            var notOnFarLeftFile  = file - 1 >= 0;
            var notOnFarRightFile = file + 1 <= 7;

            if (notOnFarLeftFile)
            {
                //get attack square on left
                var fileIndicator = file - 1;
                getPawnDiagonalAttack(squares, square, pieceColor, fileIndicator, nextRank, attacks);
            }
            if (notOnFarRightFile)
            {
                //get attack square on right
                var fileIndicator = file + 1;
                getPawnDiagonalAttack(squares, square, pieceColor, fileIndicator, nextRank, attacks);
            }
            //can't move ahead two if the one in front of you is blocked.
            if (aheadOneRankSquareOccupied)
            {
                return;
            }
            //have to plus one here because rank is zero based and coordinate is base 1
            //if this pawn is on it's home rank, then add a second attack square.
            var isOnHomeRank = rank + 1 == homeRankIndicator;

            if (isOnHomeRank)
            {
                var forwardOne          = nextRank + directionIndicator;
                var rankForwardPosition = NotationEngine.CoordinatePairToPosition(file, forwardOne);
                var rankForwardSquare   = squares.GetSquare(rankForwardPosition);
                //pawns don't attack forward, so we don't have attacks when people occupy ahead of us
                if (!rankForwardSquare.Occupied)
                {
                    attacks.Add(new AttackedSquare(square, rankForwardSquare, true));
                }
            }
        }