Просто, чтобы получить базовую часть, вы можете сделать что-то вроде (примечание: не проверено):
public enum ChessPieces
{
King, Queen, Rook, // ... etc.
}
public class ChessPiece : MonoBehavior
{
public string FenId { get; }
private readonly Dictionary<ChessPiece, string> FenIds = {
{ ChessPieces.King, "K" },
{ ChessPieces.Queen, "Q" },
// ... etc.
};
// assuming you create the set of pieces programatically, use this constructor
public ChessPiece(ChessPiece piece, ChessColor color)
{
FenId = color == ChessColor.Black
? FenIds[piece].ToLower()
: FenIds[piece].ToUpper();
}
}
Затем, если вы храните свою доску в массиве строк, выгрузить раскладку встрока, которую я, вероятно, переопределил бы ToString
в своем классе ChessBoard
(также не тестирован):
// somewhere in your code set the board up
_chessBoard.Rows.Add(new [] {
new ChessPiece(ChessPieces.Rook, ChessColor.Black),
new ChessPiece(ChessPieces.Knight, ChessColor.Black),
// ... etc.
})
_chessBoard.Rows.Add(new [] { /* next row ... */ });
// ... etc.
// to create your output, put this into the override of ToString:
var output = ""; // should be StringBuilder, but for clarity and since this isn't likely performance limiting...
var rowIndex = 0;
foreach (var row in _chessBoard.Rows)
{
rowIndex++;
var blankSpaces = 0;
foreach(var piece in row)
{
if (piece == null)
{
blankSpaces++;
}
else
{
output += blankSpaces == 0
? piece.FenId
: string.Format("{0}{1}", blankspaces, piece.FenId);
blankSpaces = 0;
}
if (blankSpaces > 0)
{
output += blankSpaces;
}
}
if (rowIndex != 8)
{
output += "/";
}
}
На данный момент у вас есть базовый макет в строке, и вы должны иметь базовыйИдея добавления других полей FEN.
Следует отметить, что я выбрал коллекцию массивов для хранения вашей доски.Вероятно, это не самый эффективный механизм хранения (т. Е. В лучшем случае вы храните 50% пустых значений, которые будут увеличиваться только по мере прохождения игры), но, поскольку мы говорим только о 64 элементах, мы, вероятно,хорошо на память.