Я увлекаюсь шахматами, смотрю стримы популярных шахматных блогеров и, конечно, не понаслышке знаю о тех пресловутых читерах, которых все ненавидят и банят на популярных шахматных порталах lichess.org и chess.com. Особенно после скандала с Хансом Нимманом и шариками в неположенном месте, стало крайне любопытно, как они это делают на практике. История с шариками пожалуй пусть останется для меня тайной, но просто сесть за компьютер, включить stockfish и пользоваться его подсказками для игры с соперниками пожалуй можно и мне как программисту захотелось реализовать это на практике.
Пожалуй самое простое включить на втором телефоне игру с компом и играть с ним повторяя ходы соперника. Кто-то использует ИИ и ставит Chessvision.AI, как тот признавшийся Никита. По сути обманывать может любой желающий, каких-то особых умений не требуется, но мне хотелось применить свои умения и сделать поудобнее. Зачем фоткать и отправлять позицию, повторять ходы параллельно, это же жутко не удобно!
Итак, что я хочу? Хочу начинать игру на lichess.org, и чтобы где-то рядом писались правильные ходы, чтобы победить. chess.com отметаем, он заблокирован в РФ на данный момент.
Для начала нужен шахматный движок stockfish, он есть в открытом доступе, но у него command-line интерфейс, а я на Java умею. Зачем изобретать велосипед, когда всё написано до нас, легкий гуглинг и вуаля: https://github.com/rahular/chess-misc, - готовый Stockfish.java, а сам exe-файл тут. Осталось его правильно подключить и использовать. Чтобы получить верный следующий ход, нужно передать движку текущую ситуацию на доске. Делается это с помощью Нотации Форсайта-Эдвардса или сокращенно FEN, подробнее тут.
Чтобы получить FEN, надо как-то считывать положение фигур на доске, но как? Анализировать экран с помощью ИИ? Да ну нет. Кто-то играет на lichess через приложение, но можно и через обычный браузер, а браузер показывает HTML, который можно считать, преобразовать в FEN и отдать движку. Получить в java-приложении код страницы в браузере, открытой перед тобой, не так то просто, но ведь как то же пишут тестировщики свои автотесты. Для тестирования веб-приложений используется Selenium, вот тут неплохая статья с примером. Скачивается специальный браузер chromedriver.exe - это обычный chrome, но с внешним интерфейсом для управления из приложения и считывания элементов страницы. Например, так можно считать фигуры на доске:
Фигурами заполняем массив 8 на 8 и переводим нашу доску с фигурами в FEN формат. Метод я где то нашел, даже не сам писал:
С помощью Selenium можно ещё автологин сделать, потом в цикле ждать пока появится доска и понеслась. Полученный лучший ход мне показалось удобным выводить в отдельное окно на Swing. В результате...
Всё получилось, конечно в пулю не поиграешь, но в блиц вполне можно успевать подглядывать и ходить. Исходники публиковать не буду по понятным причинам. Если есть идеи, как бы вы сделал это лучше или хотите рассказать о деструктивности подобных статей, добро пожаловать в комментарии.