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