Ejemplo n.º 1
0
    public void ReadPGN(string pgn)
    {
        bool   readingExtraInfo  = false;
        bool   readingGame       = false;
        bool   readingMove       = false;
        bool   readingWhiteMove  = false;
        string currentMoveString = "";
        string moveLetters       = "abcdefghRNBQKO";

        List <string> currentGameMoveNotations = new List <string>();

        // Separate moves into strings
        for (int i = 0; i < pgn.Length; i++)
        {
            char c = pgn[i];
            if (c == '[')
            {
                readingGame      = false;
                readingExtraInfo = true;
            }
            if (c == ']')
            {
                readingExtraInfo = false;
            }

            if (readingGame)
            {
                if (!readingMove && c == '-')                   // Game over (result token, e.g. 0-1)
                {
                    moveNotation.Add(currentGameMoveNotations);
                    currentGameMoveNotations = new List <string>();
                    readingGame = false;
                    readingMove = false;
                }
                if (moveLetters.Contains(c.ToString()))
                {
                    readingMove = true;
                }
                if (c == ' ' || c == '.' || c == '\n' || c == '+' || c == '#')
                {
                    if (currentMoveString.Length >= 2)
                    {
                        currentGameMoveNotations.Add(currentMoveString);
                    }

                    readingMove = false;

                    currentMoveString = "";
                }
                if (readingMove)
                {
                    currentMoveString += c.ToString();
                }
            }
            else if (c == '1' && !readingExtraInfo)
            {
                readingGame      = true;
                readingWhiteMove = true;
            }
        }

        for (int gameIndex = 0; gameIndex < moveNotation.Count; gameIndex++)
        {
            // Convert move notation to moves
            GameBoard.Colour colourToMove     = GameBoard.Colour.White;
            List <Move>      currentGameMoves = new List <Move>();
            //print (moveNotation[gameIndex].Count);
            foreach (string m in moveNotation[gameIndex])
            {
                //print ( "   ASDAS " + m);
                string pieceType      = "";            // e.g RNBQK
                string disambiguation = "";            // (e.g. Rfd1 (f is disambiguation between two possible rooks)
                string targetSquare   = "";            // e.g e4
                bool   promoting      = false;
                string promotionPiece = "";

                string pieceSymbols      = "RNBQK";
                string coordinateSymbols = "abcdefgh";
                string coordinateNumbers = "12345678";

                if (m == "O-O" || m == "O-O-O")                   // Castling
                //print ("CASS");
                {
                    pieceType     = "K";
                    targetSquare  = (m == "O-O")?"g":"c";
                    targetSquare += (colourToMove == GameBoard.Colour.White)?"1":"8";
                }
                else
                {
                    for (int i = 0; i < m.Length; i++)                       // Iterate through each char in move string
                    {
                        char c = m[i];

                        if (c == '=')
                        {
                            promoting = true;
                        }

                        if (GameBoard.IsUpper(c.ToString()) && pieceSymbols.Contains(c.ToString()))
                        {
                            if (promoting)
                            {
                                promotionPiece = c.ToString();
                            }
                            else
                            {
                                pieceType = c.ToString();
                            }
                        }
                        else
                        {
                            if (coordinateSymbols.Contains(c.ToString()))
                            {
                                if (targetSquare != "")
                                {
                                    disambiguation = targetSquare;
                                }
                                targetSquare = c.ToString();
                            }
                            else if (coordinateNumbers.Contains(c.ToString()))
                            {
                                targetSquare += c.ToString();
                            }
                        }
                    }
                }
                if (pieceType == "")
                {
                    pieceType = "P";
                }
                //	print (m);

                Move newMove = legalMoves.GetMoveFromNotation(pieceType, targetSquare, disambiguation, promotionPiece, board.analysisBoard, colourToMove, m);

                currentGameMoves.Add(newMove);
                if (newMove != null)
                {
                    board.UpdateAnalysisBoard(newMove);
                }
                colourToMove = (colourToMove == GameBoard.Colour.White)?GameBoard.Colour.Black:GameBoard.Colour.White;
            }
            allMoves.Add(currentGameMoves);
            board.ResetBoardToStarting();
            legalMoves.NewGame();
        }
        devMode.SetMoves(allMoves);
    }
    void NextPuzzle()
    {
        board.ResetBoardToStarting();
        legal.NewGame();

        //print (puzzleIndex);

        //print ("Move Count: " +allMoves[puzzleIndex].Count);
        foreach (Move m in allMoves[puzzleIndex])
        {
            board.MakeMove(m.moveFrom.coordinates, m.moveTo.coordinates);
        }
        bool mated = false;
        bool flip  = false;

        if (legal.Mated(board.analysisBoard, GameBoard.Colour.Black))
        {
            mated = true;
        }
        else if (legal.Mated(board.analysisBoard, GameBoard.Colour.White))
        {
            mated = true;
            flip  = true;
        }


        if (mated)
        {
            blacksLastMove = allMoves[puzzleIndex][allMoves[puzzleIndex].Count - 2];

            board.ResetBoardToStarting();
            for (int i = 0; i < allMoves[puzzleIndex].Count - 2; i++)
            {
                Move m = allMoves[puzzleIndex][i];
                board.MakeMove(m.moveFrom.coordinates, m.moveTo.coordinates);
            }

            if (flip)
            {
                for (int ranks = 0; ranks < 4; ranks++)
                {
                    for (int files = 0; files < 8; files++)
                    {
                        GameBoard.Pieces tempPiece  = board.analysisBoard[files, ranks].piece;
                        GameBoard.Colour tempColour = board.analysisBoard[files, ranks].pieceColour;
                        bool             tempEp     = board.analysisBoard[files, ranks].isEnPassantSquare;

                        board.analysisBoard[files, ranks].piece                     = board.analysisBoard[7 - files, 7 - ranks].piece;
                        board.analysisBoard[files, ranks].pieceColour               = (board.analysisBoard[7 - files, 7 - ranks].pieceColour == GameBoard.Colour.White)?GameBoard.Colour.Black:GameBoard.Colour.White;
                        board.analysisBoard[files, ranks].isEnPassantSquare         = board.analysisBoard[7 - files, 7 - ranks].isEnPassantSquare;
                        board.analysisBoard[7 - files, 7 - ranks].piece             = tempPiece;
                        board.analysisBoard[7 - files, 7 - ranks].pieceColour       = (tempColour == GameBoard.Colour.White)?GameBoard.Colour.Black:GameBoard.Colour.White;
                        board.analysisBoard[7 - files, 7 - ranks].isEnPassantSquare = tempEp;
                    }
                }
                blacksLastMove.moveFrom.coordinates = new Coord(7 - blacksLastMove.moveFrom.coordinates.x, 7 - blacksLastMove.moveFrom.coordinates.y);
                blacksLastMove.moveTo.coordinates   = new Coord(7 - blacksLastMove.moveTo.coordinates.x, 7 - blacksLastMove.moveTo.coordinates.y);
            }

            puzzleFen = DatabaseManager.GetPuzzleFEN(board.analysisBoard, blacksLastMove.moveFrom.coordinates, blacksLastMove.moveTo.coordinates, legal);
            board.SetToAnalysisBoard();
            board.MakeMove(blacksLastMove.moveFrom.coordinates, blacksLastMove.moveTo.coordinates);
            board.SetToAnalysisBoard();
        }
        else
        {
            SetPuzzle(false);
        }
    }