コード例 #1
0
ファイル: MGMoveToString.cs プロジェクト: scchess/Ceres
        public static string AlgebraicMoveString(MGMove mgMove, Position pos)
        {
            string ret = null;

            bool white = pos.MiscInfo.SideToMove == SideType.White;

            MGPosition curPosition = MGChessPositionConverter.MGChessPositionFromFEN(pos.FEN);

            // Generate moves
            MGMoveList moves = new MGMoveList();

            MGMoveGen.GenerateMoves(in curPosition, moves);

            //if (white) mgMove = new MGMove(mgMove, true);
            MGPosition newPosition = MGChessPositionConverter.MGChessPositionFromFEN(pos.FEN);

            newPosition.MakeMove(mgMove);

            bool isCheck = MGMoveGen.IsInCheck(newPosition, white);

            if (mgMove.CastleShort)
            {
                ret = "O-O";
            }
            else if (mgMove.CastleLong)
            {
                ret = "O-O-O";
            }

            else
            {
                Square fromSquare = mgMove.FromSquare;
                Square toSquare   = mgMove.ToSquare;

                Piece fromType = pos.PieceOnSquare(fromSquare);
                Piece toPiece  = pos.PieceOnSquare(toSquare);

                if (fromType.Type == PieceType.Pawn)
                {
                    string promoteChar = "";
                    if (mgMove.PromoteQueen)
                    {
                        promoteChar = "Q";
                    }
                    if (mgMove.PromoteBishop)
                    {
                        promoteChar = "B";
                    }
                    if (mgMove.PromoteRook)
                    {
                        promoteChar = "R";
                    }
                    if (mgMove.PromoteKnight)
                    {
                        promoteChar = "N";
                    }

                    if (mgMove.EnPassantCapture)
                    {
                        int  newRank = white ? 6 : 3;
                        char newFile = char.ToLower(toSquare.FileChar);
                        ret = fromSquare.ToString().Substring(0, 1).ToLower() + "x" +
                              newFile + newRank;
                    }
                    else if (toPiece.Type == PieceType.None)
                    {
                        ret = toSquare.ToString().ToLower() + promoteChar;
                    }
                    else
                    {
                        ret = fromSquare.ToString().Substring(0, 1).ToLower() + "x" +
                              toSquare.ToString().ToLower() + promoteChar;
                    }
                }
                else
                {
                    string captureChar = toPiece.Type == PieceType.None ? "" : "x";

                    List <MGMove> matchingCaptures = MovesByPieceTypeThatTakeOnSquare(mgMove.Piece, mgMove.ToSquareIndex, moves);
                    if (matchingCaptures.Count == 1)
                    {
                        ret = char.ToUpper(fromType.Char) + captureChar + toSquare.ToString().ToLower();
                    }
                    else
                    {
                        // Disambiguate
                        DifferBy differBy = MoveDifferFromAllOthersBy(matchingCaptures, mgMove);
                        string   fileChar = fromSquare.FileChar.ToString().ToLower();
                        string   rankChar = fromSquare.RankChar.ToString().ToLower();

                        if (differBy == DifferBy.File)
                        {
                            ret = char.ToUpper(fromType.Char) + fileChar + captureChar + toSquare.ToString().ToLower();
                        }
                        else if (differBy == DifferBy.Rank)
                        {
                            ret = char.ToUpper(fromType.Char) + rankChar + captureChar + toSquare.ToString().ToLower();
                        }
                        else
                        {
                            ret = char.ToUpper(fromType.Char) + fileChar + rankChar + captureChar + toSquare.ToString().ToLower();
                        }
                    }
                }
            }

            if (isCheck)
            {
                return(ret + "+");
            }
            else
            {
                return(ret);
            }
        }