public virtual string GetFen()
{
StringBuilder fenBuilder = new StringBuilder();
Piece[][] board = GetBoard();
for (int i = 0; i < board.Length; i++)
{
Piece[] row = board[i];
int empty = 0;
foreach (Piece piece in row)
{
char pieceChar = piece == null ? '\0' : piece.GetFenCharacter();
if (pieceChar == '\0')
{
empty++;
continue;
}
if (empty != 0)
{
fenBuilder.Append(empty);
empty = 0;
}
fenBuilder.Append(pieceChar);
}
if (empty != 0)
{
fenBuilder.Append(empty);
}
if (i != board.Length - 1)
{
fenBuilder.Append('/');
}
}
fenBuilder.Append(' ');
fenBuilder.Append(WhoseTurn == Player.White ? 'w' : 'b');
fenBuilder.Append(' ');
bool hasAnyCastlingOptions = false;
if (CanWhiteCastleKingSide)
{
fenBuilder.Append('K');
hasAnyCastlingOptions = true;
}
if (CanWhiteCastleQueenSide)
{
fenBuilder.Append('Q');
hasAnyCastlingOptions = true;
}
if (CanBlackCastleKingSide)
{
fenBuilder.Append('k');
hasAnyCastlingOptions = true;
}
if (CanBlackCastleQueenSide)
{
fenBuilder.Append('q');
hasAnyCastlingOptions = true;
}
if (!hasAnyCastlingOptions)
{
fenBuilder.Append('-');
}
fenBuilder.Append(' ');
DetailedMove last;
if (Moves.Count > 0 && (last = Moves[Moves.Count - 1]).Piece is Pawn && Math.Abs(last.OriginalPosition.Rank - last.NewPosition.Rank) == 2
&& last.OriginalPosition.Rank == (last.Player == Player.White ? 2 : 7))
{
fenBuilder.Append(last.NewPosition.File.ToString().ToLowerInvariant());
fenBuilder.Append(last.Player == Player.White ? 3 : 6);
}
else
{
fenBuilder.Append("-");
}
fenBuilder.Append(' ');
fenBuilder.Append(_halfMoveClock);
fenBuilder.Append(' ');
fenBuilder.Append(_fullMoveNumber);
return fenBuilder.ToString();
}