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