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)); }
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)); } }
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); } }
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)); } } }