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