mirror of
https://github.com/AlekseyLobanov/AlekseyLobanov.github.io.git
synced 2026-01-11 20:52:01 +03:00
114 lines
12 KiB
HTML
114 lines
12 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='http://fonts.googleapis.com/css?family=Philosopher&subset=latin,cyrillic' rel='stylesheet' type='text/css'>
|
||
<link href='http://fonts.googleapis.com/css?family=Forum&subset=cyrillic' rel='stylesheet' type='text/css'>
|
||
<link href='//fonts.googleapis.com/css?family=Oswald' rel='stylesheet' type='text/css'>
|
||
<link href='http://fonts.googleapis.com/css?family=Ubuntu+Mono' rel='stylesheet' type='text/css'>
|
||
<link href='http://fonts.googleapis.com/css?family=PT+Sans' rel='stylesheet' type='text/css'>
|
||
<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="http://likemath.ru/feeds/all.atom.xml" type="application/atom+xml" rel="alternate" title="Блог 529 Atom Feed" />
|
||
<link href="http://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-coffee"></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/>
|
||
<div class="comments">
|
||
<div id="disqus_thread"></div>
|
||
<script type="text/javascript">
|
||
var disqus_shortname = 'likemath';
|
||
(function() {
|
||
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
|
||
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
|
||
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
|
||
})();
|
||
</script>
|
||
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
|
||
<a href="http://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>
|
||
</div>
|
||
</article>
|
||
</li>
|
||
</ol>
|
||
</div>
|
||
</div>
|
||
|
||
<script>
|
||
var _gaq=[['_setAccount','UA-62001537-1'],['_trackPageview']];
|
||
(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];
|
||
g.src=('https:'==location.protocol?'//ssl':'//www')+'.google-analytics.com/ga.js';
|
||
s.parentNode.insertBefore(g,s)}(document,'script'));
|
||
</script>
|
||
<script src="../../theme/js/main.js"></script>
|
||
</body>
|
||
</html> |