Да, абсолютно! Именно так и работает код через ProcessBuilder, который я показал выше: внешняя программа запускается заново на каждый ход, делает расчёт, выдаёт ответ в консоль и сразу закрывается.
В Java аналогом классической функции
system() из C++ является метод Runtime.getRuntime().exec(). Он делает ровно то же самое — запускает программу с нуля.Однако, передать данные в запущенную программу через обычную команду
system("engine.exe") неудобно, потому что она не умеет передавать аргументы через стандартный ввод. Чтобы программа запускалась каждый раз заново и сразу получала позицию, проще всего передавать доску как аргумент командной строки (прямо при запуске, например: engine.exe 011200...).Вот как будет выглядеть этот максимально простой вариант в Java:
Код на стороне Java (Запуск каждый раз с нуля)
Вставьте этот метод в наш графический интерфейс. Он будет вызываться только в момент, когда должен походить движок:
Как в этом случае должен принимать данные сам движок (engine.exe)?
Так как программа запускается каждый раз заново, она должна принимать позицию через аргументы функции
main (массив argv в C++ / C# или sys.argv в Python).Пример простейшего движка на C++ под такую логику:
Плюсы такого подхода
- Идеальная изоляция: Движок гарантированно очищает за собой память (ОЗУ) после каждого хода, так как операционная система полностью закрывает процесс. Вы можете не бояться утечек памяти в коде движка.
- Простейший код: Не нужно настраивать сложные двусторонние потоки данных, открывать сессии или писать JNI-обертки. Передал аргумент при старте — забрал строчку на выходе.
Если вы хотите интегрировать этот метод в наш готовый графический интерфейс, дайте знать: я подскажу, в какое место метода
handleMouseClick его прописать, чтобы он автоматически срабатывал сразу после хода игрока.
Комментариев нет:
Отправить комментарий