Beispiel #1
0
        internal static string FromBoard(Board board)
        {
            StringBuilder sb = new StringBuilder();

            int emptyCount = 0;
            for (int rank = 8; rank >= 1; rank--)
            {
                for (int column = 1; column <= 8; column++)
                {
                    var piece = board[rank, column];
                    if (piece == null)
                    {
                        emptyCount++;
                        continue;
                    }

                    if (emptyCount != 0)
                        sb.Append(emptyCount);
                    sb.Append(GetNotation(piece));
                    emptyCount = 0;
                }

                if (emptyCount != 0) sb.Append(emptyCount);
                emptyCount = 0;

                if (rank > 1)
                    sb.Append('/');
            }

            sb.Append(' ').Append(char.ToLower(board.CurrentPlayer.PlayerColor.ToString()[0]));

            sb.Append(' ');
            string castle = GetNotation(board.GetCastleAvailabity(PlayerColor.White), PlayerColor.White) + GetNotation(board.GetCastleAvailabity(PlayerColor.Black), PlayerColor.Black);
            if (castle.Length == 0)
                sb.Append('-');
            else
                sb.Append(castle);

            sb.Append(' ');
            if (board.LastMove != null && board.LastMove.Piece is Pawn && Math.Abs(board.LastMove.Source.GetRank() - board.LastMove.Target.GetRank()) == 2)
                sb.Append(board.LastMove.Target.ToString().ToLower());
            else
                sb.Append('-');

            sb.Append(' ')
              .Append(board.History.Reverse().TakeWhile(i => !(i.Piece is Pawn) && i.CapturedPiece == null).Count())
              .Append(' ')
              .Append((int)(board.History.Count / 2));

            return sb.ToString();
        }