Создать строку FEN в Unity после прочтения шахматной доски - PullRequest
0 голосов
/ 31 января 2019

Я сделал полнофункциональную игру в шахматы в Unity, используя C #.Теперь я хочу добавить AI, для шахматного движка я пошел с Stockfish.У меня есть движок внутри игры, но он ничего не делает, потому что не может общаться с доской.

Для связи мне нужно сделать строку FEN для каждой строки, начиная с верхнего левого края, строка FEN выглядит следующим образом: rnbqkbnr / pppppppp / 8/8/8/8 / PPPPPPPPP / RNBQKBNR w KQkq - 01

строчные буквы - это черные фигуры, верхние регистры - белые фигуры, цифры - черные пробелы, w - поворот на белый, следующий, KQkq - доступная рокировка, - означает, что en passant доступен, и 0 1 количество ходов.

Кто-нибудь знает учебник или советы по созданию и манипулированию строками для создания строки FEN?

Я вставлю код, который я сделал до сих пор, в процесс Stockfish, я еще не сделалвсе, что связано со строкой FEN, потому что я действительно не знаю, как ее запустить.

Любые ссылки или советы приветствуются

void RunProcess()
{
    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.UseShellExecute = false;
    startInfo.RedirectStandardInput = true;
    startInfo.RedirectStandardOutput = true;
    startInfo.RedirectStandardError = false;
    startInfo.CreateNoWindow = true;
    startInfo.FileName = Application.streamingAssetsPath + "/stockfish_9_x64.exe";

    Process process = new Process();
    process.StartInfo = startInfo;
    process.Start();

    string output;

    process.StandardInput.WriteLine("uci");
    process.StandardInput.WriteLine("isready");
    process.StandardInput.WriteLine("position fen rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1");
    process.StandardInput.WriteLine("go");
    process.StandardInput.WriteLine("stop");
    process.StandardInput.WriteLine("quit");

    do
    {
        output = process.StandardOutput.ReadLine();
    } while (!output.Contains("move"));

    UnityEngine.Debug.Log(output);
}

void OnMouseDown()
{
    RunProcess();
}

1 Ответ

0 голосов
/ 01 февраля 2019

Просто, чтобы получить базовую часть, вы можете сделать что-то вроде (примечание: не проверено):

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 элементах, мы, вероятно,хорошо на память.

...