mirror of
https://github.com/AlekseyLobanov/AlekseyLobanov.github.io.git
synced 2026-01-11 12:42:01 +03:00
14 lines
9.9 KiB
HTML
14 lines
9.9 KiB
HTML
<!DOCTYPE html><!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]--><!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]--><!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]--><!--[if gt IE 8]><!--><html class=no-js> <!--<![endif]--> <head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1"><title>Как я шахматного бота писал</title><meta name=description content><meta name=viewport content="width=device-width"><link rel=stylesheet href=../../theme/css/normalize.css><link href="https://fonts.googleapis.com/css?family=Forum|Oswald|PT+Sans|Philosopher|Ubuntu+Mono" rel=stylesheet><link rel=stylesheet href=../../theme/css/font-awesome.min.css><link rel=stylesheet href=../../theme/css/main.css><link rel=stylesheet href=../../theme/css/blog.css><link rel=stylesheet href=../../theme/css/github.css><link href=https://likemath.ru/feeds/all.atom.xml type=application/atom+xml rel=alternate title="Блог 529 Atom Feed"><link href=https://likemath.ru/feeds/all.rss.xml type=application/rss+xml rel=alternate title="Блог 529 RSS Feed"><script src=../../theme/js/vendor/modernizr-2.6.2.min.js></script></head> <body> <!--[if lt IE 7]>
|
||
<p class="chromeframe">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> or <a href="http://www.google.com/chromeframe/?redirect=true">activate Google Chrome Frame</a> to improve your experience.</p>
|
||
<![endif]--> <div id=wrapper> <header id=sidebar class=side-shadow> <hgroup id=site-header> <a id=site-title href=../..><h2><i class=icon-pencil></i> Блог 529</h2></a> <p id=site-desc> Project Euler и остальное </p> </hgroup> <nav> <ul id=nav-links> <li><a href=../../ >Главная</a></li> <li><a href=../../pages/projects.html>Мои проекты</a></li> <li><a href=../../pages/about.html>Об авторе</a></li> <li><a href=../../feeds/feed.atom.xml>Atom feed</a></li> </ul> </nav> <footer id=site-info> <p> Powered by Pelican. </p> </footer></header> <div id=post-container> <ol id=post-list> <li> <article class=post-entry> <header class=entry-header> <time class=post-time datetime=2016-01-10T13:35:00+03:00 pubdate> Вс 10 января 2016 </time> <a href=../../posts/kak-ia-shakhmatnogo-bota-pisal/ rel=bookmark><h1>Как я шахматного бота писал</h1></a> </header> <section class=post-content> <p>Лет 5 назад я достаточно активно играл в живые шахматы. Потом времени на это стало не хватать и постепенно перешёл на редкие партии в онлайне. Сейчас для игры я использую одно из самых популярных приложений вк. Это проще, чем использовать, к примеру, <span class=caps>FICS</span>. Предмет обсуждения появился из-за того, что я как-то раз встретился с соперником, который на все ходы потратил порядка 10 секунд, при этом не допустив значимых ошибок. Тогда я решил написать своего бота, чтобы узнать что с ним будет и столкнусь ли я с какими-нибудь подводными камнями.</p> <p>Целью было максимально быстрое написание максимально простого решения. Поэтому от разбора протокола я сразу отказался, тем более у меня не было подобного опыта ранее. Была мысль работать с <span class=caps>FICS</span> (у меня есть библиотека для работы с их протоколом), но поскольку я там не играю, то и результаты были бы не так интересны, во всяком случае, для меня. Таким образом, я писал простого кликера для приложения вк.</p> <p>Изначально хотелось найти доску и определить положения всех фигур, это было бы достаточно универсально, хотя и привязало бы меня к OpenCV. Тем не менее, решил не усложнять: можно определять только последний ход, а это можно сделать, проверяя цвет только одного пикселя.</p> <p>В самом скрипте около 200 строк на python. Очень сильно помогла библиотека chess, которая взяла на себя общение с движком (я использовал stockfish), проверку на допустимые ходы и определение мата. Некоторое время я уделил тому, чтобы сделать бота максимально похожим на человека, чтобы было невозможно выявить, что это бот полностью автоматическими средствами. По пунктам:</p> <ul> <li>Клик по полю в случайном месте, с распределением по Гауссу, центр которого не совпадает с центром клетки</li> <li>Случайное время хода, длительность которого распределена по Гауссу, причём средняя длительность хода изменяется, в зависимости от номера текущего хода.</li> <li>Прокладываются дополнительные точки, с распределением по Гауссу, при перемещении курсора от точки к точке.</li> </ul> <p>По факту, всё это было лишним, бан получить не удалось даже при простом клике из начальной точки в конечную.</p> <p>Примеры работы скрипта можно посмотреть <a href="https://www.youtube.com/watch?v=VvcyYfU31gU">тут</a> и <a href="https://www.youtube.com/watch?v=1WNxd0VTT2k">тут</a>, анализы двух сыгранных игр лежат <a href=http://ru.lichess.org/uP2Wg4dz>тут</a> и <a href=http://ru.lichess.org/8iRjSCDs>тут</a> (оппонент имеет рейтинг около 2100).</p> <p>На момент публикации аккаунт вполне жив. Рейтинг достиг некоторого потолка (около 2200), после которого найти игроков примерно равного рейтинга, <em>не являющихся ботами</em>, очень сложно. Сражаться же с ботами сильно сложнее, такую цель я не ставил. Интересно, хоть и ожидаемо, что при наборе рейтинга было достаточно личностей, для которых возможность того, что их нагло обманули, и они играли с ботом была столь неприятна, что они не могли сдерживаться. Например: <img alt="alt text" src=../../images/chessbot_msg1.png title="Одно из сообщений"></p> <p>p.s. Уже после создания рабочей версии от одного из оппонентов узнал про <a href=http://ru.lichess.org>lichess.org</a>. Это отличный ресурс на котором кроме, собственно, платформы для игры в шахматы (поддерживается большое количество их вариантов), есть тренировки по дебютам, анализ игр. Самое интересное — ресурс полностью открытый, все исходники есть на github.</p> <p>В процессе подготовки данного материала узнал про InternetChessKiller, который делает, фактически, тоже самое, что и мой скрипт, но без привязки к какой-то одной игровой площадке. Исходники старых версий можно найти, например, в <a href=https://github.com/gomoku/Internet-Chess-Killer>этом</a> репозитории.</p> <p>p.p.s. Боты на серверах, предназначенных для людей, играющие в игры, которые предназначены для людей очень сильно мешают людям. Тем не менее, проверять, насколько сильно они мешают не нужно!</p> </section> <hr> <aside class=post-meta> <p>Категория: <a href=../../category/proekty.html>Проекты</a></p> <p>Теги: <a href=../../tag/proekt.html>проект</a>, <a href=../../tag/shakhmaty.html>шахматы</a>, <a href=../../tag/bot.html>бот</a>, </p> </aside> <hr> </article> </li> </ol> </div> </div> <script type=text/javascript>
|
||
var _paq = _paq || [];
|
||
_paq.push(['trackPageView']);
|
||
_paq.push(['enableLinkTracking']);
|
||
(function() {
|
||
var u="https://piwik.likemath.ru/";
|
||
_paq.push(['setTrackerUrl', u+'piwik.php']);
|
||
_paq.push(['setSiteId', '1']);
|
||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||
g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s);
|
||
})();
|
||
</script> <script src=../../theme/js/main.js></script> </body> </html> |