Example #1
0
        private static string finishPGNMove(string pgnMove, PieceType promoteToPiece, Color playerColor)
        {
            var promotedPiece = PGNEngine.GetPieceCharFromPieceTypeColor(promoteToPiece, playerColor);

            if (promotedPiece == PGNService.NullPiece)
            {
                return(pgnMove);
            }
            else
            {
                return($"{ pgnMove }{ PGNService.PawnPromotionIndicator }{ promotedPiece }");
            }
        }
Example #2
0
        public void Basic()
        {
            Assert.AreEqual(PieceType.King, PGNEngine.GetPieceTypeFromPGNMove("Kb2"));
            Assert.AreEqual(PieceType.Queen, PGNEngine.GetPieceTypeFromPGNMove("Qa2"));
            Assert.AreEqual(PieceType.Rook, PGNEngine.GetPieceTypeFromPGNMove("Ra2"));
            Assert.AreEqual(PieceType.Bishop, PGNEngine.GetPieceTypeFromPGNMove("Bb2"));
            Assert.AreEqual(PieceType.Knight, PGNEngine.GetPieceTypeFromPGNMove("Na2"));
            Assert.AreEqual(PieceType.Pawn, PGNEngine.GetPieceTypeFromPGNMove("a2"));

            Assert.AreEqual(PieceType.King, PGNEngine.GetPieceTypeFromPGNMove("kb2"));
            Assert.AreEqual(PieceType.Queen, PGNEngine.GetPieceTypeFromPGNMove("qa2"));
            Assert.AreEqual(PieceType.Rook, PGNEngine.GetPieceTypeFromPGNMove("ra2"));
            Assert.AreEqual(PieceType.Bishop, PGNEngine.GetPieceTypeFromPGNMove("bb2"));
            Assert.AreEqual(PieceType.Knight, PGNEngine.GetPieceTypeFromPGNMove("na2"));
            Assert.AreEqual(PieceType.Pawn, PGNEngine.GetPieceTypeFromPGNMove("a2"));
        }
Example #3
0
        public (int piecePosition, int newPiecePosition, char promotedPiece) PGNMoveToSquarePair(GameState gameState, string pgnMove)
        {
            var positionFromPGNMove = getPositionFromPGNMove(pgnMove, gameState.ActiveColor, gameState.EnPassantTargetSquare);
            var newPiecePosition    = positionFromPGNMove.position;
            var promotedPiece       = positionFromPGNMove.promotedPiece;
            var pieceType           = PGNEngine.GetPieceTypeFromPGNMove(pgnMove);
            var pieceIndicator      = pgnMove[0];

            if (pieceIndicator == 'b')
            {
                if (gameState.ActiveColor == Color.White)
                {
                    // this is a pawn move, not a bishop because a white bishop would be B, not b
                    pieceType = PieceType.Pawn;
                }
                else
                {
                    // the code above will think that this move is done by a bishop
                    // so here we see if any pawn can do the job
                    // the attacking pawn would have to be on the b file for confusion to occur here
                    // ****************************************************
                    // I'm concerned that there might be a situation where the pgn move differentiates between
                    // the pawn and bishop move, yet we haven't looked close enough.
                    // should probably attempt to induce this scenario
                    var bFile = this._orthogonalService.GetEntireFile(1);
                    var potentialPawnSquares = gameState.Attacks.Where(a =>
                                                                       a.Index == newPiecePosition &&
                                                                       bFile.Contains(a.AttackingSquare.Index) &&
                                                                       a.AttackingSquare.Piece.Color == gameState.ActiveColor &&
                                                                       (
                                                                           a.Occupied || (!a.Occupied && !a.MayOnlyMoveHereIfOccupiedByEnemy)
                                                                       ) &&
                                                                       a.AttackingSquare.Piece.PieceType == PieceType.Pawn
                                                                       );
                    if (potentialPawnSquares.Any())
                    {
                        // if there are pawn pieces that can fulfill here, then make the pieceType = Pawn
                        pieceType = PieceType.Pawn;
                    }
                }
            }
            var piece         = new Piece(pieceType, gameState.ActiveColor);
            var piecePosition = GetCurrentPositionFromPGNMove(gameState, piece, newPiecePosition, pgnMove, positionFromPGNMove.isCastle);

            return(piecePosition.Index, newPiecePosition, promotedPiece);
        }