{"id":336920,"date":"2022-08-12T03:00:19","date_gmt":"2022-08-12T03:00:19","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=336920"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=336920","title":{"rendered":"<span>\u0428\u0430\u0445\u043c\u0430\u0442\u044b \u043d\u0430 C++<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041d\u0435 \u0442\u0430\u043a \u0434\u0430\u0432\u043d\u043e \u044f \u0437\u0430\u0445\u043e\u0442\u0435\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a. \u041d\u0430 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043d\u0430\u0448\u043b\u043e\u0441\u044c \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0445\u043e\u0440\u043e\u0448\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443. \u0411\u044b\u043b\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u0441 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043b\u0430\u0431\u044b\u043c\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438, \u043c\u043d\u043e\u0433\u0438\u0435 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0430\u0436\u0435 \u0443\u043c\u0443\u0434\u0440\u044f\u043b\u0438\u0441\u044c \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0430\u0436\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430. \u0410 \u0431\u044b\u043b\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u0441 \u0445\u043e\u0440\u043e\u0448\u0438\u043c\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438 (\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u043d\u0438\u0445 \u0431\u044b\u043b\u0438 \u0434\u0430\u0436\u0435 \u0447\u0443\u0442\u044c \u043b\u0443\u0447\u0448\u0435 \u0447\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0443 \u043c\u0435\u043d\u044f \u0432 \u0438\u0442\u043e\u0433\u0435), \u043d\u043e \u0442\u0430\u043c \u0430\u0432\u0442\u043e\u0440\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043b\u0438\u0448\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0438\u0434\u0435\u0438, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0441\u0432\u043e\u0435 \u043f\u043e \u0442\u0430\u043a\u0438\u043c \u0441\u0442\u0430\u0442\u044c\u044f\u043c \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e, \u0434\u0430\u0431\u044b \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u0436\u0438\u0437\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u043c\u0441\u044f \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0442\u0435\u043c\u0435. \u042f \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u044e \u043d\u0430 \u043b\u0443\u0447\u0448\u0443\u044e \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0438\u043b\u0438 \u043d\u0430 \u0447\u0438\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u043a\u043e\u0434, \u043d\u043e \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0431\u0443\u0434\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u0438\u043c \u0438 \u043b\u0435\u0433\u043a\u0438\u043c \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0445\u043e\u0447\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0441\u0432\u043e\u0435.<\/p>\n<h2>\u0411\u0438\u0442\u0431\u043e\u0440\u0434\u044b \u0438\u043b\u0438 \u0431\u0438\u0442\u043e\u0432\u044b\u0435 \u0434\u043e\u0441\u043a\u0438<\/h2>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u043a\u0438, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0430\u044f \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u0430\u043c\u0438 \u0438\u043b\u0438 \u0431\u0438\u0442\u043e\u0432\u044b\u043c\u0438 \u0434\u043e\u0441\u043a\u0430\u043c\u0438, \u0435\u0441\u043b\u0438 \u043f\u043e-\u0440\u0443\u0441\u0441\u043a\u0438. \u0418\u0434\u0435\u044f \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u043e\u0432 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u043d\u0430 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0438: \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u0430\u044f \u0434\u043e\u0441\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 64 \u043a\u043b\u0435\u0442\u043a\u0438, \u043a\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u044b \u0443\u043c\u0435\u044e\u0442 \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 64 \u0431\u0438\u0442\u043e\u0432\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c 12 \u0442\u0430\u043a\u0438\u0445 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u043e\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0444\u0438\u0433\u0443\u0440. \u041a\u0430\u0436\u0434\u044b\u0439 \u0442\u0430\u043a\u043e\u0439 \u0431\u0438\u0442\u0431\u043e\u0440\u0434 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0444\u0438\u0433\u0443\u0440\u0443 (\u0438\u043b\u0438 \u043f\u0435\u0448\u043a\u0443), \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 &#8212; \u043e\u0434\u0438\u043d \u0431\u0438\u0442\u0431\u043e\u0440\u0434 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0447\u0435\u0440\u043d\u044b\u0445 \u043a\u043e\u043d\u0435\u0439, \u0434\u0440\u0443\u0433\u043e\u0439 &#8212; \u0437\u0430 \u0431\u0435\u043b\u044b\u0435 \u043f\u0435\u0448\u043a\u0438, \u0442\u0440\u0435\u0442\u0438\u0439 &#8212; \u0437\u0430 \u0447\u0435\u0440\u043d\u043e\u0433\u043e \u043a\u043e\u0440\u043e\u043b\u044f.<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432\u044b\u0431\u043e\u0440\u0430 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u043e\u0432, \u0430 \u043d\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0430 64 \u043a\u043b\u0435\u0442\u043a\u0438 &#8212; \u0432\u044b\u0441\u043e\u043a\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438, \u043a\u0430\u043a, \u044d\u0442\u043e \u043d\u0435 \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u0443\u0434\u043e\u0431\u043d\u043e\u0441\u0442\u044c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u043f\u0435\u0448\u043a\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u043d\u043e\u0439. \u041f\u0440\u043e\u0445\u043e\u0434\u043d\u0430\u044f \u043f\u0435\u0448\u043a\u0430, \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438, \u044d\u0442\u043e<\/p>\n<blockquote>\n<p><a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D0%B5%D1%88%D0%BA%D0%B0\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0448\u043a\u0430<\/a>, \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438 \u043f\u0435\u0440\u0435\u0434 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u0435\u0448\u043a\u0438 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u0430, \u0430 \u043d\u0430<br \/>\u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044f\u0445 \u0438\u043b\u0438 \u043d\u0435\u0442 \u043f\u0435\u0448\u0435\u043a \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u0430 \u0438\u043b\u0438 \u043e\u043d\u0438 \u043d\u0435 \u0434\u0435\u0440\u0436\u0430\u0442 \u043f\u043e\u0434 \u0431\u043e\u0435\u043c<br \/>\u043f\u043e\u043b\u044f, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0435\u0448\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u043e\u0439\u0442\u0438 \u0434\u043e \u043f\u043e\u043b\u044f <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D1%80%D0%B5%D0%B2%D1%80%D0%B0%D1%89%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B5%D1%88%D0%BA%D0%B8\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f<\/a>.<\/p>\n<\/blockquote>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 64 \u043a\u043b\u0435\u0442\u043e\u043a, \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u0432 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0446\u0435\u043b\u044b\u0445 18 \u043a\u043b\u0435\u0442\u043e\u043a \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0435\u0448\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u043d\u044b\u043c\u0438, \u0430 \u043a\u0430\u043a\u0438\u0435 \u043d\u0435\u0442. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u044b, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0430 \u043a\u0430\u043a\u0438\u0445 \u043a\u043b\u0435\u0442\u043a\u0430\u0445 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u0442\u043e\u044f\u0442\u044c \u043f\u0435\u0448\u043a\u0438 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0448\u043a\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u043b\u0430\u0441\u044c \u043f\u0440\u043e\u0445\u043e\u0434\u043d\u043e\u0439, \u0430 \u0437\u0430\u0442\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0447\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u043f\u0435\u0448\u043a\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u043d\u043e\u0439 \u0437\u0430 \u043e\u0434\u043d\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043f\u043e\u0431\u0438\u0442\u043e\u0432\u043e\u0433\u043e &#171;\u0438&#187;.<\/p>\n<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430\u0448\u0438\u0445 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u043e\u0432. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438\u0445 \u043d\u0435 \u043d\u0430\u0434\u043e, \u0432\u0435\u0434\u044c \u0431\u0438\u0442\u0431\u043e\u0440\u0434 &#8212; \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f 64 \u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430. \u0422\u0430\u043a \u0447\u0442\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">typedef uint64_t Bitboard;<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0449\u0430\u044e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0431\u0435\u0437\u0437\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u0438\u0442\u043e\u0432\u044b\u0435 \u0441\u0434\u0432\u0438\u0433\u0438, \u0430 \u0431\u0438\u0442\u043e\u0432\u044b\u0435 \u0441\u0434\u0432\u0438\u0433\u0438 \u0441\u043e \u0437\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0435 \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 (\u0432\u0435\u0434\u044c 1 \u0431\u0438\u0442 \u0438\u0437 64 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0437\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0437\u043d\u0430\u043a \u0447\u0438\u0441\u043b\u0430 \u0438 \u0435\u0433\u043e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u0442\u0440\u043e\u0433\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442).<\/p>\n<p>\u041d\u043e \u0441 \u043e\u0434\u043d\u0438\u043c \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0436\u0438\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0433\u0440\u0443\u0441\u0442\u043d\u043e, \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u0436\u0438\u0437\u043d\u044c.<\/p>\n<pre><code class=\"cpp\">static constexpr void set_1(Bitboard &amp;bb, uint8_t square) {         bb = bb | (1ull &lt;&lt; square); } static constexpr void set_0(Bitboard &amp;bb, uint8_t square) {      bb = bb &amp; (~(1ull &lt;&lt; square)); }   static constexpr bool get_bit(Bitboard bb, uint8_t square) {     return (bb &amp; (1ull &lt;&lt; square)); }<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0432\u0430\u043c\u0438 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u0430\u043c \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443. \u041d\u0443\u0436\u043d\u043e \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0438\u0445 \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0435, \u043d\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u0431\u0435\u0437 \u043d\u0438\u0445 \u043d\u0438\u043a\u0443\u0434\u0430.<\/p>\n<p>\u0415\u0449\u0435 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0445 \u0431\u0438\u0442\u043e\u0432. \u042d\u0442\u043e \u0437\u043d\u0430\u043d\u0438\u0435 \u043d\u0443\u0436\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u043e\u0446\u0435\u043d\u043a\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438. \u0427\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0445\u043e\u0440\u043e\u0448\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043d\u0430\u0434\u043e, \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c, \u0443\u0437\u043d\u0430\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0438\u0433\u0443\u0440 \u0443 \u0431\u0435\u043b\u044b\u0445 \u0438 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0438\u0433\u0443\u0440 \u0443 \u0447\u0435\u0440\u043d\u044b\u0445, \u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u0438\u0445 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c.<\/p>\n<p>\u041d\u043e \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c? \u0421\u0430\u043c\u043e\u0435 \u043d\u0430\u0438\u0432\u043d\u043e\u0435 \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c &#8212; \u043f\u0440\u043e\u0439\u0442\u0438 \u043f\u043e \u0432\u0441\u0435\u043c 64 \u0431\u0438\u0442\u0430\u043c \u0438 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u043d\u043e \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043d\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e. \u041d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u0435\u0441\u0442\u044c <a href=\"https:\/\/habr.com\/ru\/post\/276957\/\" rel=\"noopener noreferrer nofollow\">\u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430 \u0445\u0430\u0431\u0440\u0435<\/a>, \u043d\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 bit, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0433\u043e\u0442\u043e\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439:<\/p>\n<pre><code class=\"cpp\">static constexpr uint8_t count_1(Bitboard bb) {         return std::popcount(bb); }<\/code><\/pre>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u0435\u0449\u0435 \u0434\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438: \u043f\u043e\u0438\u0441\u043a \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u0433\u043e \u0431\u0438\u0442\u0430 \u0438 \u043f\u043e\u0438\u0441\u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e. \u0414\u043b\u044f \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438 \u0434\u0430\u0436\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u0445. \u041d\u043e \u044f \u0438\u043c\u0438 \u0440\u0435\u0448\u0438\u043b \u043d\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u043f\u043b\u043e\u0445\u043e \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u0438 (\u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u0432 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c. \u041e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c \u0435\u0433\u043e \u044f \u043d\u0435 \u0431\u0443\u0434\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0443\u0439\u0434\u0435\u0442 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438 \u043d\u0430 \u0432\u0435\u0441\u044c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u0432\u0438\u0436\u043e\u043a, \u0430 \u044d\u0442\u043e \u044f\u0432\u043d\u043e \u043d\u0435 \u0442\u043e \u0437\u0430\u0447\u0435\u043c \u0441\u044e\u0434\u0430 \u043f\u0440\u0438\u0448\u043b\u0438 \u043b\u044e\u0434\u0438, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u044d\u0442\u0443 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, <a href=\"https:\/\/www.chessprogramming.org\/BitScan\" rel=\"noopener noreferrer nofollow\">\u0432\u0437\u044f\u0442\u0443\u044e \u0441 chessprogrammingwiki<\/a>:<\/p>\n<pre><code class=\"cpp\">static constexpr std::array&lt;uint8_t, 64> BitScanTable = {             0, 47,  1, 56, 48, 27,  2, 60,             57, 49, 41, 37, 28, 16,  3, 61,             54, 58, 35, 52, 50, 42, 21, 44,             38, 32, 29, 23, 17, 11,  4, 62,             46, 55, 26, 59, 40, 36, 15, 53,             34, 51, 20, 43, 31, 22, 10, 45,             25, 39, 14, 33, 19, 30,  9, 24,             13, 18,  8, 12,  7,  6,  5, 63 };   static constexpr uint8_t bsf(Bitboard bb) {     return BitboardOperations::BitScanTable[((bb ^ (bb - 1)) * 0x03f79d71b4cb0a89) >> 58]; } static constexpr uint8_t bsr(Bitboard bb) {     bb = bb | (bb >> 1);     bb = bb | (bb >> 2);     bb = bb | (bb >> 4);     bb = bb | (bb >> 8);     bb = bb | (bb >> 16);     bb = bb | (bb >> 32);      return BitboardOperations::BitScanTable[(bb * 0x03f79d71b4cb0a89) >> 58]; }<\/code><\/pre>\n<p>\u0415\u0449\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u044b \u0441 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c\u0438 \u0438 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0435\u0449\u0435 \u044d\u0442\u043e\u0442 \u043a\u0443\u0441\u043e\u043a \u043a\u043e\u0434\u0430:<\/p>\n<pre><code class=\"cpp\">namespace BitboardRows {     static consteval std::array&lt;Bitboard, 8> calc_rows() {         std::array&lt;Bitboard, 8> rows{};          for (uint8_t y = 0; y &lt; 8; y = y + 1) {             for (uint8_t x = 0; x &lt; 8; x = x + 1) BitboardOperations::set_1(rows[y], y * 8 + x);         }          return rows;     }       static constexpr std::array&lt;Bitboard, 8> Rows = BitboardRows::calc_rows();       static consteval std::array&lt;Bitboard, 8> calc_inversion_rows() {         std::array&lt;Bitboard, 8> inversion_rows{};          for (uint8_t i = 0; i &lt; 8; i = i + 1) inversion_rows[i] = ~Rows[i];          return inversion_rows;     }       static constexpr std::array&lt;Bitboard, 8> InversionRows = BitboardRows::calc_inversion_rows(); }   namespace BitboardColumns {     static consteval std::array&lt;Bitboard, 8> calc_columns() {         std::array&lt;Bitboard, 8> columns{};          for (uint8_t x = 0; x &lt; 8; x = x + 1) {             for (uint8_t y = 0; y &lt; 8; y = y + 1) BitboardOperations::set_1(columns[x], y * 8 + x);         }          return columns;     }       static constexpr std::array&lt;Bitboard, 8> Columns = BitboardColumns::calc_columns();       static consteval std::array&lt;Bitboard, 8> calc_inversion_columns() {         std::array&lt;Bitboard, 8> inversion_columns{};          for (uint8_t i = 0; i &lt; 8; i = i + 1) inversion_columns[i] = ~Columns[i];          return inversion_columns;     }       static constexpr std::array&lt;Bitboard, 8> InversionColumns = BitboardColumns::calc_inversion_columns(); }<\/code><\/pre>\n<p>\u041e\u043d \u0441\u0443\u043f\u0435\u0440 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u0441\u0434\u0432\u0438\u0433\u043e\u0432, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.<\/p>\n<h2>\u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0444\u0438\u0433\u0443\u0440<\/h2>\n<p>\u0418\u0437 \u0447\u0435\u0433\u043e \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0432 \u0448\u0430\u0445\u043c\u0430\u0442\u0430\u0445? \u0418\u0437 \u043f\u0440\u0430\u0432 \u043d\u0430 \u0440\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443, \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043f\u0440\u0430\u0432\u0438\u043b \u043f\u0440\u043e \u0442\u0440\u043e\u0435\u043a\u0440\u0430\u0442\u043d\u043e\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438, \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 50 \u0445\u043e\u0434\u043e\u0432 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435, \u043d\u043e \u0431\u0430\u0437\u0430 &#8212; \u044d\u0442\u043e \u0444\u0438\u0433\u0443\u0440\u044b \u0438 \u043f\u0435\u0448\u043a\u0438. \u0421\u0435\u0439\u0447\u0430\u0441 \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0444\u0438\u0433\u0443\u0440\u044b \u0438 \u043f\u0435\u0448\u043a\u0438. \u041d\u043e \u043a\u0430\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0438\u043f\u044b \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430? \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, 12 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u043e\u0432 \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u044b\u043b \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435, \u043d\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u043b\u043e. \u0422\u0430\u043a \u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u044b \u0432\u0441\u0435\u0445 \u0431\u0435\u043b\u044b\u0445 \u0438 \u0432\u0441\u0435\u0445 \u0447\u0435\u0440\u043d\u044b\u0445 \u0444\u0438\u0433\u0443\u0440, \u0432\u0441\u0435\u0445 \u0444\u0438\u0433\u0443\u0440 \u0432\u043e\u043e\u0431\u0449\u0435, \u0438 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u044b, \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0435 \u044d\u0442\u0438\u043c \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u0430\u043c. \u0422\u0430\u043a\u0438\u0435 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 12 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u043e\u0432 \u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u043e\u0432. \u041d\u043e \u0437\u0430\u0447\u0435\u043c \u043e\u043d\u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0445\u043e\u0434\u043e\u0432. \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0445\u043e\u0434\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u043d\u044f, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043b\u0438 \u0432 \u043a\u043b\u0435\u0442\u043a\u0435 \u0444\u0438\u0433\u0443\u0440\u0430 \u0442\u043e\u0433\u043e \u0436\u0435 \u0446\u0432\u0435\u0442\u0430, \u0447\u0442\u043e \u0438 \u043a\u043e\u043d\u044c, \u0438 \u0435\u0441\u043b\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f &#8212; \u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u0445\u043e\u0434 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u0430 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u043e \u0432 \u043a\u043e\u0434\u0435. \u0412\u043e\u0442 \u0442\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442:<\/p>\n<pre><code class=\"cpp\">std::array&lt;std::array&lt;Bitboard, 6>, 2> _piece_bitboards{}; std::array&lt;Bitboard, 2> _side_bitboards{}; std::array&lt;Bitboard, 2> _inversion_side_bitboards{}; Bitboard _all; Bitboard _empty;<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u0446\u0438\u0438 \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b. \u0412\u043e\u0442 \u043e\u043d\u0438:<\/p>\n<pre><code class=\"cpp\">static constexpr uint8_t Pawn = 0; static constexpr uint8_t Knight = 1; static constexpr uint8_t Bishop = 2; static constexpr uint8_t Rook = 3; static constexpr uint8_t Queen = 4; static constexpr uint8_t King = 5;  static constexpr uint8_t White = 0; static constexpr uint8_t Black = 1;<\/code><\/pre>\n<p>\u0422\u0430\u043a \u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0443\u044e \u0431\u0435\u043b\u043e\u0435 \u0432 \u0447\u0435\u0440\u043d\u043e\u0435, \u0430 \u0447\u0435\u0440\u043d\u043e\u0435 \u0432 \u0431\u0435\u043b\u043e\u0435. \u0422\u0430\u043a \u043a\u0430\u043a \u0431\u0435\u043b\u043e\u0435 \u0438 \u0447\u0435\u0440\u043d\u043e\u0435 \u0443 \u043d\u0430\u0441 \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043e \u043a\u0430\u043a 0 \u0438 1, \u0442\u043e \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0446\u0432\u0435\u0442\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0442\u0440\u0438\u0446\u0430\u043d\u0438\u0435:<\/p>\n<pre><code class=\"cpp\">uint8_t Pieces::inverse(uint8_t side) {     return !side; }<\/code><\/pre>\n<p>\u0415\u0449\u0435 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b:<\/p>\n<pre><code class=\"cpp\">bool operator ==(Pieces left, Pieces right) {     for (uint8_t i = 0; i &lt; 2; i = i + 1) {         for (uint8_t j = 0; j &lt; 6; j = j + 1) {             if (left._piece_bitboards[i][j] != right._piece_bitboards[i][j]) return false;         }     }      return true; }<\/code><\/pre>\n<p>\u0423\u0436\u0435 \u0431\u044b\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u043f\u0440\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0444\u0438\u0433\u0443\u0440, \u043d\u043e \u0435\u0449\u0435 \u043d\u0435 \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u043a\u0430 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u043a\u0430\u043a \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u044b.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e \u0432\u0442\u043e\u0440\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u044b\u0445 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u0430\u0445, \u0442\u043e \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435:<\/p>\n<pre><code class=\"cpp\">void Pieces::update_bitboards() {     this->_side_bitboards[Pieces::White] = this->_piece_bitboards[Pieces::White][Pieces::Pawn] |                                            this->_piece_bitboards[Pieces::White][Pieces::Knight] |                                            this->_piece_bitboards[Pieces::White][Pieces::Bishop] |                                            this->_piece_bitboards[Pieces::White][Pieces::Rook] |                                            this->_piece_bitboards[Pieces::White][Pieces::Queen] |                                            this->_piece_bitboards[Pieces::White][Pieces::King];      this->_side_bitboards[Pieces::Black] = this->_piece_bitboards[Pieces::Black][Pieces::Pawn] |                                            this->_piece_bitboards[Pieces::Black][Pieces::Knight] |                                            this->_piece_bitboards[Pieces::Black][Pieces::Bishop] |                                            this->_piece_bitboards[Pieces::Black][Pieces::Rook] |                                            this->_piece_bitboards[Pieces::Black][Pieces::Queen] |                                            this->_piece_bitboards[Pieces::Black][Pieces::King];      this->_inversion_side_bitboards[Pieces::White] = ~this->_side_bitboards[Pieces::White];     this->_inversion_side_bitboards[Pieces::Black] = ~this->_side_bitboards[Pieces::Black];      this->_all = this->_side_bitboards[Pieces::White] | this->_side_bitboards[Pieces::Black];     this->_empty = ~this->_all; }<\/code><\/pre>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u0433\u043e \u0431\u0438\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435. \u041c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c \u043f\u043e \u0434\u043e\u0441\u043a\u0435 \u0438, \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u044b\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c, \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u0438\u0433\u0443\u0440\u044b. \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0442\u0443\u0442 \u043e\u0441\u043e\u0431\u043e \u043d\u0435\u0432\u0430\u0436\u043d\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0440\u0430\u0439\u043d\u0435 \u0440\u0435\u0434\u043a\u043e, \u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0448\u043e\u0442\u043b\u0430\u043d\u0434\u0441\u043a\u043e\u0433\u043e \u0448\u0430\u0445\u043c\u0430\u0442\u0438\u0441\u0442\u0430, \u0424\u043e\u0440\u0441\u0430\u0439\u0442\u0430 \u042d\u0434\u0432\u0430\u0440\u0434\u0441\u0430, \u0438\u043b\u0438 FEN \u043d\u043e\u0442\u0430\u0446\u0438\u0438 (\u0430\u043d\u0433\u043b. <em>Forsyth\u2013Edwards Notation).<\/em><\/p>\n<p>\u0418\u0434\u0435\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0444\u0438\u0433\u0443\u0440 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 (\u0442\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u043e\u044f\u0442 \u0444\u0438\u0433\u0443\u0440\u044b \u0447\u0435\u0440\u043d\u044b\u0445 \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0440\u0430\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435). \u041a\u0430\u0436\u0434\u043e\u0439 \u0444\u0438\u0433\u0443\u0440\u0430 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u043e\u0439 \u0431\u0443\u043a\u0432\u043e\u0439 \u0438\u0437 \u0435\u0435 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u043d\u044f: \u043e\u043d \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u043a\u0432\u043e\u0439, \u0442\u0430\u043a \u043a\u0430\u043a \u0431\u0443\u043a\u0432\u0430 k \u0443\u0436\u0435 \u0437\u0430\u043d\u044f\u0442\u0430 \u043a\u043e\u0440\u043e\u043b\u0435\u043c. \u041f\u0440\u0438\u0447\u0435\u043c \u0435\u0441\u043b\u0438 \u0444\u0438\u0433\u0443\u0440\u0430 \u0447\u0435\u0440\u043d\u0430\u044f, \u0442\u043e \u043e\u043d\u0430 \u0441\u0442\u043e\u0438\u0442 \u0432 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435, \u0430 \u0435\u0441\u043b\u0438 \u0431\u0435\u043b\u0430\u044f &#8212; \u0442\u043e \u0432 \u0431\u043e\u043b\u044c\u0448\u043e\u043c. \u0415\u0441\u043b\u0438 \u043a\u043b\u0435\u0442\u043a\u0430 \u043f\u0443\u0441\u0442\u0430, \u0442\u043e \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u0438\u0447\u043a\u0430. \u0415\u0441\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u0435\u0442\u043e\u043a \u043f\u043e\u0434\u0440\u044f\u0434 \u043f\u0443\u0441\u0442\u044b, \u0442\u043e \u0446\u0438\u0444\u0440\u0430, \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0449\u0430\u044f \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u0435\u0442\u043e\u043a \u043f\u0443\u0441\u0442\u043e \u043f\u043e\u0434\u0440\u044f\u0434. \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0431\u044b\u043b\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c <strong>\/<\/strong> \u0438 \u0438\u0434\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0441\u0442\u0440\u043e\u043a\u0435 \u043d\u0438\u0436\u0435. \u0422\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u043a\u0430 \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u044b. \u041d\u0438\u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"185\" width=\"185\">\n<p align=\"left\">\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">rnbqkbnr\/pppppppp\/8\/8\/8\/8\/PPPPPPPP\/RNBQKBNR<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"185\" width=\"185\">\n<p align=\"left\">\u041f\u043e\u0441\u043b\u0435 \u0445\u043e\u0434\u0430 e2e4<\/p>\n<\/td>\n<td>\n<p align=\"left\">rnbqkbnr\/pppppppp\/8\/8\/4P3\/8\/PPPP1PPP\/RNBQKBNR<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"185\" width=\"185\">\n<p align=\"left\">\u041f\u043e\u0441\u043b\u0435 \u0445\u043e\u0434\u0430 d7d5<\/p>\n<\/td>\n<td>\n<p align=\"left\">rnbqkbnr\/ppp1pppp\/8\/3p4\/4P3\/8\/PPPP1PPP\/RNBQKBNR<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0412\u0441\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e. \u042f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u043c\u0430\u043d\u0443\u043b \u0438 \u044d\u0442\u043e \u043d\u0435 \u0432\u0441\u0435 \u043f\u0440\u043e FEN \u043d\u043e\u0442\u0430\u0446\u0438\u044e, \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u0447\u0430\u0441\u0442\u044c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u043d\u043e\u043c\u0435\u0440 \u0445\u043e\u0434\u0430, \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0440\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443, \u0431\u0438\u0442\u043e\u0435 \u043f\u043e\u043b\u0435 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435, \u043d\u043e \u043d\u0430\u043c \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f.<\/p>\n<p>\u0417\u043d\u0430\u044f \u044d\u0442\u043e, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0432\u043e\u0442 \u043a\u043e\u0434 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0432\u0441\u0435 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u044b \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 FEN \u0441\u0442\u0440\u043e\u043a\u0438:<\/p>\n<pre><code class=\"cpp\">Pieces::Pieces(const std::string&amp; short_fen) {     uint8_t x = 0;     uint8_t y = 7;      uint8_t side;      for (auto buff : short_fen) {         if (buff == '\/') {             x = 0;             y = y - 1;         }         else if (std::isdigit(buff)) {             x = x + buff - '0';         }         else {             if (std::isupper(buff)) {                 buff = std::tolower(buff);                 side = Pieces::White;             }             else side = Pieces::Black;              switch (buff) {                 case 'p': BitboardOperations::set_1(this->_piece_bitboards[side][Pieces::Pawn], y * 8 + x); break;                 case 'n': BitboardOperations::set_1(this->_piece_bitboards[side][Pieces::Knight], y * 8 + x); break;                 case 'b': BitboardOperations::set_1(this->_piece_bitboards[side][Pieces::Bishop], y * 8 + x); break;                 case 'r': BitboardOperations::set_1(this->_piece_bitboards[side][Pieces::Rook], y * 8 + x); break;                 case 'q': BitboardOperations::set_1(this->_piece_bitboards[side][Pieces::Queen], y * 8 + x); break;                 case 'k': BitboardOperations::set_1(this->_piece_bitboards[side][Pieces::King], y * 8 + x); break;             }              x = x + 1;         }     }      this->update_bitboards(); }<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0432\u043e\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0432\u044b\u0432\u043e\u0434\u0430:<\/p>\n<pre><code class=\"cpp\">std::ostream &amp;operator&lt;&lt;(std::ostream &amp;ostream, Pieces pieces) {     for (int8_t y = 7; y >= 0; y = y - 1) {         for (uint8_t x = 0; x &lt; 8; x = x + 1) {             ostream &lt;&lt; \"|  \";              if (BitboardOperations::get_bit(pieces._piece_bitboards[Pieces::White][Pieces::Pawn], y * 8 + x)) ostream &lt;&lt; \"\u2659\";             else if (BitboardOperations::get_bit(pieces._piece_bitboards[Pieces::White][Pieces::Knight], y * 8 + x)) ostream &lt;&lt; \"\u2658\";             else if (BitboardOperations::get_bit(pieces._piece_bitboards[Pieces::White][Pieces::Bishop], y * 8 + x)) ostream &lt;&lt; \"\u2657\";             else if (BitboardOperations::get_bit(pieces._piece_bitboards[Pieces::White][Pieces::Rook], y * 8 + x)) ostream &lt;&lt; \"\u2656\";             else if (BitboardOperations::get_bit(pieces._piece_bitboards[Pieces::White][Pieces::Queen], y * 8 + x)) ostream &lt;&lt; \"\u2655\";             else if (BitboardOperations::get_bit(pieces._piece_bitboards[Pieces::White][Pieces::King], y * 8 + x)) ostream &lt;&lt; \"\u2654\";              else if (BitboardOperations::get_bit(pieces._piece_bitboards[Pieces::Black][Pieces::Pawn], y * 8 + x)) ostream &lt;&lt; \"\u265f\";             else if (BitboardOperations::get_bit(pieces._piece_bitboards[Pieces::Black][Pieces::Knight], y * 8 + x)) ostream &lt;&lt; \"\u265e\";             else if (BitboardOperations::get_bit(pieces._piece_bitboards[Pieces::Black][Pieces::Bishop], y * 8 + x)) ostream &lt;&lt; \"\u265d\";             else if (BitboardOperations::get_bit(pieces._piece_bitboards[Pieces::Black][Pieces::Rook], y * 8 + x)) ostream &lt;&lt; \"\u265c\";             else if (BitboardOperations::get_bit(pieces._piece_bitboards[Pieces::Black][Pieces::Queen], y * 8 + x)) ostream &lt;&lt; \"\u265b\";             else if (BitboardOperations::get_bit(pieces._piece_bitboards[Pieces::Black][Pieces::King], y * 8 + x)) ostream &lt;&lt; \"\u265a\";              else ostream &lt;&lt; \" \";              ostream &lt;&lt; \"  \";         }         ostream &lt;&lt; \"|\\n\";     }      return ostream; }<\/code><\/pre>\n<h2>Zobrist \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h2>\n<p>\u0427\u0430\u0441\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b \u043b\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 (\u0441\u0430\u043c\u043e\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e &#8212; \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0442\u0440\u043e\u0435\u043a\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u0438, \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u044d\u0442\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043d\u0430\u043c \u0435\u0449\u0435 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0439 \u0432\u0435\u0449\u0438). \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0430, \u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f 12 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u0434\u043e\u0440\u043e\u0433\u043e. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0435\u0435 \u043d\u0435 \u0432 12 64 \u0431\u0438\u0442\u043d\u044b\u0445 \u0447\u0438\u0441\u043b\u0430\u0445, \u0430 \u0432 1 \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u043d\u0435 \u0437\u0430 12 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f, \u0430 \u0437\u0430 1. \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f \u043d\u0435\u043b\u044c\u0437\u044f \u0441\u0436\u0430\u0442\u044c \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u044b \u0432 12 \u0440\u0430\u0437, \u0434\u0430\u0436\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438 \u043e\u043d\u0438 \u043d\u0435 \u0441\u0430\u043c\u044b\u0435 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435, \u043d\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0441\u043b\u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u0442\u0441\u044f \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0440\u0438\u0441\u043a\u0430\u043c\u0438.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u0441\u0436\u0438\u043c\u0430\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432 \u043e\u0434\u043d\u043e \u0447\u0438\u0441\u043b\u043e. \u0422\u0430\u043a\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0435\u0441\u0442\u044c \u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u043d\u0430 Zobrist \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c, \u0432 \u0447\u0435\u0441\u0442\u044c \u0410\u043b\u044c\u0431\u0435\u0440\u0442 \u041b\u0438\u043d\u0434\u0441\u0438 \u0417\u043e\u0431\u0440\u0438\u0441\u0442\u0430.<\/p>\n<p>\u0418\u0434\u0435\u044f \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c. \u041d\u0430\u043c \u043d\u0430\u0434\u043e \u0437\u0430\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0444\u0438\u0433\u0443\u0440\u044b, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0435\u0439\u0441\u044f \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0435 \u0434\u043e\u0441\u043a\u0438. \u0418\u0442\u043e\u0433\u0435 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f 12 * 64 = 768 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442, \u043f\u043b\u044e\u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0434\u043b\u044f \u043f\u0440\u0430\u0432 \u043d\u0430 \u0440\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u0438 \u043f\u0440\u0430\u0432\u043e \u0445\u043e\u0434\u0430 (\u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0444\u0438\u0433\u0443\u0440\u0430\u043c\u0438 \u043d\u0430 \u0434\u043e\u0441\u043a\u0435, \u043d\u043e \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u043d\u0430 \u0445\u043e\u0434 \u0438\u043b\u0438 \u043d\u0430 \u0440\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u0434\u0430\u0432\u0430\u043b\u0438 \u0440\u0430\u0437\u043d\u044b\u0439 \u0445\u0435\u0448).<\/p>\n<p>\u042d\u0442\u043e \u044f \u0438 \u0441\u0434\u0435\u043b\u0430\u043b. \u042f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0413\u041f\u0421\u0427 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442. \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0432\u043e\u0442 \u0447\u0442\u043e:<\/p>\n<pre><code class=\"cpp\">#include &lt;cstdint> #include &lt;array>   #pragma once   namespace ZobristHashConsteval {     namespace PRNG {         static constexpr uint64_t Seed = 0x98f107;         static constexpr uint64_t Multiplier = 0x71abc9;         static constexpr uint64_t Summand = 0xff1b3f;     }       static consteval uint64_t next_random(uint64_t previous) {         return ZobristHashConsteval::PRNG::Multiplier * previous + ZobristHashConsteval::PRNG::Summand;     }     static consteval std::array&lt;std::array&lt;std::array&lt;uint64_t, 6>, 2>, 64> calc_constants() {         std::array&lt;std::array&lt;std::array&lt;uint64_t, 6>, 2>, 64> constants{};          uint64_t previous = ZobristHashConsteval::PRNG::Seed;          for (uint8_t square = 0; square &lt; 64; square = square + 1) {             for (uint8_t side = 0; side &lt; 2; side = side + 1) {                 for (uint8_t type = 0; type &lt; 6; type = type + 1) {                     previous = ZobristHashConsteval::next_random(previous);                     constants[square][side][type] = previous;                 }             }         }          return constants;     }       static constexpr std::array&lt;std::array&lt;std::array&lt;uint64_t, 6>, 2>, 64> Constants = calc_constants();     static constexpr uint64_t BlackMove = ZobristHashConsteval::next_random(ZobristHashConsteval::Constants[63][1][5]);     static constexpr uint64_t WhiteLongCastling = ZobristHashConsteval::next_random(ZobristHashConsteval::BlackMove);     static constexpr uint64_t WhiteShortCastling = ZobristHashConsteval::next_random(ZobristHashConsteval::WhiteLongCastling);     static constexpr uint64_t BlackLongCastling = ZobristHashConsteval::next_random(ZobristHashConsteval::WhiteShortCastling);     static constexpr uint64_t BlackShortCastling = ZobristHashConsteval::next_random(ZobristHashConsteval::BlackLongCastling); }<\/code><\/pre>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u044d\u0442\u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0445\u0435\u0448 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f XOR \u043c\u0435\u0436\u0434\u0443 \u0432\u0441\u0435\u043c\u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430\u043c\u0438 \u0438 \u043d\u0443\u043b\u0435\u043c. \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u044f \u0434\u0430\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434:<\/p>\n<pre><code>function hash(board):     h := 0     if is_black_turn(board):         h := h XOR table.black_to_move     for i from 1 to 64:      # loop over the board positions         if board[i] \u2260 empty:             j := the piece at board[i], as listed in the constant indices, above             h := h XOR table[i][j]     return h<\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0430\u0432\u043d\u044b \u043b\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0439\u0442\u0438\u0441\u044c \u043f\u043e \u0432\u0441\u0435\u043c \u043a\u043b\u0435\u0442\u043a\u0430\u043c, \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0445\u0435\u0448 \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0445\u0435\u0448\u0438, \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u0435 \u043f\u043e \u0432\u0441\u0435\u043c \u043a\u043b\u0435\u0442\u043a\u0430\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0434\u0432\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e? \u0417\u0432\u0443\u0447\u0438\u0442 \u043a\u0430\u043a \u0431\u0440\u0435\u0434. \u0418 \u0435\u0441\u043b\u0438 \u0431\u044b \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0442\u0430\u043a \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0442\u043e \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0431\u0440\u0435\u0434\u043e\u043c, \u043d\u043e \u0443 \u0442\u0430\u043a\u043e\u0433\u043e \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0435\u0441\u0442\u044c \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e, \u0434\u0435\u043b\u0430\u044e\u0449\u0435\u0435 \u0435\u0433\u043e \u043e\u0447\u0435\u043d\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0441 \u0434\u0432\u0443\u043c\u044f \u043a\u043e\u0440\u043e\u043b\u044f\u043c\u0438 \u0438 \u043f\u0435\u0448\u043a\u043e\u0439. \u0423 \u043d\u0430\u0441 \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u0435\u0435 \u0445\u0435\u0448. \u041e\u043d \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0442\u0430\u043a:<\/p>\n<pre><code>0 ^ WhiteKingOnD1 ^ BlackKingOnE7 ^ WhitePawnOnC4<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a \u044d\u0442\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0431\u0435\u043b\u043e\u0433\u043e \u043a\u043e\u043d\u044f, \u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0435 C5. \u0418 \u0435\u0441\u043b\u0438 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c XOR \u0441 \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u0445\u0435\u0448\u043e\u043c \u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043e\u0439 \u0434\u043b\u044f \u0431\u0435\u043b\u043e\u0433\u043e \u043a\u043e\u043d\u044f \u043d\u0430 C5, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u0445\u0435\u0448, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0431\u044b \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043b\u0438 \u0435\u0433\u043e \u0437\u0430\u043d\u043e\u0432\u043e \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u044f.<\/p>\n<p>\u0414\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440. \u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0443\u0431\u0440\u0430\u0442\u044c \u0431\u0435\u043b\u0443\u044e \u043f\u0435\u0448\u043a\u0443, \u0441\u0442\u043e\u044f\u0449\u0443\u044e \u043d\u0430 C4 \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e \u0445\u0435\u0448\u0430. \u0415\u0441\u043b\u0438 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c XOR \u0441 \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u0445\u0435\u0448\u043e\u043c \u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043e\u0439 \u044d\u0442\u043e\u0439 \u0431\u0435\u043b\u043e\u0439 \u043f\u0435\u0448\u043a\u0438, \u0441\u0442\u043e\u044f\u0449\u0435\u0439 \u043d\u0430 C4, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u044d\u0442\u043e:<\/p>\n<pre><code>0 ^ WhiteKingOnD1 ^ BlackKingOnE7 ^ WhitePawnOnC4 ^ WhitePawnOnC4<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0434\u043b\u044f \u0431\u0435\u043b\u044b\u0445 \u043f\u0435\u0448\u0435\u043a \u043d\u0430 C4 \u0441\u043e\u043a\u0440\u0430\u0442\u044f\u0442\u0441\u044f, \u0442\u0430\u043a \u043a\u0430\u043a XOR \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0441\u0430\u043c\u043e\u043e\u0431\u0440\u0430\u0442\u0438\u043c\u043e\u0441\u0442\u044c\u044e, \u0442\u043e \u0435\u0441\u0442\u044c<\/p>\n<pre><code>a ^ a = 0<\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0438 \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0444\u0438\u0433\u0443\u0440\u0443, \u0438 \u0447\u0442\u043e\u0431\u044b \u0435\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u0445\u0435\u0448\u0430, \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c XOR \u0441 \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u0445\u0435\u0448\u043e\u043c \u0438 \u043a\u043b\u044e\u0447\u043e\u043c \u044d\u0442\u043e\u0439 \u0444\u0438\u0433\u0443\u0440\u044b \u043d\u0430 \u043d\u0443\u0436\u043d\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438.<\/p>\n<p>\u0421 \u0444\u043b\u0430\u0433\u0430\u043c\u0438 \u0440\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0438 \u0445\u043e\u0434\u0430 \u0432\u0441\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u0434\u043b\u044f \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0438 \u0444\u043b\u0430\u0433\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c XOR \u0441 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043a\u043b\u044e\u0447\u043e\u043c \u0438 \u0444\u043b\u0430\u0433\u043e\u043c.<\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u044d\u0442\u043e \u0437\u043d\u0430\u043d\u0438\u0435 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 Zobrist \u0445\u0435\u0448\u0430:<\/p>\n<pre><code class=\"cpp\">#include \"ZobristHash.hpp\"   ZobristHash::ZobristHash() = default; ZobristHash::ZobristHash(Pieces pieces, bool black_move, bool w_l_castling, bool w_s_castling, bool b_l_castling, bool b_s_castling) {     this->_hash = 0;      if (black_move) this->invert_move();     if (w_l_castling) this->invert_w_l_castling();     if (w_s_castling) this->invert_w_s_castling();     if (b_l_castling) this->invert_b_l_castling();     if (b_s_castling) this->invert_b_s_castling();      uint8_t side;     for (uint8_t square = 0; square &lt; 64; square = square + 1) {         if (BitboardOperations::get_bit(pieces._side_bitboards[Pieces::White], square)) side = Pieces::White;         else if (BitboardOperations::get_bit(pieces._side_bitboards[Pieces::Black], square)) side = Pieces::Black;         else continue;          for (uint8_t type = 0; type &lt; 6; type = type + 1) {             if (BitboardOperations::get_bit(pieces._piece_bitboards[side][type], square)) {                 this->invert_piece(square, type, side);                 break;             }         }     } } bool operator ==(ZobristHash left, ZobristHash right) {     return (left._hash == right._hash); } bool operator &lt;(ZobristHash left, ZobristHash right) {     return (left._hash &lt; right._hash); } void ZobristHash::invert_piece(uint8_t square, uint8_t type, uint8_t side) {     this->_hash = this->_hash ^ ZobristHashConsteval::Constants[square][side][type]; } void ZobristHash::invert_move() {     this->_hash = this->_hash ^ ZobristHashConsteval::BlackMove; } void ZobristHash::invert_w_l_castling() {     this->_hash = this->_hash ^ ZobristHashConsteval::WhiteLongCastling; } void ZobristHash::invert_w_s_castling() {     this->_hash = this->_hash ^ ZobristHashConsteval::WhiteShortCastling; } void ZobristHash::invert_b_l_castling() {     this->_hash = this->_hash ^ ZobristHashConsteval::BlackLongCastling; } void ZobristHash::invert_b_s_castling() {     this->_hash = this->_hash ^ ZobristHashConsteval::BlackShortCastling; }<\/code><\/pre>\n<h2>\u0422\u0440\u043e\u0435\u043a\u0440\u0430\u0442\u043d\u043e\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438<\/h2>\n<p>\u0412 \u0448\u0430\u0445\u043c\u0430\u0442\u0430\u0445 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0435 \u0442\u0440\u043e\u0435\u043a\u0440\u0430\u0442\u043d\u044b\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u0438. \u041f\u0440\u0430\u0432\u0438\u043b\u043e \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043e\u0434\u043d\u0430 \u0438 \u0442\u0430 \u0436\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0440\u0438\u0436\u0434\u044b, \u0442\u043e \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0438\u0447\u044c\u044f. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0445\u0435\u0448 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438, \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e.<\/p>\n<p>\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0435\u043a\u0442\u043e\u0440 \u0438\u0437 Zobrist \u0445\u0435\u0448\u0435\u0439, \u043f\u043e\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0445\u043e\u0434\u0430, \u0430 \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043d\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0439 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u043f\u0438\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0445\u0435\u0448\u0430. \u042d\u0442\u043e \u0437\u0432\u0443\u0447\u0438\u0442 \u043e\u0447\u0435\u043d\u044c \u043d\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e, \u043d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0438\u0433\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u043e\u0447\u0438\u0449\u0430\u0442\u044c \u0432\u0435\u043a\u0442\u043e\u0440, \u0442\u0430\u043a \u043a\u0430\u043a \u0435\u0441\u0442\u044c \u043d\u0435\u043e\u0431\u0440\u0430\u0442\u0438\u043c\u044b\u0435 \u0445\u043e\u0434\u044b. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0448\u043a\u0438 \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u0438\u0435, \u0442\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u0441 \u043f\u043e\u0437\u0438\u0446\u0438\u044f\u043c\u0438 \u0434\u043e \u043f\u0440\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u0435\u0448\u043a\u0438 \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u0438\u044f. \u0422\u0430\u043a \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0448\u043a\u0438 \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0441\u044c \u0432\u0435\u043a\u0442\u043e\u0440.<\/p>\n<p>\u0412\u043e\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043a\u043b\u0430\u0441\u0441:<\/p>\n<pre><code class=\"cpp\">#include &lt;vector> #include \"ZobristHash.hpp\"   #pragma once   class RepetitionHistory { public:     RepetitionHistory();      void add_position(ZobristHash hash);      void clear();      uint8_t get_repetition_number(ZobristHash hash); private:     std::vector&lt;ZobristHash> _hashes; };<\/code><\/pre>\n<pre><code class=\"cpp\">#include \"RepetitionHistory.hpp\"   RepetitionHistory::RepetitionHistory() = default; void RepetitionHistory::add_position(ZobristHash hash) {     this->_hashes.push_back(hash); } void RepetitionHistory::clear() {     this->_hashes.clear(); } uint8_t RepetitionHistory::get_repetition_number(ZobristHash hash) {     uint8_t ctr = 0;      for (auto hash1 : this->_hashes) if (hash == hash1) ctr = ctr + 1;      return ctr; }<\/code><\/pre>\n<h2>\u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0445\u043e\u0434\u0430<\/h2>\n<p>\u041d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0445\u043e\u0434. \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u043a \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435: \u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438\u0437 \u043a\u0430\u043a\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0438 \u0438 \u043a\u0443\u0434\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0444\u043b\u0430\u0433 \u0445\u043e\u0434\u0430 \u0441\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 &#8212; \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0440\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430\u0445 \u0438\u043b\u0438 \u0432 \u043a\u0430\u043a\u0443\u044e \u0444\u0438\u0433\u0443\u0440\u0443 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0448\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f). \u042f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0439\u0442\u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0435\u0449\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u043e\u043c \u043a\u0430\u043a\u0430\u044f \u0444\u0438\u0433\u0443\u0440\u0430 \u0434\u0432\u0438\u0433\u0430\u043b\u0430\u0441\u044c \u0438 \u043a\u0430\u043a\u0430\u044f \u0444\u0438\u0433\u0443\u0440\u0430 \u0431\u044b\u043b\u0438 \u0441\u044a\u0435\u0434\u0435\u043d\u0430 (\u0435\u0441\u043b\u0438 \u0431\u044b\u043b\u0430). \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0445\u043e\u0434\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u043d\u0430 \u043a\u0430\u043a\u043e\u043c \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u0431\u0438\u0440\u0430\u0442\u044c \u0444\u0438\u0433\u0443\u0440\u0443, \u0430 \u043d\u0430 \u043a\u0430\u043a\u043e\u0439 \u0441\u0442\u0430\u0432\u0438\u0442\u044c. \u041a\u0442\u043e-\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u0440\u0430\u0437\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u0430\u0442\u044c, \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0445\u043e\u0434\u0430, \u0430 \u0432 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0435 \u0445\u043e\u0434\u043e\u0432, \u043d\u043e \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u0430\u0432. \u041f\u0440\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0445\u043e\u0434\u043e\u0432 \u043c\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u0437\u043d\u0430\u0435\u043c \u043a\u0430\u043a\u0430\u044f \u0444\u0438\u0433\u0443\u0440\u0430 \u0434\u0432\u0438\u0433\u0430\u043b\u0430\u0441\u044c, \u0430 \u0438\u043d\u043e\u0433\u0434\u0430 &#8212; \u043a\u0430\u043a\u0443\u044e \u0441\u044a\u0435\u043b\u0438. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043c\u0435\u043d\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u0440\u0430\u0442\u0438\u043c \u043d\u0430 \u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u0430\u043c.<\/p>\n<p>\u0412\u043e\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b (\u0441\u0430\u043c\u0443 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430). \u041e\u0431\u0440\u0430\u0449\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0437\u0430\u0449\u0438\u0442\u043d\u0438\u043a\u0430 \u043d\u0435\u0442 (\u0442\u043e \u0435\u0441\u0442\u044c \u0442\u043e\u0433\u043e, \u043a\u043e\u0433\u043e \u0441\u044a\u0435\u043b\u0438), \u0442\u043e \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 uint8_t, \u0442\u043e \u0435\u0441\u0442\u044c 255.<\/p>\n<pre><code class=\"cpp\">#include &lt;cstdint>   #pragma once   struct Move {     Move();     Move(uint8_t from, uint8_t to, uint8_t attacker_type, uint8_t attacker_side, uint8_t defender_type, uint8_t defender_side, uint8_t flag = Move::Flag::Default);      friend bool operator ==(Move left, Move right);      uint8_t _from;     uint8_t _to;      uint8_t _attacker_type;     uint8_t _attacker_side;      uint8_t _defender_type;     uint8_t _defender_side;      uint8_t _flag;      struct Flag {         static constexpr uint8_t Default = 0;          static constexpr uint8_t PawnLongMove = 1;         static constexpr uint8_t EnPassantCapture = 2;          static constexpr uint8_t WhiteLongCastling = 3;         static constexpr uint8_t WhiteShortCastling = 4;         static constexpr uint8_t BlackLongCastling = 5;         static constexpr uint8_t BlackShortCastling = 6;          static constexpr uint8_t PromoteToKnight = 7;         static constexpr uint8_t PromoteToBishop = 8;         static constexpr uint8_t PromoteToRook = 9;         static constexpr uint8_t PromoteToQueen = 10;     }; };<\/code><\/pre>\n<h2>\u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438<\/h2>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u043f\u043e\u0437\u0438\u0446\u0438\u0438. \u042d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u0442\u0430\u043f \u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0434\u043e\u0441\u043a\u0438.<\/p>\n<p>\u0427\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u0430 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u044f?<\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0444\u0438\u0433\u0443\u0440\u044b. \u0414\u043b\u044f \u043d\u0438\u0445 \u043c\u044b \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0442\u0430\u043a \u0447\u0442\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0438\u0442\u0441\u044f \u043d\u0435 \u043d\u0443\u0436\u043d\u043e.<\/p>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0431\u0438\u0442\u0443\u044e \u043a\u043b\u0435\u0442\u043a\u0443. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0432\u0437\u044f\u0442\u0438\u044f \u043d\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u0435. \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0438 \u043d\u0435\u0442, \u0442\u043e \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u043b\u0435\u0436\u0430\u0442\u044c 255. \u043a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0445\u043e\u0434\u0430.<\/p>\n<p>\u0412-\u0442\u0440\u0435\u0442\u044c\u0438\u0445, \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0440\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443. \u0411\u0435\u0437 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432.<\/p>\n<p>\u0412-\u0447\u0435\u0442\u0432\u0435\u0440\u0442\u044b\u0445, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u0435 \u0431\u044b\u043b\u0430 \u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u043d\u0430 \u0440\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430. \u042d\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043f\u0443\u043d\u043a\u0442, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0440\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0432 \u0435\u0435, \u0430 \u0442\u0443\u0442 \u043c\u044b \u0445\u0440\u0430\u043d\u0438\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u043e\u043c \u0431\u044b\u043b\u0430 \u043b\u0438 \u043e\u043d\u0430 \u0441\u0434\u0435\u043b\u0430\u043d\u0430. \u042d\u0442\u043e \u0437\u043d\u0430\u043d\u0438\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0418\u0418.<\/p>\n<p>\u0412-\u043f\u044f\u0442\u044b\u0445, \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0445\u043e\u0434\u043e\u0432. \u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e float \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0449\u0430\u044f \u043f\u043e 0.5 \u0437\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0445\u043e\u0434. \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043a\u0440\u0443\u0433\u043b\u0430\u044f, \u0442\u043e \u0445\u043e\u0434 \u0431\u0435\u043b\u044b\u0445. \u0415\u0441\u043b\u0438 \u0443 \u043d\u0435\u0435 \u0435\u0441\u0442\u044c \u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c, \u0442\u043e \u0445\u043e\u0434 \u0447\u0435\u0440\u043d\u044b\u0445.<\/p>\n<p>\u0412-\u0448\u0435\u0441\u0442\u044b\u0445, Zobrist \u0445\u0435\u0448 \u043f\u043e\u0437\u0438\u0446\u0438\u0438. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 Zobrist \u0445\u0435\u0448\u0430 \u043c\u044b \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438, \u043e\u0431 \u044d\u0442\u043e\u043c \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0438\u0442\u0441\u044f \u043d\u0435 \u043d\u0443\u0436\u043d\u043e. \u0413\u043b\u0430\u0432\u043d\u043e\u0435, \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u0441\u043b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043f\u043e\u0437\u0438\u0446\u0438\u0438.<\/p>\n<p>\u0412-\u0441\u0435\u0434\u044c\u043c\u044b\u0445, \u0441\u0447\u0435\u0442\u0447\u0438\u043a 50 \u0445\u043e\u0434\u043e\u0432. \u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 float \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043a\u0430\u043a \u0438 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0445\u043e\u0434\u043e\u0432, \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043d\u0443\u043b\u044f\u0442\u044c\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u0435\u0448\u043a\u0438 \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u0438\u044f.<\/p>\n<p>\u0412-\u0432\u043e\u0441\u044c\u043c\u044b\u0445, \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0442\u0440\u043e\u0435\u043a\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u0438. \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043c\u044b \u0443\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438, \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0447\u0438\u0449\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u0435\u0448\u043a\u0438 \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u0438\u044f.<\/p>\n<p>\u042d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u0412\u043e\u0442 \u043a\u0430\u043a \u0432 \u043a\u043e\u0434\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u0441\u0435 \u0442\u043e, \u0447\u0442\u043e \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0432\u0435\u0440\u0445\u0443:<\/p>\n<pre><code class=\"cpp\">Pieces _pieces; uint8_t _en_passant;  bool _w_l_castling; bool _w_s_castling; bool _b_l_castling; bool _b_s_castling;  bool _white_castling_happened; bool _black_castling_happened;  float _move_ctr; ZobristHash _hash; float _fifty_moves_ctr; RepetitionHistory _repetition_history;<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043d\u0430\u0443\u0447\u0438\u0442\u0441\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u0441\u0435 \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0442\u043e\u0439 \u0436\u0435 FEN \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u043f\u0430\u0440\u044b \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u0445 \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0440\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">Position::Position(const std::string&amp; short_fen, uint8_t en_passant, bool w_l_castling, bool w_s_castling, bool b_l_castling, bool b_s_castling, float move_ctr) {     this->_pieces = {short_fen};     this->_en_passant = en_passant;      this->_w_l_castling = w_l_castling;     this->_w_s_castling = w_s_castling;     this->_b_l_castling = b_l_castling;     this->_b_s_castling = b_s_castling;      this->_white_castling_happened = false;     this->_black_castling_happened = false;      this->_move_ctr = move_ctr;     this->_hash = {this->_pieces, (this->_move_ctr - std::floor(this->_move_ctr) > 1e-4), this->_w_l_castling, this->_w_s_castling, this->_b_l_castling, this->_b_s_castling};     this->_repetition_history.add_position(this->_hash);     this->_fifty_moves_ctr = 0; }<\/code><\/pre>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0443\u043c\u0435\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u0438, \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043d\u0430\u0443\u0447\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0445\u043e\u0434\u044b. \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0437\u044f\u0442\u044c \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043d\u0435\u043b\u044c\u0437\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u043e\u0447\u0442\u0438 \u043a\u0430\u0436\u0434\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 Zobrist \u0445\u0435\u0448\u0430. \u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b, \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0438, \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, Zobrist \u0445\u0435\u0448. \u0412\u043e\u0442 \u043e\u043d\u0438 \u0432\u0441\u0435:<\/p>\n<pre><code class=\"cpp\">void Position::_add_piece(uint8_t square, uint8_t type, uint8_t side) {     if (!BitboardOperations::get_bit(this->_pieces._piece_bitboards[side][type], square)) {         BitboardOperations::set_1(this->_pieces._piece_bitboards[side][type], square);         this->_hash.invert_piece(square, type, side);     } } void Position::_remove_piece(uint8_t square, uint8_t type, uint8_t side) {     if (BitboardOperations::get_bit(this->_pieces._piece_bitboards[side][type], square)) {         BitboardOperations::set_0(this->_pieces._piece_bitboards[side][type], square);         this->_hash.invert_piece(square, type, side);     } } void Position::_change_en_passant(uint8_t en_passant) {     this->_en_passant = en_passant; } void Position::_remove_w_l_castling() {     if (this->_w_l_castling) {         this->_w_l_castling = false;         this->_hash.invert_w_l_castling();     } } void Position::_remove_w_s_castling() {     if (this->_w_s_castling) {         this->_w_s_castling = false;         this->_hash.invert_w_s_castling();     } } void Position::_remove_b_l_castling() {     if (this->_b_l_castling) {         this->_b_l_castling = false;         this->_hash.invert_b_l_castling();     } } void Position::_remove_b_s_castling() {     if (this->_b_s_castling) {         this->_b_s_castling = false;         this->_hash.invert_b_s_castling();     } } void Position::_update_move_ctr() {     this->_move_ctr = this->_move_ctr + 0.5f;     this->_hash.invert_move(); } void Position::_update_fifty_moves_ctr(bool break_event) {     if (break_event) this->_fifty_moves_ctr = 0;     else this->_fifty_moves_ctr = this->_fifty_moves_ctr + 0.5f; }<\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434\u044b \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0432\u0441\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0435 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 Zobrist \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041f\u0440\u043e\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u044e \u0442\u043e\u043b\u044c\u043a\u043e 44 \u0441\u0442\u0440\u043e\u0447\u043a\u0443, \u0433\u0434\u0435 break_event &#8212; \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u0437\u044f\u0442\u0438\u0435 \u0438\u043b\u0438 \u043f\u0440\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0448\u043a\u0438.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0431\u043e\u0433\u0430\u0442\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0445\u043e\u0434\u0430. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u044f \u0432\u0441\u0435\u043c\u0438 \u0441\u0438\u043b\u0430\u043c\u0438 \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u0435\u0435 \u043d\u0430 \u043c\u0435\u043b\u043a\u0438\u0435 \u043a\u0443\u0441\u043a\u0438, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043e\u043d\u0430 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0430\u044f, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0435 \u0431\u0443\u0434\u0443 \u043f\u043e \u043a\u0443\u0441\u043a\u0430\u043c.<\/p>\n<p>\u0421\u0430\u043c\u0430\u044f \u043e\u0441\u043d\u043e\u0432\u0430 &#8212; \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0444\u0438\u0433\u0443\u0440\u0443 \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0437\u044f\u0442\u0443\u044e, \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0432\u0430\u044f \u0431\u044b\u043b\u0430. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u0432\u0441\u0435 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">this->_remove_piece(move._from, move._attacker_type, move._attacker_side); this->_add_piece(move._to, move._attacker_type, move._attacker_side); if (move._defender_type != 255) this->_remove_piece(move._to, move._defender_type, move._defender_side);<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u0441\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u043b\u0430\u0433\u0438, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 Move:<\/p>\n<pre><code class=\"cpp\">switch (move._flag) {         case Move::Flag::Default:             break;          case Move::Flag::PawnLongMove:             this->_change_en_passant((move._from + move._to) \/ 2);             break;         case Move::Flag::EnPassantCapture:             if (move._attacker_side == Pieces::White) this->_remove_piece(move._to - 8, Pieces::Pawn, Pieces::Black);             else this->_remove_piece(move._to + 8, Pieces::Pawn, Pieces::White);             break;          case Move::Flag::WhiteLongCastling:             this->_remove_piece(0, Pieces::Rook, Pieces::White);             this->_add_piece(3, Pieces::Rook, Pieces::White);             this->_white_castling_happened = true;             break;         case Move::Flag::WhiteShortCastling:             this->_remove_piece(7, Pieces::Rook, Pieces::White);             this->_add_piece(5, Pieces::Rook, Pieces::White);             this->_white_castling_happened = true;             break;         case Move::Flag::BlackLongCastling:             this->_remove_piece(56, Pieces::Rook, Pieces::Black);             this->_add_piece(59, Pieces::Rook, Pieces::Black);             this->_black_castling_happened = true;             break;         case Move::Flag::BlackShortCastling:             this->_remove_piece(63, Pieces::Rook, Pieces::Black);             this->_add_piece(61, Pieces::Rook, Pieces::Black);             this->_black_castling_happened = true;             break;          case Move::Flag::PromoteToKnight:             this->_remove_piece(move._to, Pieces::Pawn, move._attacker_side);             this->_add_piece(move._to, Pieces::Knight, move._attacker_side);             break;         case Move::Flag::PromoteToBishop:             this->_remove_piece(move._to, Pieces::Pawn, move._attacker_side);             this->_add_piece(move._to, Pieces::Bishop, move._attacker_side);             break;         case Move::Flag::PromoteToRook:             this->_remove_piece(move._to, Pieces::Pawn, move._attacker_side);             this->_add_piece(move._to, Pieces::Rook, move._attacker_side);             break;         case Move::Flag::PromoteToQueen:             this->_remove_piece(move._to, Pieces::Pawn, move._attacker_side);             this->_add_piece(move._to, Pieces::Queen, move._attacker_side);             break; }<\/code><\/pre>\n<p>\u042d\u0442\u043e \u0432\u0441\u0435 \u0447\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0441 \u0444\u0438\u0433\u0443\u0440\u0430\u043c\u0438, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u044b\u0435 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u044b \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u044b\u043b\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438:<\/p>\n<pre><code class=\"cpp\">this->_pieces.update_bitboards();<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0444\u043b\u0430\u0433 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043d\u0435 \u0431\u044b\u043b \u0434\u043b\u0438\u043d\u043d\u044b\u043c \u0445\u043e\u0434\u043e\u043c \u043f\u0435\u0448\u043a\u0438, \u0442\u043e \u043d\u0430\u0434\u043e \u0441\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0431\u0438\u0442\u043e\u0435 \u043f\u043e\u043b\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u0437\u044f\u0442\u0438\u0435 \u043d\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0432\u0435\u0442\u043d\u044b\u043c \u0445\u043e\u0434\u043e\u043c:<\/p>\n<pre><code class=\"cpp\">if (move._flag != Move::Flag::PawnLongMove) this->_change_en_passant(255);<\/code><\/pre>\n<p>\u0415\u0449\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0440\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443, \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u043b\u0438\u0441\u044c \u043a\u043e\u0440\u043e\u043b\u0438 \u0438\u043b\u0438 \u043b\u0430\u0434\u044c\u0438. \u0424\u0438\u0448\u043a\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0435\u0432\u0430\u0436\u043d\u043e \u043a\u0430\u043a\u0430\u044f \u0444\u0438\u0433\u0443\u0440\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u043b\u0430\u0441\u044c (\u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u043e \u0438 \u043d\u0435 \u0437\u0432\u0443\u0447\u0438\u0442), \u0430 \u0432\u0430\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u043b\u0430\u0441\u044c \u043b\u0438 \u0444\u0438\u0433\u0443\u0440\u0430 \u0441 \u043c\u0435\u0441\u0442\u0430 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u0442\u043e\u044f\u0442\u044c \u043a\u043e\u0440\u043e\u043b\u0438 \u0438 \u043b\u0430\u0434\u044c\u0438. \u0415\u0441\u043b\u0438 \u0434\u0430, \u0442\u043e \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0440\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0442\u0430\u043a \u0447\u0442\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0432\u0430 \u0441\u043b\u0443\u0447\u0430\u044f. \u041f\u0435\u0440\u0432\u044b\u0439 &#8212; \u043a\u043e\u0433\u0434\u0430 \u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0435 \u0433\u0434\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u0442\u043e\u044f\u0442\u044c \u0444\u0438\u0433\u0443\u0440\u0430 \u043e\u043d\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u043e\u0438\u0442. \u041f\u043e\u0441\u043b\u0435 \u0435\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0440\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430. \u0412\u0442\u043e\u0440\u043e\u0439 &#8212; \u043a\u043e\u0433\u0434\u0430 \u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0435 \u0433\u0434\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u0442\u043e\u044f\u0442\u044c \u0444\u0438\u0433\u0443\u0440\u0430 \u0435\u0435 \u043d\u0435\u0442. \u041f\u043e\u0441\u043b\u0435 \u0435\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0440\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f, \u043d\u043e \u0440\u0430\u0437 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435 \u043b\u0430\u0434\u044c\u0438 \u0438\u043b\u0438 \u043a\u043e\u0440\u043e\u043b\u044f \u0441\u0442\u043e\u0438\u0442 \u0434\u0440\u0443\u0433\u0430\u044f \u0444\u0438\u0433\u0443\u0440\u0430, \u0442\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0440\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0443\u0436\u0435 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0438 \u043e\u0442 \u0435\u0435 \u0441\u0431\u0440\u043e\u0441\u0430 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f. \u0412\u043e\u0442 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"cpp\">switch (move._from) {         case 0:             this->_remove_w_l_castling();             break;         case 4:             this->_remove_w_l_castling();             this->_remove_w_s_castling();             break;         case 7:             this->_remove_w_s_castling();             break;         case 56:             this->_remove_b_l_castling();             break;         case 60:             this->_remove_b_l_castling();             this->_remove_b_s_castling();             break;         case 63:             this->_remove_b_s_castling();             break; }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0445\u043e\u0434\u043e\u0432:<\/p>\n<pre><code class=\"cpp\">this->_update_move_ctr();<\/code><\/pre>\n<p>\u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a 50 \u0445\u043e\u0434\u043e\u0432:<\/p>\n<pre><code class=\"cpp\">this->_update_fifty_moves_ctr(move._attacker_type == Pieces::Pawn or move._defender_type != 255);<\/code><\/pre>\n<p>\u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0442\u0440\u043e\u0435\u043a\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0438, \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u043b \u043d\u0435\u043e\u0431\u0440\u0430\u0442\u0438\u043c\u044b\u0439 \u0445\u043e\u0434, \u043e\u0447\u0438\u0449\u0430\u0435\u043c (\u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f \u0434\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u0438):<\/p>\n<pre><code class=\"cpp\">if (move._attacker_type == Pieces::Pawn or move._defender_type != 255) this->_repetition_history.clear(); this->_repetition_history.add_position(this->_hash);<\/code><\/pre>\n<h2>\u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0445\u043e\u0434\u043e\u0432 \u043d\u0430 \u043f\u0441\u0435\u0432\u0434\u043e\u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u0435 \u0438 \u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u0435<\/h2>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0445\u043e\u0434\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u0438\u0446\u0443 \u043c\u0435\u0436\u0434\u0443 \u043f\u0441\u0435\u0432\u0434\u043e\u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0438 \u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0445\u043e\u0434\u0430\u043c\u0438.<\/p>\n<p>\u041f\u0441\u0435\u0432\u0434\u043e\u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u0435 \u0445\u043e\u0434\u044b &#8212; \u044d\u0442\u043e \u0445\u043e\u0434\u044b \u0431\u0435\u0437 \u0443\u0447\u0435\u0442\u0430 \u0448\u0430\u0445\u043e\u0432. \u0422\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u0444\u0438\u0433\u0443\u0440\u044b \u043f\u043e\u0434\u0447\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u0441\u0432\u043e\u0438\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c, \u043a\u043e\u043d\u044c \u0445\u043e\u0434\u0438\u0442 \u0431\u0443\u043a\u0432\u043e\u0439 &#171;\u0413&#187;, \u0441\u043b\u043e\u043d \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u043f\u0440\u044b\u0433\u0438\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0444\u0438\u0433\u0443\u0440\u044b \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435, \u043d\u043e \u0448\u0430\u0445\u0438 \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043a\u043e\u0440\u043e\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0439\u0442\u0438 \u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0443 \u0431\u0438\u0442\u0443\u044e \u0432\u0440\u0430\u0436\u0435\u0441\u043a\u043e\u0439 \u0444\u0438\u0433\u0443\u0440\u043e\u0439, \u0430 \u0448\u0430\u0445 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u0435 \u0445\u043e\u0434\u044b \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e. \u0417\u0430 \u043d\u0438\u0445 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0438\u0445 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435.<\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u0435 \u0445\u043e\u0434\u044b, \u043d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0431\u0435\u0437 \u043f\u0441\u0435\u0432\u0434\u043e\u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0442\u0440\u0438 \u0447\u0430\u0441\u0442\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u044b \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0441\u0435\u0432\u0434\u043e\u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u0445 \u0445\u043e\u0434\u043e\u0432.<\/p>\n<h2>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0441\u0435\u0432\u0434\u043e\u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u0445 \u0445\u043e\u0434\u043e\u0432 \u043a\u043e\u043d\u0435\u0439 \u0438 \u043a\u043e\u0440\u043e\u043b\u0435\u0439<\/h2>\n<p>\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u0441\u0435\u0432\u0434\u043e\u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u0435 \u0445\u043e\u0434\u044b \u043a\u043e\u043d\u0435\u0439 \u0438 \u043a\u043e\u0440\u043e\u043b\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u043e. \u0412\u0441\u0435\u0433\u043e \u0437\u0430 \u043e\u0434\u043d\u0443 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u043d\u0443\u044e \u043d\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043d\u0435\u0439 \u0438 \u043a\u043e\u0440\u043e\u043b\u0435\u0439. \u041d\u043e \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u0441\u043a\u0438 \u0438\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0438.<\/p>\n<p>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438 \u043c\u0430\u0441\u043e\u043a \u043d\u0435\u0432\u0430\u0436\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u043b \u0438\u0445 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0433\u0438\u043c, \u043d\u043e \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c:<\/p>\n<pre><code class=\"cpp\">#include \"..\/PositionRepresentation\/Bitboard.hpp\"   #pragma once   namespace KnightMasks {     static consteval uint8_t abs_subtract(uint8_t left, uint8_t right) {         if (left >= right) return left - right;         return right - left;     }     static consteval std::array&lt;Bitboard, 64> calc_masks() {         std::array&lt;Bitboard, 64> masks{};          uint8_t dx;         uint8_t dy;          for (uint8_t x0 = 0; x0 &lt; 8; x0 = x0 + 1) {             for (uint8_t y0 = 0; y0 &lt; 8; y0 = y0 + 1) {                  for (uint8_t x1 = 0; x1 &lt; 8; x1 = x1 + 1) {                     for (uint8_t y1 = 0; y1 &lt; 8; y1 = y1 + 1) {                          dx = KnightMasks::abs_subtract(x0, x1);                         dy = KnightMasks::abs_subtract(y0, y1);                          if ((dx == 2 and dy == 1) or (dx == 1 and dy == 2)) BitboardOperations::set_1(masks[y0 * 8 + x0], y1 * 8 + x1);                     }                 }             }         }          return masks;     }       static constexpr std::array&lt;Bitboard, 64> Masks = KnightMasks::calc_masks(); }<\/code><\/pre>\n<pre><code class=\"cpp\">#include \"..\/PositionRepresentation\/Bitboard.hpp\"   #pragma once   namespace KingMasks {     static consteval uint8_t abs_subtract(uint8_t left, uint8_t right) {         if (left >= right) return left - right;         return right - left;     }     static consteval std::array&lt;Bitboard, 64> calc_masks() {         std::array&lt;Bitboard, 64> masks{};          uint8_t dx;         uint8_t dy;          for (uint8_t x0 = 0; x0 &lt; 8; x0 = x0 + 1) {             for (uint8_t y0 = 0; y0 &lt; 8; y0 = y0 + 1) {                  for (uint8_t x1 = 0; x1 &lt; 8; x1 = x1 + 1) {                     for (uint8_t y1 = 0; y1 &lt; 8; y1 = y1 + 1) {                          dx = KingMasks::abs_subtract(x0, x1);                         dy = KingMasks::abs_subtract(y0, y1);                          if (dx &lt;= 1 and dy &lt;= 1) BitboardOperations::set_1(masks[y0 * 8 + x0], y1 * 8 + x1);                     }                 }             }         }          return masks;     }       static constexpr std::array&lt;Bitboard, 64> Masks = KingMasks::calc_masks(); }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0441\u0435\u0432\u0434\u043e\u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u0445 \u0445\u043e\u0434\u043e\u0432 \u043a\u043e\u043d\u0435\u0439 \u0438 \u043a\u043e\u0440\u043e\u043b\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0434\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">Bitboard PsLegalMoveMaskGen::generate_knight_mask(Pieces pieces, uint8_t p, uint8_t side, bool only_captures) {     if (only_captures) {         return KnightMasks::Masks[p] &amp; pieces._side_bitboards[Pieces::inverse(side)];     }     return KnightMasks::Masks[p] &amp; pieces._inversion_side_bitboards[side]; }<\/code><\/pre>\n<pre><code class=\"cpp\">Bitboard PsLegalMoveMaskGen::generate_king_mask(Pieces pieces, uint8_t p, uint8_t side, bool only_captures) {     if (only_captures) {         return KingMasks::Masks[p] &amp; pieces._side_bitboards[Pieces::inverse(side)];     }     return KingMasks::Masks[p] &amp; pieces._inversion_side_bitboards[side]; }<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0444\u043b\u0430\u0433 only_captures. \u0415\u0441\u043b\u0438 \u043e\u043d \u0432\u043a\u043b\u044e\u0447\u0435\u043d, \u0442\u043e \u0431\u0443\u0434\u0443\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0437\u044f\u0442\u0438\u044f. \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0437\u0430\u0447\u0435\u043c \u044d\u0442\u043e \u043d\u0430\u0434\u043e, \u043d\u043e \u043e\u043d\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f, \u043f\u0440\u0438\u0447\u0435\u043c \u043d\u0435 \u043e\u0434\u0438\u043d \u0440\u0430\u0437.<\/p>\n<h2>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0441\u0435\u0432\u0434\u043e\u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u0445 \u0445\u043e\u0434\u043e\u0432 \u0441\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0438\u0445 \u0444\u0438\u0433\u0443\u0440<\/h2>\n<p>\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0445\u043e\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u0441\u0435\u0432\u0434\u043e\u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u0445 \u0445\u043e\u0434\u044b \u0441\u043b\u043e\u043d\u043e\u0432, \u0444\u0435\u0440\u0437\u0435\u0439 \u0438 \u043b\u0430\u0434\u0435\u0439, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0435\u043b\u044c\u0437\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u043f\u043e\u0434\u0447\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c, \u0434\u0432\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u043e, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e &#8212; \u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0435 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u044b \u0438 \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435. \u0418\u0434\u0435\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0440\u0430\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u0444\u0438\u0433\u0443\u0440.<\/p>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043c\u0435\u043d\u044f \u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u043b\u043e \u043d\u0430 \u043e\u0434\u0438\u043d \u0438\u0437 \u044d\u0442\u0438\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043c\u0430\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0439 \u0432\u043e \u0432\u0441\u0435\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445 \u0441\u043e \u0432\u0441\u0435\u0445 \u043a\u043b\u0435\u0442\u043e\u043a. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">#include \"..\/PositionRepresentation\/Bitboard.hpp\"   #pragma once   namespace SlidersMasks {     struct Direction {         static constexpr int8_t North = 0;         static constexpr int8_t South = 1;         static constexpr int8_t West = 2;         static constexpr int8_t East = 3;          static constexpr int8_t NorthWest = 4;         static constexpr int8_t NorthEast = 5;         static constexpr int8_t SouthWest = 6;         static constexpr int8_t SouthEast = 7;     };       static consteval Bitboard calc_mask(uint8_t p, int8_t direction) {         Bitboard mask = 0;          int8_t x = p % 8;         int8_t y = p \/ 8;          for (; ;) {             switch (direction) {                 case SlidersMasks::Direction::North: y = y + 1; break;                 case SlidersMasks::Direction::South: y = y - 1; break;                 case SlidersMasks::Direction::West: x = x - 1; break;                 case SlidersMasks::Direction::East: x = x + 1; break;                  case SlidersMasks::Direction::NorthWest: y = y + 1; x = x - 1; break;                 case SlidersMasks::Direction::NorthEast: y = y + 1; x = x + 1; break;                 case SlidersMasks::Direction::SouthWest: y = y - 1; x = x - 1; break;                 case SlidersMasks::Direction::SouthEast: y = y - 1; x = x + 1; break;             }              if (x > 7 or x &lt; 0 or y > 7 or y &lt; 0) break;              BitboardOperations::set_1(mask, y * 8 + x);         }          return mask;     }       static consteval std::array&lt;std::array&lt;Bitboard, 8>, 64> calc_masks() {         std::array&lt;std::array&lt;Bitboard, 8>, 64> masks{};          for (uint8_t i = 0; i &lt; 64; i = i + 1) {             for (uint8_t j = 0; j &lt; 8; j = j + 1) masks[i][j] = SlidersMasks::calc_mask(i, j);         }          return masks;     }       static constexpr std::array&lt;std::array&lt;Bitboard, 8>, 64> Masks = SlidersMasks::calc_masks(); };<\/code><\/pre>\n<p>\u041e\u043f\u044f\u0442\u044c \u0436\u0435 \u043d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0442\u0430\u043a \u0447\u0442\u043e \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0432\u0430\u0436\u043d\u0435\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0449\u0443\u044e \u043b\u0443\u0447 \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0438\u0437 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u0444\u0438\u0433\u0443\u0440.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u044d\u0442\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u0444\u0438\u0433\u0443\u0440\u044b. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0444\u0438\u0433\u0443\u0440 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c \u043d\u0430\u043c \u043b\u0443\u0447\u043e\u043c.<\/p>\n<pre><code class=\"cpp\">Bitboard blockers = SlidersMasks::Masks[p][direction] &amp; pieces._all;<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u0444\u0438\u0433\u0443\u0440\u044b \u043c\u044b \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043f\u0443\u0441\u0442\u044b \u043b\u0438 \u043e\u043d\u0438 (\u043e\u0447\u0435\u043d\u044c \u0441\u043a\u043e\u0440\u043e \u0443\u0437\u043d\u0430\u0435\u0442\u0435 \u043f\u043e\u0447\u0435\u043c\u0443). \u0418 \u0435\u0441\u043b\u0438 \u043f\u0443\u0441\u0442\u044b, \u0442\u043e \u0441\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c \u0444\u043b\u0430\u0433\u043e\u043c only_captures \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c 0, \u0430 \u0441 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c &#8212; \u0432\u0435\u0441\u044c \u043b\u0443\u0447:<\/p>\n<pre><code class=\"cpp\">if (blockers == 0) {         if (only_captures) return 0;         return SlidersMasks::Masks[p][direction]; }<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u0435\u0440\u0432\u0443\u044e \u043a\u043b\u0435\u0442\u043a\u0443 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u043e\u0438\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u0444\u0438\u0433\u0443\u0440\u0430. \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0431\u0438\u0442\u0430 \u0438\u043b\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0431\u0438\u0442\u0430. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0438\u0449\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u0431\u0438\u0442, \u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0431\u0438\u0442\u0430, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a. \u041d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0431\u0443\u0434\u0435\u0442 \u043a\u0430\u043a \u0438 \u043f\u043e\u0438\u0441\u043a \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0431\u0438\u0442\u0430, \u0442\u0430\u043a \u0438 \u043f\u043e\u0438\u0441\u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e, \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u0443\u0447\u0430. \u0418\u0442\u0430\u043a, \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u0435\u0440\u0432\u0443\u044e \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0443\u044e \u0444\u0438\u0433\u0443\u0440\u0443:<\/p>\n<pre><code class=\"cpp\">uint8_t blocking_square;  if (bsr) blocking_square = BitboardOperations::bsr(blockers); else blocking_square = BitboardOperations::bsf(blockers);<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u0432\u043e\u0434\u0438\u043c \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0431\u0438\u0442\u0431\u043e\u0440\u0434:<\/p>\n<pre><code class=\"cpp\">Bitboard moves;<\/code><\/pre>\n<p>\u0418 \u0441\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c \u0444\u043b\u0430\u0433\u043e\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0437\u044f\u0442\u0438\u0439 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0435\u0433\u043e \u043d\u0443\u043b\u044f\u043c\u0438, \u043a\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u0441 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c &#8212; \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f XOR&#8217;a \u043b\u0443\u0447\u0430, \u0432\u044b\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0437 \u0434\u0430\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0441 \u043b\u0443\u0447\u043e\u043c, \u0432\u044b\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u043c \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0439 \u0444\u0438\u0433\u0443\u0440\u044b:<\/p>\n<pre><code class=\"cpp\">if (only_captures) moves = 0; else moves = SlidersMasks::Masks[p][direction] ^ SlidersMasks::Masks[blocking_square][direction];<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u0434\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430 \u043f\u0435\u0440\u0432\u0430\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u0444\u0438\u0433\u0443\u0440\u0430. \u0415\u0441\u043b\u0438 \u0446\u0432\u0435\u0442\u0430, \u0447\u0442\u043e \u0438 \u0442\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0439, \u0442\u043e \u0435\u0435 \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c. \u0415\u0441\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u0433\u043e &#8212; \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c:<\/p>\n<pre><code class=\"cpp\">if (BitboardOperations::get_bit(pieces._side_bitboards[side], blocking_square)) BitboardOperations::set_0(moves, blocking_square); else BitboardOperations::set_1(moves, blocking_square);<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code class=\"cpp\">return moves;<\/code><\/pre>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u044d\u0442\u0443 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0441\u043b\u043e\u043d\u0430:<\/p>\n<pre><code class=\"cpp\">Bitboard PsLegalMoveMaskGen::generate_bishop_mask(Pieces pieces, uint8_t p, uint8_t side, bool only_captures) {     Bitboard nw = PsLegalMoveMaskGen::_calc_ray(pieces, p, side, only_captures, SlidersMasks::Direction::NorthWest, false);     Bitboard ne = PsLegalMoveMaskGen::_calc_ray(pieces, p, side, only_captures, SlidersMasks::Direction::NorthEast, false);     Bitboard sw = PsLegalMoveMaskGen::_calc_ray(pieces, p, side, only_captures, SlidersMasks::Direction::SouthWest, true);     Bitboard se = PsLegalMoveMaskGen::_calc_ray(pieces, p, side, only_captures, SlidersMasks::Direction::SouthEast, true);      return nw | ne | sw | se; }<\/code><\/pre>\n<p>\u041b\u0430\u0434\u044c\u0438:<\/p>\n<pre><code class=\"cpp\">Bitboard PsLegalMoveMaskGen::generate_rook_mask(Pieces pieces, uint8_t p, uint8_t side, bool only_captures) {     Bitboard n = PsLegalMoveMaskGen::_calc_ray(pieces, p, side, only_captures, SlidersMasks::Direction::North, false);     Bitboard s = PsLegalMoveMaskGen::_calc_ray(pieces, p, side, only_captures, SlidersMasks::Direction::South, true);     Bitboard w = PsLegalMoveMaskGen::_calc_ray(pieces, p, side, only_captures, SlidersMasks::Direction::West, true);     Bitboard e = PsLegalMoveMaskGen::_calc_ray(pieces, p, side, only_captures, SlidersMasks::Direction::East, false);      return n | s | w | e; }<\/code><\/pre>\n<p>\u0418 \u0444\u0435\u0440\u0437\u044f, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0434\u0432\u0443\u0445 \u0444\u0438\u0433\u0443\u0440:<\/p>\n<pre><code class=\"cpp\">Bitboard PsLegalMoveMaskGen::generate_queen_mask(Pieces pieces, uint8_t p, uint8_t side, bool only_captures) {     Bitboard bishop_mask = PsLegalMoveMaskGen::generate_bishop_mask(pieces, p, side, only_captures);     Bitboard rook_mask = PsLegalMoveMaskGen::generate_rook_mask(pieces, p, side, only_captures);      return bishop_mask | rook_mask; }<\/code><\/pre>\n<p>\u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0445, \u0430 \u0443\u0436 \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u043e\u0432, \u043d\u043e \u0432\u0441\u0435 \u0436\u0435 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u043f\u0440\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0434\u043e\u0441\u043a\u0438.<\/p>\n<h2>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0441\u0435\u0432\u0434\u043e\u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u0445 \u0445\u043e\u0434\u043e\u0432 \u043f\u0435\u0448\u0435\u043a<\/h2>\n<p>\u0423\u0436\u0435 \u0431\u044b\u043b\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043e \u043a\u0430\u043a \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0437\u044f\u0442\u0438\u044f \u0432\u0441\u0435\u0445 \u0444\u0438\u0433\u0443\u0440, \u043d\u043e \u0435\u0449\u0435 \u043d\u0438 \u0441\u043b\u043e\u0432\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u043f\u0440\u043e \u043f\u0435\u0448\u043a\u0438. \u0410 \u0432\u0441\u0435 \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u0435\u0448\u043a\u0438 \u043a\u0430\u0440\u0434\u0438\u043d\u0430\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u0442 \u0444\u0438\u0433\u0443\u0440.<\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0438\u0445 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e. \u0418\u0441\u043a\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u0435\u0448\u043a\u0438 \u043f\u043e \u0434\u043e\u0441\u043a\u0435, \u0430 \u043f\u043e\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u043d\u0438\u0445 \u0431\u044b\u043b\u043e \u0431\u044b, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0434\u0430\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u043e, \u0447\u0435\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0445\u043e\u0434\u043e\u0432 \u0441\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0438\u0445 \u0444\u0438\u0433\u0443\u0440.<\/p>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0443 \u043d\u0438\u0445 \u0435\u0441\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0432\u0440\u043e\u0434\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043f\u0435\u0448\u043a\u0430 \u043d\u0435 \u0434\u0432\u0438\u0433\u0430\u043b\u0430\u0441\u044c \u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0432\u0435 \u043a\u043b\u0435\u0442\u043a\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b, \u0442\u043e \u043e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u043f\u0440\u044b\u0433\u043d\u0443\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043a\u043b\u0435\u0442\u043a\u0443.<\/p>\n<p>\u0412-\u0442\u0440\u0435\u0442\u044c\u0438\u0445, \u0443 \u043d\u0438\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0441\u043e \u0432\u0437\u044f\u0442\u0438\u044f\u043c\u0438, \u0447\u0435\u0433\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0438 \u043f\u0440\u043e \u043e\u0434\u043d\u0443 \u0444\u0438\u0433\u0443\u0440\u0443.<\/p>\n<p>\u0418\u0437-\u0437\u0430 \u044d\u0442\u0438\u0445 \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u0435\u0448\u0435\u043a \u043b\u0443\u0447\u0448\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0434\u0440\u0443\u0433\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c. \u0410 \u0438\u043c\u0435\u043d\u043d\u043e &#8212; \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432\u0441\u0435\u0445 \u0441\u0440\u0430\u0437\u0443. \u0421\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u044f\u0441\u043d\u044e \u0447\u0442\u043e \u044f \u0438\u043c\u0435\u044e \u0432\u0432\u0438\u0434\u0443.<\/p>\n<p>\u0423 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0447\u0435\u0442\u044b\u0440\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041e\u0434\u043d\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435 \u0445\u043e\u0434\u044b \u043f\u0435\u0448\u0435\u043a, \u0434\u0440\u0443\u0433\u0430\u044f &#8212; \u0432\u0441\u0435 \u0434\u043b\u0438\u043d\u043d\u044b\u0435, \u0442\u0440\u0435\u0442\u044c\u044f &#8212; \u0432\u0441\u0435 \u0432\u0437\u044f\u0442\u0438\u044f \u043d\u0430\u043b\u0435\u0432\u043e, \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u0430\u044f &#8212; \u0432\u0441\u0435 \u0432\u0437\u044f\u0442\u0438\u044f \u043d\u0430\u043f\u0440\u0430\u0432\u043e. \u041d\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u043c\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0438\u0445 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e? \u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043d\u0430\u043b\u0435\u0432\u043e, \u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043d\u0430\u043f\u0440\u0430\u0432\u043e? \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044f \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e. \u041f\u0440\u043e\u0441\u0442\u043e \u044f \u0432\u044b\u0431\u0440\u0430\u043b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0443\u0442\u044c. \u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043c\u0430\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0439 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u043e\u0434\u044b (\u043c\u044b \u043f\u0438\u0441\u0430\u043b\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0445\u043e\u0434\u0430, \u043d\u0430\u0434\u0435\u044e\u0441\u044c \u0435\u0435 \u0435\u0449\u0435 \u043a\u0442\u043e-\u0442\u043e \u043f\u043e\u043c\u043d\u0438\u0442). \u0418 \u044d\u0442\u0438 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u044b \u043c\u044b, \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c, \u0431\u0443\u0434\u0435\u043c \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0442\u044c \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0445\u043e\u0434\u043e\u0432. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0432 \u043e\u0434\u0438\u043d \u0431\u0438\u0442\u0431\u043e\u0440\u0434 \u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043d\u0430\u043b\u0435\u0432\u043e, \u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043d\u0430\u043f\u0440\u0430\u0432\u043e, \u0442\u043e \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0437\u043d\u0430\u0442\u044c, \u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0431\u0438\u0442\u0431\u043e\u0440\u0434, \u043a\u0430\u043a\u0430\u044f \u0438\u0437 \u043f\u0435\u0448\u0435\u043a \u0442\u0443\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0439\u0442\u0438. \u0410 \u0435\u0441\u043b\u0438 \u043c\u044b \u0432\u0437\u044f\u0442\u0438\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u0442\u043e \u043f\u043e \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0432 \u0442\u0430\u043a\u0443\u044e-\u0442\u043e \u043a\u043b\u0435\u0442\u043a\u0443 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0448\u043a\u0430, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0430\u044f\u0441\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 9 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u0445 \u043d\u0438\u0436\u0435.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0443\u0447\u0438\u043c\u0441\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0445\u043e\u0434\u044b \u043f\u0435\u0448\u0435\u043a. \u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0443 \u0432\u043f\u0435\u0440\u0435\u0434. \u041d\u0430\u043c \u043d\u0430\u0434\u043e \u0441\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0438\u0445 \u043d\u0430 1 \u043f\u043e \u043e\u0441\u0438 y (\u0447\u0442\u043e \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u0441\u0434\u0432\u0438\u0433\u0443 \u043d\u0430 8 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443), \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u043f\u0443\u0441\u0442\u044b\u043c\u0438 \u043a\u043b\u0435\u0442\u043a\u0430\u043c\u0438. \u0414\u043b\u044f \u0447\u0435\u0440\u043d\u044b\u0445 \u043f\u0435\u0448\u0435\u043a \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0434\u0432\u0438\u0433\u0430 \u0434\u0440\u0443\u0433\u043e\u0435. \u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"cpp\">Bitboard PsLegalMoveMaskGen::generate_pawn_default_mask(Pieces pieces, uint8_t side) {     if (side == Pieces::White) {         return (pieces._piece_bitboards[Pieces::White][Pieces::Pawn] &lt;&lt; 8) &amp; pieces._empty;     }     return (pieces._piece_bitboards[Pieces::Black][Pieces::Pawn] >> 8) &amp; pieces._empty; }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0434\u043b\u0438\u043d\u043d\u044b\u0435 \u0445\u043e\u0434\u044b. \u042f \u0441\u0430\u043c \u0434\u043e\u043b\u0433\u043e \u043d\u0435 \u043c\u043e\u0433 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0448\u0435\u043b \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435: \u043c\u044b \u0431\u0435\u0440\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u043f\u0435\u0448\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u043e\u044f\u043b\u0438 \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e, \u043f\u043e \u0441\u0443\u0442\u0438, \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e. \u041e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"cpp\">Bitboard PsLegalMoveMaskGen::generate_pawn_long_mask(Pieces pieces, uint8_t side) {     Bitboard default_mask = PsLegalMoveMaskGen::generate_pawn_default_mask(pieces, side);      if (side == Pieces::White) {         return ((default_mask &amp; BitboardRows::Rows[2]) &lt;&lt; 8) &amp; pieces._empty;     }     return ((default_mask &amp; BitboardRows::Rows[5]) >> 8) &amp; pieces._empty; }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0437\u044f\u0442\u0438\u044f. \u041d\u043e \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c \u043a\u0430\u043a \u0438\u0445 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0434\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c \u043d\u0430\u043f\u0435\u0440\u0435\u0434. \u041d\u0430\u043c \u043d\u0435 \u0440\u0430\u0437 \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0431\u044c\u0435\u0442 \u043b\u0438 \u043f\u0435\u0448\u043a\u0430 \u043f\u0443\u0441\u0442\u0443\u044e \u043a\u043b\u0435\u0442\u043a\u0443 (\u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 &#8212; \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0431\u0438\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u043f\u0440\u0438 \u0440\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0435). \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043d\u0430\u0448\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u0439 \u0444\u043b\u0430\u0433, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0441\u0435\u0432\u0434\u043e\u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u0437\u044f\u0442\u0438\u044f, \u043d\u043e \u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u0432\u0441\u0435\u0433\u043e, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0441\u0432\u043e\u0438 \u0444\u0438\u0433\u0443\u0440\u044b \u0438 \u043f\u0443\u0441\u0442\u044b\u0435 \u043a\u043b\u0435\u0442\u043a\u0438. \u042d\u0442\u043e\u0442 \u0444\u043b\u0430\u0433 \u044f \u043d\u0430\u0437\u0432\u0430\u043b include_all_possible_captures, \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435 \u043e \u043d\u0435\u043c.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043e \u0444\u043b\u0430\u0433\u0435 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438, \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0441\u0430\u043c\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438. \u041d\u0430\u043c \u043d\u0430\u0434\u043e \u0441\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0431\u0438\u0442\u0431\u043e\u0440\u0434 \u043d\u0430 1 \u043f\u043e \u043e\u0441\u0438 y \u0438 1 \u043f\u043e \u043e\u0441\u0438 x (\u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u0441\u0434\u0432\u0438\u0433\u0443 \u043d\u0430 7 \u0438\u043b\u0438 9 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443). \u0422\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u0442 \u0435\u0441\u043b\u0438 \u043f\u0435\u0448\u043a\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0442\u043e\u0438\u0442 \u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u043a\u0440\u0430\u044e, \u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0441\u0434\u0432\u0438\u0433\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0443 \u043d\u0435\u0435 \u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e, \u0447\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0441\u043b\u0435 \u0441\u0434\u0432\u0438\u0433\u0430 \u043c\u044b \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u0444\u0438\u0433\u0443\u0440\u0430\u043c\u0438 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u0430 (\u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0444\u043b\u0430\u0433 include_all_possible_captures \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d), \u043d\u043e \u0438 \u0441 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u043e\u043c, \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c\u0443 \u043a\u0440\u0430\u0439\u043d\u0435\u043c\u0443 \u0441\u0442\u043e\u043b\u0431\u0446\u0443 (\u0442\u0430\u043a\u0438\u0435 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u044b \u043c\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438).<\/p>\n<p> \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0433\u043e\u0442\u043e\u0432\u044b \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0432\u0437\u044f\u0442\u0438\u0439:<\/p>\n<pre><code class=\"cpp\">Bitboard PsLegalMoveMaskGen::generate_pawn_left_captures_mask(Pieces pieces, uint8_t side, bool include_all_possible_captures) {     if (side == Pieces::White) {         Bitboard mask = (pieces._piece_bitboards[Pieces::White][Pieces::Pawn] &lt;&lt; 7) &amp; BitboardColumns::InversionColumns[7];         if (!include_all_possible_captures) mask = mask &amp; pieces._side_bitboards[Pieces::Black];          return mask;     }      Bitboard mask = (pieces._piece_bitboards[Pieces::Black][Pieces::Pawn] >> 9) &amp; BitboardColumns::InversionColumns[7];     if (!include_all_possible_captures) mask = mask &amp; pieces._side_bitboards[Pieces::White];     return mask; }<\/code><\/pre>\n<pre><code class=\"cpp\">Bitboard PsLegalMoveMaskGen::generate_pawn_right_captures_mask(Pieces pieces, uint8_t side, bool include_all_possible_captures) {     if (side == Pieces::White) {         Bitboard mask = (pieces._piece_bitboards[Pieces::White][Pieces::Pawn] &lt;&lt; 9) &amp; BitboardColumns::InversionColumns[0];         if (!include_all_possible_captures) mask = mask &amp; pieces._side_bitboards[Pieces::Black];          return mask;     }      Bitboard mask = (pieces._piece_bitboards[Pieces::Black][Pieces::Pawn] >> 7) &amp; BitboardColumns::InversionColumns[0];     if (!include_all_possible_captures) mask = mask &amp; pieces._side_bitboards[Pieces::White];     return mask; }<\/code><\/pre>\n<h2>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043b\u0438 \u043a\u043b\u0435\u0442\u043a\u0430 \u043f\u043e\u0434 \u0443\u0434\u0430\u0440\u043e\u043c<\/h2>\n<p>\u041d\u0430\u043c \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043b\u0438 \u043a\u043b\u0435\u0442\u043a\u0430 \u043f\u043e\u0434 \u0443\u0434\u0430\u0440\u043e\u043c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 &#8212; \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u0448\u0430\u0445\u043e\u0432).<\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0431\u044c\u044e\u0442 \u043b\u0438 \u043a\u043b\u0435\u0442\u043a\u0443 \u043f\u0435\u0448\u043a\u0438 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e \u0438\u0437-\u0437\u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0445\u043e\u0434\u043e\u0432 \u043f\u0435\u0448\u0435\u043a:<\/p>\n<pre><code class=\"cpp\">Bitboard opposite_pawns_left_captures = PsLegalMoveMaskGen::generate_pawn_left_captures_mask(pieces, Pieces::inverse(side), true); Bitboard opposite_pawns_right_captures = PsLegalMoveMaskGen::generate_pawn_right_captures_mask(pieces, Pieces::inverse(side), true); Bitboard opposite_pawns_captures = opposite_pawns_left_captures | opposite_pawns_right_captures;  if (BitboardOperations::get_bit(opposite_pawns_captures, p)) return true;<\/code><\/pre>\n<p>\u041d\u043e \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u0444\u0438\u0433\u0443\u0440\u0430\u043c\u0438? \u0421\u0430\u043c\u044b\u0439 \u043d\u0430\u0438\u0432\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 &#8212; \u043d\u0430\u0439\u0442\u0438 \u0432\u0441\u0435 \u0444\u0438\u0433\u0443\u0440\u044b \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u0430, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0437\u044f\u0442\u0438\u044f \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u0444\u0438\u0433\u0443\u0440 \u0438 \u043f\u043e\u0438\u0441\u043a\u0430\u0442\u044c \u0432 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u0430\u0445 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0443\u044e \u043d\u0430\u0441 \u043a\u043b\u0435\u0442\u043a\u0443. \u041d\u043e \u044d\u0442\u043e \u043f\u043b\u043e\u0445\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u043f\u0440\u0438\u0447\u0435\u043c \u043a\u0430\u043a \u0438 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0442\u0430\u043a \u0438 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430.<\/p>\n<p>\u0412\u0441\u0435 \u0445\u043e\u0434\u044b \u0432 \u0448\u0430\u0445\u043c\u0430\u0442\u0430\u0445 (\u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0445\u043e\u0434\u043e\u0432 \u043f\u0435\u0448\u0435\u043a, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u044b \u0443\u0436\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0438 \u0440\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430\u0445 \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0435\u0447\u0438 \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e) \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043d\u043e \u043c\u0430\u043b\u043e \u043a\u0442\u043e \u0437\u0430\u043c\u0435\u0447\u0430\u0435\u0442.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0444\u0438\u0433\u0443\u0440\u0430 \u043f\u043e\u0445\u043e\u0434\u0438\u043b\u0430 \u0441 \u043a\u043b\u0435\u0442\u043a\u0438 A \u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0443 B, \u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0445\u043e\u0434\u043e\u043c (\u043f\u0440\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u0430) \u043e\u043d\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0443 \u0410.<\/p>\n<p>\u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0444\u0438\u0433\u0443\u0440\u0430, \u043d\u0430\u0445\u043e\u0434\u044f\u0441\u044c \u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0438 \u0410, \u0431\u044c\u0435\u0442 \u043a\u043b\u0435\u0442\u043a\u0443 \u0412, \u0442\u043e \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0430\u044f \u0436\u0435 \u0444\u0438\u0433\u0443\u0440\u0430, \u043d\u0430\u0445\u043e\u0434\u044f\u0441\u044c \u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0435 B, \u0431\u0443\u0434\u0435\u0442 \u0431\u0438\u0442\u044c \u043a\u043b\u0435\u0442\u043a\u0443 \u0410.<\/p>\n<p>\u0410 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442, \u0447\u0442\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0432 \u043d\u0430 \u043a\u043b\u0435\u0442\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0441\u043b\u043e\u043d\u0430 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0431\u0438\u0442\u044c \u0432\u0440\u0430\u0436\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u043b\u043e\u043d\u0430 \u0442\u043e\u0433\u0434\u0430 \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u0432\u0440\u0430\u0436\u0435\u0441\u043a\u0438\u0439 \u0441\u043b\u043e\u043d \u0431\u044c\u0435\u0442 \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443.<\/p>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0444\u0438\u0433\u0443\u0440\u0430\u043c\u0438. \u041f\u043e\u0441\u0442\u0430\u0440\u0430\u0439\u0442\u0435\u0441\u044c \u043f\u043e\u043d\u044f\u0442\u044c \u044d\u0442\u043e, \u0430 \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043b\u0435\u0433\u0447\u0435 &#8212; \u0441\u043d\u0438\u0437\u0443 \u0435\u0441\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430, \u0433\u0434\u0435 \u0447\u0435\u0440\u043d\u043e\u043c\u0443 \u043a\u043e\u0440\u043e\u043b\u044e \u0448\u0430\u0445 (\u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u043c\u0430\u0442, \u043d\u043e \u0448\u0430\u0445 \u0432 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u0441\u043c\u044b\u0441\u043b\u0435 \u0447\u0430\u0441\u0442\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u043c\u0430\u0442\u0430).<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/455\/d52\/750\/455d527508e8b0526e8912f7c954a1af.png\" width=\"294\" height=\"294\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/455\/d52\/750\/455d527508e8b0526e8912f7c954a1af.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u044d\u0442\u043e \u0437\u043d\u0430\u043d\u0438\u0435, \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0430\u0442\u0430\u043a\u0443\u0435\u0442\u0441\u044f \u043b\u0438 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u043a\u043b\u0435\u0442\u043a\u0430 \u0444\u0438\u0433\u0443\u0440\u0430\u043c\u0438:<\/p>\n<pre><code class=\"cpp\">if (PsLegalMoveMaskGen::generate_knight_mask(pieces, p, side, true) &amp; pieces._piece_bitboards[Pieces::inverse(side)][Pieces::Knight]) return true; if (PsLegalMoveMaskGen::generate_bishop_mask(pieces, p, side, true) &amp; pieces._piece_bitboards[Pieces::inverse(side)][Pieces::Bishop]) return true; if (PsLegalMoveMaskGen::generate_rook_mask(pieces, p, side, true) &amp; pieces._piece_bitboards[Pieces::inverse(side)][Pieces::Rook]) return true; if (PsLegalMoveMaskGen::generate_queen_mask(pieces, p, side, true) &amp; pieces._piece_bitboards[Pieces::inverse(side)][Pieces::Queen]) return true; if (PsLegalMoveMaskGen::generate_king_mask(pieces, p, side, true) &amp; pieces._piece_bitboards[Pieces::inverse(side)][Pieces::King]) return true;<\/code><\/pre>\n<p>\u0418 \u0435\u0441\u043b\u0438 \u043d\u0438 \u043f\u0435\u0448\u043a\u0438, \u043d\u0438 \u0444\u0438\u0433\u0443\u0440\u0430 \u043d\u0435 \u043f\u0440\u0435\u0440\u0432\u0430\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0432\u0435\u0440\u043d\u0443\u0432 \u0438\u0441\u0442\u0438\u043d\u0443, \u0442\u043e \u043d\u0430\u0434\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043b\u043e\u0436\u044c:<\/p>\n<pre><code class=\"cpp\">return false;<\/code><\/pre>\n<h2>\u0422\u0438\u043f \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0445\u043e\u0434\u043e\u0432<\/h2>\n<p>\u041c\u044b \u0443\u0436\u0435 \u0432 \u0448\u0430\u0433\u0435 \u043e\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u0445 \u0445\u043e\u0434\u043e\u0432, \u0433\u0434\u0435 \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0441\u0435\u044f\u0442\u044c \u043f\u0441\u0435\u0432\u0434\u043e\u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u0435 \u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u0435, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0438\u0445 \u0437\u0430\u0441\u0443\u043d\u0443\u0442\u044c \u0432 \u0442\u0438\u043f, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0440\u044f\u0434 \u0445\u043e\u0434\u043e\u0432.<\/p>\n<p>\u041d\u043e \u043a\u0430\u043a\u043e\u0439 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0442\u0438\u043f? \u0421\u0430\u043c\u043e\u0435 \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e\u0435 &#8212; \u0432\u0435\u043a\u0442\u043e\u0440, \u043d\u043e \u0432\u0435\u043a\u0442\u043e\u0440 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0434\u0435\u043b\u0430\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u043b\u0438\u0448\u043d\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439. \u041c\u0435\u043d\u0435\u0435 \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e\u0435 &#8212; \u0441\u043f\u0438\u0441\u043e\u043a, \u043d\u043e \u043e\u043d \u0442\u043e\u0436\u0435 \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442, \u0442\u0430\u043a \u043a\u0430\u043a \u0435\u0433\u043e \u0434\u043e\u043b\u0433\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c (\u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u043d\u0443\u0436\u043d\u0430 \u043f\u0440\u044b\u0433\u0430\u0442\u044c \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c). \u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c &#171;\u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443&#187; \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u042d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e \u0441\u0435\u0431\u044f \u043a\u0430\u043a \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435.<\/p>\n<p>\u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u0441\u0435\u0431\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u041f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0445\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043d\u0435 \u0437\u0430\u043d\u044f\u0442\u0443\u044e \u044f\u0447\u0435\u0439\u043a\u0443, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 1.<\/p>\n<p>\u041d\u043e \u043a\u0430\u043a \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u044d\u0442\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430? \u041d\u0430 \u0442\u043e\u043c \u0436\u0435 chessprogrammingwiki \u044f \u043d\u0430\u0448\u0435\u043b, \u0447\u0442\u043e \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0441 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u0445 \u0445\u043e\u0434\u043e\u0432 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 218 \u0445\u043e\u0434\u043e\u0432. \u0421\u0430\u043c\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u044f, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0435 \u043d\u0430\u0448\u0435\u043b (\u0445\u043e\u0442\u044f \u0438 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0438\u0441\u043a\u0430\u043b), \u043d\u043e \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u043e\u0432\u0435\u0440\u0438\u0442\u044c chessprogrammingwiki \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0432 218 \u0445\u043e\u0434\u043e\u0432.<\/p>\n<p>\u0412\u043e\u0442 \u043a\u043e\u0434 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u041e\u043d \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439:<\/p>\n<pre><code class=\"cpp\">#include &lt;array> #include \"..\/PositionRepresentation\/Move.hpp\" #include \"..\/PositionRepresentation\/Pieces.hpp\"   #pragma once   class MoveList { public:     MoveList();      Move &amp;operator[](uint8_t index);     Move operator[](uint8_t index) const;      void push_back(Move move);     [[nodiscard]] uint8_t size() const; private:     std::array&lt;Move, 218> _moves{};     uint8_t _size; };<\/code><\/pre>\n<pre><code class=\"cpp\">#include \"MoveList.hpp\"   MoveList::MoveList() {     this->_size = 0; } Move &amp;MoveList::operator[](uint8_t index) {     return this->_moves[index]; } Move MoveList::operator[](uint8_t index) const {     return this->_moves[index]; } void MoveList::push_back(Move move) {     this->_moves[this->_size] = move;     this->_size = this->_size + 1; } uint8_t MoveList::size() const {     return this->_size; }<\/code><\/pre>\n<h2>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u0445 \u0445\u043e\u0434\u043e\u0432<\/h2>\n<p>\u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u0441\u0435\u0432\u0434\u043e\u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u0445 \u0445\u043e\u0434\u043e\u0432, \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0449\u0438\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043b\u0438 \u043a\u043b\u0435\u0442\u043a\u0430 \u043f\u043e\u0434 \u0431\u043e\u0435\u043c, \u0442\u0438\u043f \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0445\u043e\u0434\u043e\u0432. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u044d\u0442\u043e\u0442 \u0430\u0440\u0441\u0435\u043d\u0430\u043b, \u043c\u043e\u0436\u043d\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u0435 \u0445\u043e\u0434\u044b.<\/p>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c. \u041f\u0435\u0440\u0432\u044b\u0439 &#8212; \u0434\u0435\u043b\u0430\u0435\u043c \u0445\u043e\u0434 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043e\u0431\u043b\u0435\u0433\u0447\u0435\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0435\u0441\u0442\u044c \u043b\u0438 \u0448\u0430\u0445, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 &#8212; \u0445\u043e\u0434 \u043b\u0435\u0433\u0430\u043b\u0435\u043d. \u0412\u0442\u043e\u0440\u043e\u0439 \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u0445 \u043d\u0430 \u0434\u0432\u043e\u0439\u043d\u044b\u0435 \u0448\u0430\u0445\u0438, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u0430 \u0430\u0442\u0430\u043a\u0443\u044e\u0449\u0435\u0439 \u0444\u0438\u0433\u0443\u0440\u044b, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0444\u0438\u0433\u0443\u0440 \u0438 \u0442.\u0434. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043c\u043d\u0435 \u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u043b\u043e \u0441\u0438\u043b\u044b \u0438 \u043c\u0443\u0436\u0435\u0441\u0442\u0432\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0432\u043e\u0441\u0445\u0438\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u043c.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043d\u0430\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0445\u043e\u0434 \u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u043c. \u041f\u0440\u043e\u0441\u0442\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u0445\u043e\u0442\u044c \u0438 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e:<\/p>\n<pre><code class=\"cpp\">bool LegalMoveGen::_is_legal(Pieces pieces, Move move, bool en_passant_capture) {     BitboardOperations::set_0(pieces._piece_bitboards[move._attacker_side][move._attacker_type], move._from);     BitboardOperations::set_1(pieces._piece_bitboards[move._attacker_side][move._attacker_type], move._to);     if (move._defender_type != 255) BitboardOperations::set_0(pieces._piece_bitboards[move._defender_side][move._defender_type], move._to);     if (en_passant_capture) {         if (move._attacker_side == Pieces::White) BitboardOperations::set_0(pieces._piece_bitboards[Pieces::Black][Pieces::Pawn], move._to - 8);         BitboardOperations::set_0(pieces._piece_bitboards[Pieces::White][Pieces::Pawn], move._to + 8);     }      pieces.update_bitboards();      if (PsLegalMoveMaskGen::in_danger(pieces, BitboardOperations::bsf(pieces._piece_bitboards[move._attacker_side][Pieces::King]), move._attacker_side)) return false;      return true; }<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0449\u0430\u044e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u043b\u0430\u0433 \u0432\u0437\u044f\u0442\u0438\u044f \u043d\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u0444\u043b\u0430\u0433\u0438 \u043f\u0440\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043b\u0435\u0433\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0445\u043e\u0434\u043e\u0432 \u043d\u0435 \u0432\u043b\u0438\u044f\u044e\u0442, \u0430 \u0440\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0438\u0437-\u0437\u0430 \u0441\u0432\u043e\u0435\u0439 \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u043e\u0441\u0442\u0438 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0438\u043d\u0430\u0447\u0435.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0433\u043e\u0442\u043e\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0447\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u043e\u0434\u044b. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043f\u0435\u0448\u0435\u043a, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u0438\u0445 \u0432\u0437\u044f\u0442\u0438\u0439.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043c\u0430\u0441\u043a\u0438:<\/p>\n<pre><code class=\"cpp\">Bitboard pawn_left_captures_mask = PsLegalMoveMaskGen::generate_pawn_left_captures_mask(position._pieces, side, false); Bitboard pawn_right_captures_mask = PsLegalMoveMaskGen::generate_pawn_right_captures_mask(position._pieces, side, false);<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0442\u0430\u043a\u043e\u0439 \u0432\u043e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0433\u043e\u043d\u044f\u0435\u043c \u0438\u0445 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0445\u043e\u0434\u043e\u0432:<\/p>\n<pre><code class=\"cpp\">void LegalMoveGen::_pawn_mask_to_moves(Pieces pieces, Bitboard mask, uint8_t attacker_side, int8_t attacker_index, bool look_for_defender, uint8_t flag, MoveList &amp;moves) {     uint8_t defender_p;     uint8_t defender_type = 255;      Move move;      while (mask) {         defender_p = BitboardOperations::bsf(mask);         BitboardOperations::set_0(mask, defender_p);          if (look_for_defender) {             defender_type = 255;             for (uint8_t i = 0; i &lt; 6; i = i + 1) {                 if (BitboardOperations::get_bit(pieces._piece_bitboards[Pieces::inverse(attacker_side)][i], defender_p)) {                     defender_type = i;                     break;                 }             }         }          move = {(uint8_t)(defender_p + attacker_index), defender_p, Pieces::Pawn, attacker_side, defender_type, Pieces::inverse(attacker_side), flag};          if (LegalMoveGen::_is_legal(pieces, move, false)) {             if (defender_p &lt; 8 or defender_p > 55) {                 moves.push_back({(uint8_t)(defender_p + attacker_index), defender_p, 0, attacker_side, defender_type, Pieces::inverse(attacker_side), Move::Flag::PromoteToKnight});                 moves.push_back({(uint8_t)(defender_p + attacker_index), defender_p, 0, attacker_side, defender_type, Pieces::inverse(attacker_side), Move::Flag::PromoteToBishop});                 moves.push_back({(uint8_t)(defender_p + attacker_index), defender_p, 0, attacker_side, defender_type, Pieces::inverse(attacker_side), Move::Flag::PromoteToRook});                 moves.push_back({(uint8_t)(defender_p + attacker_index), defender_p, 0, attacker_side, defender_type, Pieces::inverse(attacker_side), Move::Flag::PromoteToQueen});             }             else moves.push_back(move);         }     } }<\/code><\/pre>\n<p>\u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0431\u0438\u0442 \u0432 \u043c\u0430\u0441\u043a\u0435 (\u044d\u0442\u043e\u0442 \u0431\u0438\u0442 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043a\u0443\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0439\u0442\u0438 \u043f\u0435\u0448\u043a\u0430), \u043f\u043e\u0441\u043b\u0435, \u0435\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u0444\u043b\u0430\u0433 \u043f\u043e\u0438\u0441\u043a\u0430 \u0437\u0430\u0449\u0438\u0442\u043d\u0438\u043a\u0430, \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0437\u0430\u0449\u0438\u0442\u043d\u0438\u043a\u0430 \u043d\u0430 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0435, \u0434\u0430\u043b\u0435\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0445\u043e\u0434 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0430\u0442\u0430\u043a\u0443\u044e\u0449\u0438\u0439 \u043f\u0435\u0448\u043a\u0438, \u0438 \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u0445\u043e\u0434 \u043b\u0435\u0433\u0430\u043b\u0435\u043d, \u0442\u043e \u043e\u043d \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0441\u043f\u0438\u0441\u043e\u043a. \u041f\u0440\u0438\u0447\u0435\u043c \u0435\u0441\u043b\u0438 \u043a\u043b\u0435\u0442\u043a\u0430 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0442\u043e\u0438\u0442 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0435, \u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0445\u043e\u0434\u044b-\u043f\u0440\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0445\u043e\u0434\u044b \u043f\u0435\u0448\u0435\u043a, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0434\u0440\u0443\u0433\u0443\u044e \u043c\u0430\u0441\u043a\u0443.<\/p>\n<p>\u041d\u043e \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u0444\u0438\u0433\u0443\u0440\u0430\u043c\u0438? \u0414\u043b\u044f \u043d\u0438\u0445 \u043d\u0430\u0434\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u0445\u043e\u0436\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u043d\u0438\u044f \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u043e\u0432. \u041e\u043d\u0430 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043b\u0435\u0433\u0447\u0435:<\/p>\n<pre><code class=\"cpp\">void LegalMoveGen::_piece_mask_to_moves(Pieces pieces, Bitboard mask, uint8_t attacker_p, uint8_t attacker_type, uint8_t attacker_side, MoveList &amp;moves) {     uint8_t defender_p;     uint8_t defender_type;      Move move;      while (mask) {         defender_p = BitboardOperations::bsf(mask);         BitboardOperations::set_0(mask, defender_p);          defender_type = 255;         for (uint8_t i = 0; i &lt; 6; i = i + 1) {             if (BitboardOperations::get_bit(pieces._piece_bitboards[Pieces::inverse(attacker_side)][i], defender_p)) {                 defender_type = i;                 break;             }         }          move = {attacker_p, defender_p, attacker_type, attacker_side, defender_type, Pieces::inverse(attacker_side)};          if (LegalMoveGen::_is_legal(pieces, move, false)) moves.push_back(move);     } }<\/code><\/pre>\n<p>\u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0431\u0435\u0440\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 \u0431\u0438\u0442\u0431\u043e\u0440\u0434, \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0442\u0430\u043c \u0431\u0438\u0442 (\u044d\u0442\u043e\u0442 \u0431\u0438\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043a\u0443\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0439\u0442\u0438 \u0444\u0438\u0433\u0443\u0440\u0430), \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0437\u0430\u0449\u0438\u0442\u043d\u0438\u043a\u0430, \u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0435 \u044d\u0442\u043e\u0433\u043e \u0431\u0438\u0442\u0430, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0445\u043e\u0434 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0430\u0442\u0430\u043a\u0443\u044e\u0449\u0435\u0439 \u0444\u0438\u0433\u0443\u0440\u044b \u0438, \u0435\u0441\u043b\u0438 \u043e\u043d \u043b\u0435\u0433\u0430\u043b\u0435\u043d, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0433\u043e \u0432 \u0441\u043f\u0438\u0441\u043e\u043a.<\/p>\n<p>\u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0441\u0435\u0445 \u0445\u043e\u0434\u043e\u0432 \u043a\u043e\u043d\u0435\u0439 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">Bitboard all_knights = position._pieces._piece_bitboards[side][Pieces::Knight]; uint8_t attacker_p; Bitboard mask; while (all_knights) {     attacker_p = BitboardOperations::bsf(all_knights);     BitboardOperations::set_0(all_knights, attacker_p);     mask = PsLegalMoveMaskGen::generate_knight_mask(position._pieces, attacker_p, side, only_captures);     LegalMoveGen::_piece_mask_to_moves(position._pieces, mask, attacker_p, Pieces::Knight, side, moves); }<\/code><\/pre>\n<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0440\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043d\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u0435:<\/p>\n<pre><code class=\"cpp\">void LegalMoveGen::_add_en_passant_captures(Pieces pieces, uint8_t side, uint8_t en_passant, MoveList &amp;moves) {     if (en_passant == 255) return;      Move move;      if (side == Pieces::White) {         if (en_passant % 8 != 7 and BitboardOperations::get_bit(pieces._piece_bitboards[Pieces::White][Pieces::Pawn], en_passant - 7)) {             move = {(uint8_t)(en_passant - 7), en_passant, Pieces::Pawn, Pieces::White, 255, 255, Move::Flag::EnPassantCapture};             if (LegalMoveGen::_is_legal(pieces, move, true)) moves.push_back(move);         }         if (en_passant % 8 != 0 and BitboardOperations::get_bit(pieces._piece_bitboards[Pieces::White][Pieces::Pawn], en_passant - 9)) {             move = {(uint8_t)(en_passant - 9), en_passant, Pieces::Pawn, Pieces::White, 255, 255, Move::Flag::EnPassantCapture};             if (LegalMoveGen::_is_legal(pieces, move, true)) moves.push_back(move);         }     }     else {         if (en_passant % 8 != 0 and BitboardOperations::get_bit(pieces._piece_bitboards[Pieces::Black][Pieces::Pawn], en_passant + 7)) {             move = {(uint8_t)(en_passant + 7), en_passant, Pieces::Pawn, Pieces::Black, 255, 255, Move::Flag::EnPassantCapture};             if (LegalMoveGen::_is_legal(pieces, move, true)) moves.push_back(move);         }         if (en_passant % 8 != 7 and BitboardOperations::get_bit(pieces._piece_bitboards[Pieces::Black][Pieces::Pawn], en_passant + 9)) {             move = {(uint8_t)(en_passant + 9), en_passant, Pieces::Pawn, Pieces::Black, 255, 255, Move::Flag::EnPassantCapture};             if (LegalMoveGen::_is_legal(pieces, move, true)) moves.push_back(move);         }     } } void LegalMoveGen::_add_castling_moves(Pieces pieces, uint8_t side, bool long_castling, bool short_castling, MoveList &amp;moves) {     uint8_t index;     uint8_t long_castling_flag;     uint8_t short_castling_flag;     if (side == Pieces::White) {         index = 0;         long_castling_flag = Move::Flag::WhiteLongCastling;         short_castling_flag = Move::Flag::WhiteShortCastling;     }     else {         index = 56;         long_castling_flag = Move::Flag::BlackLongCastling;         short_castling_flag = Move::Flag::BlackShortCastling;     }      if (long_castling and BitboardOperations::get_bit(pieces._piece_bitboards[side][Pieces::Rook], 0 + index) and BitboardOperations::get_bit(pieces._empty, 1 + index) and BitboardOperations::get_bit(pieces._empty, 2 + index) and BitboardOperations::get_bit(pieces._empty, 3 + index)) {         if (!PsLegalMoveMaskGen::in_danger(pieces, BitboardOperations::bsf(pieces._piece_bitboards[side][Pieces::King]), side) and !PsLegalMoveMaskGen::in_danger(pieces, 2 + index, side) and !PsLegalMoveMaskGen::in_danger(pieces, 3 + index, side)) moves.push_back({(uint8_t)(4 + index), (uint8_t)(2 + index), Pieces::King, side, 255, 255, long_castling_flag});     }     if (short_castling and BitboardOperations::get_bit(pieces._piece_bitboards[side][Pieces::Rook], 7 + index) and BitboardOperations::get_bit(pieces._empty, 5 + index) and BitboardOperations::get_bit(pieces._empty, 6 + index)) {         if (!PsLegalMoveMaskGen::in_danger(pieces, BitboardOperations::bsf(pieces._piece_bitboards[side][Pieces::King]), side) and !PsLegalMoveMaskGen::in_danger(pieces, 5 + index, side) and !PsLegalMoveMaskGen::in_danger(pieces, 6 + index, side)) moves.push_back({(uint8_t)(4 + index), (uint8_t)(6 + index), Pieces::King, side, 255, 255, short_castling_flag});     } }<\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0445\u043e\u0434\u043e\u0432-\u0432\u0437\u044f\u0442\u0438\u0439 \u043d\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0435 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c, \u043d\u043e \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0440\u0435\u0434\u043a\u043e \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u043f\u043e\u0442\u0435\u0440\u044c \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435\u0442.<\/p>\n<h2>\u041f\u043e\u0438\u0441\u043a \u043e\u0448\u0438\u0431\u043e\u043a<\/h2>\n<p>\u0411\u044b\u043b\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0438 \u0445\u043e\u0440\u043e\u0448\u043e \u0431\u044b \u0431\u044b\u043b\u043e \u043f\u043e\u0438\u0441\u043a\u0430\u0442\u044c \u0432 \u043d\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0438. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e. \u041d\u0443\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043f\u043e\u0437\u0438\u0446\u0438\u044e, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043a \u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044f\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0439\u0442\u0438 \u0438\u0437 \u044d\u0442\u043e\u0439 \u0441\u043f\u0443\u0441\u0442\u044f n \u0445\u043e\u0434\u043e\u0432, \u0430 \u0437\u0430\u0442\u0435\u043c \u0441\u0432\u0435\u0440\u0438\u0442\u044c \u044d\u0442\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0439 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u044b\u043c\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c\u0438.<\/p>\n<p>\u041d\u043e \u043a\u0430\u043a\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0430? \u0421\u0430\u043c\u044b\u043c \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u044b\u043c \u0431\u044b\u043b\u043e \u0431\u044b \u0432\u0437\u044f\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e, \u043d\u043e \u0442\u043e\u043b\u043a\u0430 \u043e\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043c\u0430\u043b\u043e, \u0432\u0435\u0434\u044c \u043c\u043d\u043e\u0433\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u0432\u044b\u044f\u0432\u043b\u0435\u043d\u044b \u043d\u0430 \u0442\u0430\u043a\u043e\u043c \u0440\u0430\u043d\u043d\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u0438\u0433\u0440\u044b. \u042f \u0432\u044b\u0431\u0440\u0430\u043b \u044d\u0442\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9ab\/976\/e39\/9ab976e3936ce481bf5fbe8a35b6d28d.png\" width=\"393\" height=\"394\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9ab\/976\/e39\/9ab976e3936ce481bf5fbe8a35b6d28d.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041e\u043d\u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u0430 \u0442\u0435\u043c, \u0447\u0442\u043e \u043a\u043e\u0433\u0434\u0430-\u0442\u043e \u0434\u0430\u0432\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0434\u0432\u0438\u0436\u043a\u0430\u0445.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438\u0441\u044c \u0441 \u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0447\u0430\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b. \u0412\u043e\u0442 \u044d\u0442\u043e\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 &#171;\u043a\u043b\u0430\u0441\u0441&#187; \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"cpp\">#include &lt;chrono> #include &lt;iomanip> #include \"LegalMoveGen.hpp\"   #pragma once   class LegalMoveGenTester { public:     static void test(); private:     static uint64_t _get_nodes_number(const Position&amp; position, uint8_t side, uint32_t depth);      static constexpr std::string_view Fen = \"rnbq1k1r\/pp1Pbppp\/2p5\/8\/2B5\/8\/PPP1NnPP\/RNBQK2R\";     static constexpr uint8_t EnPassant = 255;     static constexpr bool WLCastling = true;     static constexpr bool WSCastling = true;     static constexpr bool BLCastling = false;     static constexpr bool BSCastling = false;      static constexpr std::array&lt;uint64_t, 6> Nodes = {1, 44, 1486, 62379, 2103487, 89941194}; };<\/code><\/pre>\n<pre><code class=\"cpp\">#include \"LegalMoveGenTester.hpp\"   #define nsecs std::chrono::high_resolution_clock::now().time_since_epoch().count()   void LegalMoveGenTester::test() {     Position position = {(std::string)LegalMoveGenTester::Fen, LegalMoveGenTester::EnPassant, LegalMoveGenTester::WLCastling, LegalMoveGenTester::WSCastling, LegalMoveGenTester::BLCastling, LegalMoveGenTester::BSCastling, 1};      uint64_t correct;     uint64_t got;      uint64_t time_start;     float speed;      for (uint32_t i = 0; i &lt; 6; i = i + 1) {         time_start = nsecs;          correct = LegalMoveGenTester::Nodes[i];         got = LegalMoveGenTester::_get_nodes_number(position, Pieces::White, i);          speed = (float)got \/ ((float)(nsecs - time_start) \/ (float)1e+9) \/ (float)1e+6;          if (correct == got) std::cout &lt;&lt; ANSI::Green &lt;&lt; \"Depth \" &lt;&lt; std::setw(4) &lt;&lt; i &lt;&lt; \". Correct: \" &lt;&lt; std::setw(18) &lt;&lt; correct &lt;&lt; \". Got: \" &lt;&lt; std::setw(18) &lt;&lt; got &lt;&lt; \". Speed: \" &lt;&lt; std::setw(10) &lt;&lt; speed &lt;&lt; \" MNPS. OK.\" &lt;&lt; ANSI::End &lt;&lt; std::endl;         else std::cout &lt;&lt; ANSI::Red &lt;&lt; \"Depth \" &lt;&lt; std::setw(4) &lt;&lt; i &lt;&lt; \". Correct: \" &lt;&lt; std::setw(18) &lt;&lt; correct &lt;&lt; \". Got: \" &lt;&lt; std::setw(18) &lt;&lt; got &lt;&lt; \". Speed: \" &lt;&lt; std::setw(10) &lt;&lt; speed &lt;&lt; \" MNPS. Error.\" &lt;&lt; ANSI::End &lt;&lt; std::endl;     } } uint64_t LegalMoveGenTester::_get_nodes_number(const Position&amp; position, uint8_t side, uint32_t depth) {     if (depth == 0) return 1;      uint64_t ctr = 0;      Position copy = position;      MoveList moves = LegalMoveGen::generate(copy, side);     Move move;      for (uint8_t i = 0; i &lt; moves.size(); i = i + 1) {         move = moves[i];          copy = position;         copy.move(move);         ctr = ctr + LegalMoveGenTester::_get_nodes_number(copy, Pieces::inverse(side), depth - 1);     }      return ctr; }<\/code><\/pre>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u044d\u0442\u043e\u0442 \u0442\u0435\u0441\u0442 \u0443 \u043c\u0435\u043d\u044f, \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0432\u044b\u0434\u0430\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u044d\u0442\u043e \u043d\u0435 \u0441\u0440\u0430\u0437\u0443.<\/p>\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u044b\u0439 \u0418\u0418<\/h2>\n<p>\u0421\u043f\u0443\u0441\u0442\u044f \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0432 \u043c\u044b \u0434\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0434\u043e \u0441\u0430\u043c\u043e\u0433\u043e, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e &#8212; \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0418\u0418. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u043a\u0442\u043e-\u0442\u043e \u0434\u043e\u0447\u0438\u0442\u0430\u043b.<\/p>\n<p>\u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u044b\u0439 \u0418\u0418 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0447\u0430\u0441\u0442\u0435\u0439: \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0446\u0435\u043d\u043a\u0438.<\/p>\n<p>\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0438 \u0438\u0437 \u043f\u043e\u0437\u0438\u0446\u0438\u0438. \u0421\u043c\u043e\u0442\u0440\u0438\u0442 \u043d\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u0438\u0433\u0443\u0440, \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u0435\u0448\u0435\u0447\u043d\u044b\u0435 \u0431\u043e\u043d\u0443\u0441\u044b \u0438 \u0442.\u0434. <\/p>\n<p>\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 \u0438\u0449\u0435\u0442 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u0438, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e. \u0418\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0430 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u0445\u043e\u0434\u0430 \u0431\u0435\u043b\u044b\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u044e\u0442 \u0444\u0435\u0440\u0437\u044f, \u043f\u043e\u0441\u043b\u0435 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0443 \u0447\u0435\u0440\u043d\u044b\u0445 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u043d\u0430\u044f \u043f\u0435\u0448\u043a\u0430, \u0430 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0430\u0442.<\/p>\n<h2>\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430<\/h2>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u043e\u0433\u043e \u0418\u0418, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e &#8212; \u0441\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0446\u0435\u043d\u043a\u043e\u0439.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0434\u0443\u043c\u0430\u0435\u043c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c. \u0410 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e, \u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0443\u044e \u0447\u0438\u0441\u043b\u043e. \u041f\u0440\u0438\u0447\u0435\u043c \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0438\u0441\u043b\u043e, \u0442\u0435\u043c \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0434\u043b\u044f \u0431\u0435\u043b\u044b\u0445, \u0430 \u0447\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0447\u0438\u0441\u043b\u043e, \u0442\u0435\u043c \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0434\u043b\u044f \u0447\u0435\u0440\u043d\u044b\u0445. \u0418\u0437\u043c\u0435\u0440\u044f\u0442\u044c \u043e\u0446\u0435\u043d\u043a\u0443 \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0432 \u0441\u043e\u0442\u044b\u0445 \u0435\u0434\u0438\u043d\u0438\u0446\u0430\u0445 \u043f\u0435\u0448\u043a\u0438, \u0442\u0430\u043a \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0443 \u0431\u0435\u043b\u044b\u0445 \u043f\u0435\u0440\u0435\u0432\u0435\u0441 \u0432 \u0434\u0432\u0435 \u043f\u0435\u0448\u043a\u0438, \u0442\u043e \u043e\u0446\u0435\u043d\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 +200, \u0430 \u0435\u0441\u043b\u0438 \u0443 \u0447\u0435\u0440\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u0432\u0435\u0441 \u0432 \u043e\u0434\u043d\u0443, \u0442\u043e -100.<\/p>\n<h2>\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b<\/h2>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0444\u0430\u043a\u0442\u043e\u0440, \u0441\u0430\u043c\u044b\u0439 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0439 \u0438 \u0441\u0430\u043c\u044b\u0439 \u0432\u0430\u0436\u043d\u044b\u0439 &#8212; \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b. \u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u0438\u0433\u0443\u0440. \u0427\u0442\u043e\u0431\u044b \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043d\u0430\u0434\u043e \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0444\u0438\u0433\u0443\u0440\u044b \u0435\u0435 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c. \u042f \u043d\u0430\u0448\u0435\u043b \u043d\u0430 \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438 \u0432\u043e\u0442 \u0442\u0430\u043a\u0443\u044e \u043e\u0446\u0435\u043d\u043a\u0443 \u0444\u0438\u0433\u0443\u0440 \u0438 \u0440\u0435\u0448\u0438\u043b \u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c:<\/p>\n<pre><code class=\"cpp\">struct Material {         static constexpr int32_t Pawn = 100;         static constexpr int32_t Knight = 305;         static constexpr int32_t Bishop = 333;         static constexpr int32_t Rook = 563;         static constexpr int32_t Queen = 950; };<\/code><\/pre>\n<p>\u041f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u043e\u0432:<\/p>\n<pre><code class=\"cpp\">int32_t StaticEvaluator::_material(Pieces pieces) {     int32_t material = 0;      material = material + StaticEvaluator::Material::Pawn * (BitboardOperations::count_1(pieces._piece_bitboards[Pieces::White][Pieces::Pawn]) - BitboardOperations::count_1(pieces._piece_bitboards[Pieces::Black][Pieces::Pawn]));     material = material + StaticEvaluator::Material::Knight * (BitboardOperations::count_1(pieces._piece_bitboards[Pieces::White][Pieces::Knight]) - BitboardOperations::count_1(pieces._piece_bitboards[Pieces::Black][Pieces::Knight]));     material = material + StaticEvaluator::Material::Bishop * (BitboardOperations::count_1(pieces._piece_bitboards[Pieces::White][Pieces::Bishop]) - BitboardOperations::count_1(pieces._piece_bitboards[Pieces::Black][Pieces::Bishop]));     material = material + StaticEvaluator::Material::Rook * (BitboardOperations::count_1(pieces._piece_bitboards[Pieces::White][Pieces::Rook]) - BitboardOperations::count_1(pieces._piece_bitboards[Pieces::Black][Pieces::Rook]));     material = material + StaticEvaluator::Material::Queen * (BitboardOperations::count_1(pieces._piece_bitboards[Pieces::White][Pieces::Queen]) - BitboardOperations::count_1(pieces._piece_bitboards[Pieces::Black][Pieces::Queen]));      return material; }<\/code><\/pre>\n<h2>\u041c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/h2>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u0444\u0430\u043a\u0442\u043e\u0440 &#8212; \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u044b \u0444\u0438\u0433\u0443\u0440\u044b (\u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u043b\u0435\u0439 \u043e\u043d\u0438 \u0431\u044c\u044e\u0442), \u0442\u0435\u043c \u043b\u0443\u0447\u0448\u0435. \u0421\u0447\u0438\u0442\u0430\u0442\u044c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0441\u0435\u0432\u0434\u043e\u043b\u0435\u0433\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c (\u0432\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u0445 \u0445\u043e\u0434\u043e\u0432 \u0443 \u043d\u0430\u0441 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0441\u0435\u0432\u0434\u043e\u043b\u0435\u0433\u0430\u043b\u044c\u043d\u044b\u0445, \u0432\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043b\u0435\u0433\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0438\u043b\u044c\u043d\u0435\u0435).<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0441\u0442\u0430\u043b\u043e \u044f\u0441\u043d\u043e \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435, \u043d\u0430\u0434\u043e \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0434\u043b\u044f \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0444\u0438\u0433\u0443\u0440. \u042d\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (\u043a\u0430\u043a \u0438 \u0432\u0441\u0435 \u0434\u0430\u043b\u044c\u0448\u0435) \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u043b \u044f \u0441\u0432\u043e\u0438\u043c\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043a\u0440\u0438\u0432\u044b\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438, \u0442\u0430\u043a \u0447\u0442\u043e \u043e\u043d\u0438, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0442\u043e\u0436\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043a\u0440\u0438\u0432\u044b\u0435.<\/p>\n<pre><code class=\"cpp\">struct Mobility {         static constexpr int32_t Knight = 9;         static constexpr int32_t Bishop = 4;         static constexpr int32_t Rook = 3;         static constexpr int32_t Queen = 3; };<\/code><\/pre>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">int32_t StaticEvaluator::_mobility(Pieces pieces) {     int32_t mobility = 0;      std::array&lt;std::array&lt;Bitboard, 6>, 2> iteration_masks = pieces._piece_bitboards;     uint8_t index;      int32_t knight_moves = 0;     int32_t bishop_moves = 0;     int32_t rook_moves = 0;     int32_t queen_moves = 0;      while (iteration_masks[Pieces::White][Pieces::Knight]) {         index = BitboardOperations::bsf(iteration_masks[Pieces::White][Pieces::Knight]);         BitboardOperations::set_0(iteration_masks[Pieces::White][Pieces::Knight], index);         knight_moves = knight_moves + BitboardOperations::count_1(PsLegalMoveMaskGen::generate_knight_mask(pieces, index, Pieces::White, false));     }     while (iteration_masks[Pieces::White][Pieces::Bishop]) {         index = BitboardOperations::bsf(iteration_masks[Pieces::White][Pieces::Bishop]);         BitboardOperations::set_0(iteration_masks[Pieces::White][Pieces::Bishop], index);         bishop_moves = bishop_moves + BitboardOperations::count_1(PsLegalMoveMaskGen::generate_bishop_mask(pieces, index, Pieces::White, false));     }     while (iteration_masks[Pieces::White][Pieces::Rook]) {         index = BitboardOperations::bsf(iteration_masks[Pieces::White][Pieces::Rook]);         BitboardOperations::set_0(iteration_masks[Pieces::White][Pieces::Rook], index);         rook_moves = rook_moves + BitboardOperations::count_1(PsLegalMoveMaskGen::generate_rook_mask(pieces, index, Pieces::White, false));     }     while (iteration_masks[Pieces::White][Pieces::Queen]) {         index = BitboardOperations::bsf(iteration_masks[Pieces::White][Pieces::Queen]);         BitboardOperations::set_0(iteration_masks[Pieces::White][Pieces::Queen], index);         queen_moves = queen_moves + BitboardOperations::count_1(PsLegalMoveMaskGen::generate_queen_mask(pieces, index, Pieces::White, false));     }      while (iteration_masks[Pieces::Black][Pieces::Knight]) {         index = BitboardOperations::bsf(iteration_masks[Pieces::Black][Pieces::Knight]);         BitboardOperations::set_0(iteration_masks[Pieces::Black][Pieces::Knight], index);         knight_moves = knight_moves - BitboardOperations::count_1(PsLegalMoveMaskGen::generate_knight_mask(pieces, index, Pieces::Black, false));     }     while (iteration_masks[Pieces::Black][Pieces::Bishop]) {         index = BitboardOperations::bsf(iteration_masks[Pieces::Black][Pieces::Bishop]);         BitboardOperations::set_0(iteration_masks[Pieces::Black][Pieces::Bishop], index);         bishop_moves = bishop_moves - BitboardOperations::count_1(PsLegalMoveMaskGen::generate_bishop_mask(pieces, index, Pieces::Black, false));     }     while (iteration_masks[Pieces::Black][Pieces::Rook]) {         index = BitboardOperations::bsf(iteration_masks[Pieces::Black][Pieces::Rook]);         BitboardOperations::set_0(iteration_masks[Pieces::Black][Pieces::Rook], index);         rook_moves = rook_moves - BitboardOperations::count_1(PsLegalMoveMaskGen::generate_rook_mask(pieces, index, Pieces::Black, false));     }     while (iteration_masks[Pieces::Black][Pieces::Queen]) {         index = BitboardOperations::bsf(iteration_masks[Pieces::Black][Pieces::Queen]);         BitboardOperations::set_0(iteration_masks[Pieces::Black][Pieces::Queen], index);         queen_moves = queen_moves - BitboardOperations::count_1(PsLegalMoveMaskGen::generate_queen_mask(pieces, index, Pieces::Black, false));     }      mobility = mobility + StaticEvaluator::Mobility::Knight * knight_moves;     mobility = mobility + StaticEvaluator::Mobility::Bishop * bishop_moves;     mobility = mobility + StaticEvaluator::Mobility::Rook * rook_moves;     mobility = mobility + StaticEvaluator::Mobility::Queen * queen_moves;      return mobility; }<\/code><\/pre>\n<h2>\u0421\u0434\u0432\u043e\u0435\u043d\u043d\u044b\u0435 \u043f\u0435\u0448\u043a\u0438<\/h2>\n<p>\u0422\u0440\u0435\u0442\u0438\u0439 \u0444\u0430\u043a\u0442\u043e\u0440 &#8212; \u0441\u0434\u0432\u043e\u0435\u043d\u043d\u044b\u0435 \u043f\u0435\u0448\u043a\u0438. \u0421\u0434\u0432\u043e\u0435\u043d\u043d\u0430\u044f \u043f\u0435\u0448\u043a\u0430 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0430\u0431\u043e\u0441\u0442\u044c\u044e. \u0412 \u043c\u043e\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0441\u0434\u0432\u043e\u0435\u043d\u043d\u0430\u044f \u043f\u0435\u0448\u043a\u0430 \u0443\u0445\u0443\u0434\u0448\u0430\u0435\u0442 \u043e\u0446\u0435\u043d\u043a\u0443 \u043d\u0430 25:<\/p>\n<pre><code class=\"cpp\">static constexpr int32_t DoublePawn = -25;<\/code><\/pre>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"cpp\">int32_t StaticEvaluator::_pawn_structure_double_pawn(Pieces pieces) {     int32_t double_pawn = 0;      int32_t double_pawn_ctr = 0;      uint8_t white_pawns;     uint8_t black_pawns;      for (uint8_t x = 0; x &lt; 8; x = x + 1) {         white_pawns = BitboardOperations::count_1(pieces._piece_bitboards[Pieces::White][Pieces::Pawn] &amp; BitboardColumns::Columns[x]);         black_pawns = BitboardOperations::count_1(pieces._piece_bitboards[Pieces::Black][Pieces::Pawn] &amp; BitboardColumns::Columns[x]);          double_pawn_ctr = double_pawn_ctr + std::max(0, white_pawns - 1);         double_pawn_ctr = double_pawn_ctr - std::max(0, black_pawns - 1);     }      double_pawn = double_pawn + StaticEvaluator::PawnStructure::DoublePawn * double_pawn_ctr;      return double_pawn; }<\/code><\/pre>\n<h2>\u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0435 \u043f\u0435\u0448\u043a\u0438<\/h2>\n<p>\u0427\u0435\u0442\u0432\u0435\u0440\u0442\u044b\u0439 \u0444\u0430\u043a\u0442\u043e\u0440 &#8212; \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0435 \u043f\u0435\u0448\u043a\u0438. \u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u0430\u044f \u043f\u0435\u0448\u043a\u0430 &#8212; \u043f\u0435\u0448\u043a\u0430, \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u0430\u044f \u0434\u0440\u0443\u0433\u043e\u0439. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u043a\u0438\u0445 \u043f\u0435\u0448\u0435\u043a \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u0432 \u0445\u043e\u0440\u043e\u0448\u0435\u0439 \u043f\u0435\u0448\u0435\u0447\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u0412 \u043c\u043e\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0441\u0434\u0432\u043e\u0435\u043d\u043d\u044b\u0435 \u043f\u0435\u0448\u043a\u0438 \u0443\u043b\u0443\u0447\u0448\u0430\u044e\u0442 \u043e\u0446\u0435\u043d\u043a\u0443 \u043d\u0430 12:<\/p>\n<pre><code class=\"cpp\">static constexpr int32_t ConnectedPawn = 12;<\/code><\/pre>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"cpp\">int32_t StaticEvaluator::_pawn_structure_connected_pawn(Pieces pieces) {     int32_t connected_pawn = 0;      int32_t connected_pawn_ctr = 0;      Bitboard white_captures = PsLegalMoveMaskGen::generate_pawn_left_captures_mask(pieces, Pieces::White, true) | PsLegalMoveMaskGen::generate_pawn_right_captures_mask(pieces, Pieces::White, true);     Bitboard black_captures = PsLegalMoveMaskGen::generate_pawn_left_captures_mask(pieces, Pieces::Black, true) | PsLegalMoveMaskGen::generate_pawn_right_captures_mask(pieces, Pieces::Black, true);      connected_pawn_ctr = connected_pawn_ctr + BitboardOperations::count_1(white_captures &amp; pieces._piece_bitboards[Pieces::White][Pieces::Pawn]);     connected_pawn_ctr = connected_pawn_ctr - BitboardOperations::count_1(black_captures &amp; pieces._piece_bitboards[Pieces::Black][Pieces::Pawn]);      connected_pawn = connected_pawn + StaticEvaluator::PawnStructure::ConnectedPawn * connected_pawn_ctr;      return connected_pawn; }<\/code><\/pre>\n<h2>\u041f\u0440\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0448\u0435\u043a<\/h2>\n<p>\u041f\u044f\u0442\u044b\u0439 \u0444\u0430\u043a\u0442\u043e\u0440 &#8212; \u043f\u0440\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0448\u0435\u043a \u0438 \u0442\u0443\u0442 \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u0435-\u0447\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0435, \u043e \u0447\u0435\u043c \u044f \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b \u0432 \u0441\u0430\u043c\u043e\u043c \u043f\u0435\u0440\u0432\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435. \u0421\u0430\u043c\u044b\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u0435\u0448\u0435\u043a \u0431\u044b\u043b\u043e \u0431\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u043c \u043f\u0435\u0448\u043a\u0430\u043c \u0431\u043e\u043d\u0443\u0441 \u0437\u0430 \u0431\u043b\u0438\u0437\u043e\u0441\u0442\u044c \u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0434\u043b\u044f \u043d\u0438\u0445 \u0441\u0442\u0440\u043e\u043a\u0435, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0432\u0435\u0440\u043d\u043e. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 (\u0435\u0441\u043b\u0438 \u0442\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u0441\u044f) \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0435\u0448\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u043e\u043b\u0436\u043d\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0438\u043b\u044c\u043d\u0435\u0435 \u0442\u044f\u043d\u0443\u0442\u044c \u0432\u043f\u0435\u0440\u0435\u0434, \u0447\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u0435.<\/p>\n<p>\u041d\u043e \u043a\u0430\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0447\u0442\u043e \u043f\u0435\u0448\u043a\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u043d\u043e\u0439? \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043c\u0430\u0441\u043a\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u043f\u0435\u0448\u043a\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u043d\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u0437\u0430 1-2 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u0412\u043e\u0442 \u043a\u043e\u0434 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043c\u0430\u0441\u043a\u0438 \u0434\u043b\u044f \u043e\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0435\u0448\u0435\u043a:<\/p>\n<pre><code class=\"cpp\">#include &lt;array> #include \"..\/Base\/PositionRepresentation\/Bitboard.hpp\"   #pragma once   namespace PassedPawnMasks {     static consteval std::array&lt;Bitboard, 64> calc_white_passed_pawn_masks() {         std::array&lt;Bitboard, 64> masks{};          for (uint8_t x = 0; x &lt; 8; x = x + 1) {             for (uint8_t y = 0; y &lt; 8; y = y + 1) {                  for (uint8_t y1 = y + 1; y1 &lt; 8; y1 = y1 + 1) {                     if (x != 0) BitboardOperations::set_1(masks[y * 8 + x], y1 * 8 + x - 1);                     if (x != 7) BitboardOperations::set_1(masks[y * 8 + x], y1 * 8 + x + 1);                     BitboardOperations::set_1(masks[y * 8 + x], y1 * 8 + x);                 }             }         }          return masks;     }       static consteval std::array&lt;Bitboard, 64> calc_black_passed_pawn_masks() {         std::array&lt;Bitboard, 64> masks{};          for (uint8_t x = 0; x &lt; 8; x = x + 1) {             for (uint8_t y = 0; y &lt; 8; y = y + 1) {                  for (int8_t y1 = y - 1; y1 >= 0; y1 = y1 - 1) {                     if (x != 0) BitboardOperations::set_1(masks[y * 8 + x], y1 * 8 + x - 1);                     if (x != 7) BitboardOperations::set_1(masks[y * 8 + x], y1 * 8 + x + 1);                     BitboardOperations::set_1(masks[y * 8 + x], y1 * 8 + x);                 }             }         }          return masks;     }       static constexpr std::array&lt;Bitboard, 64> WhitePassedPawnMasks = PassedPawnMasks::calc_white_passed_pawn_masks();     static constexpr std::array&lt;Bitboard, 64> BlackPassedPawnMasks = PassedPawnMasks::calc_black_passed_pawn_masks(); }<\/code><\/pre>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u044d\u0442\u0438 \u043c\u0430\u0441\u043a\u0438, \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0444\u0430\u043a\u0442\u043e\u0440:<\/p>\n<pre><code class=\"cpp\">int32_t StaticEvaluator::_pawn_structure_pawn_promotion(Pieces pieces) {     int32_t pawn_promotion = 0;      Bitboard white_pawns = pieces._piece_bitboards[Pieces::White][Pieces::Pawn];     Bitboard black_pawns = pieces._piece_bitboards[Pieces::Black][Pieces::Pawn];      uint8_t index;      while (white_pawns) {         index = BitboardOperations::bsf(white_pawns);         BitboardOperations::set_0(white_pawns, index);          if (PassedPawnMasks::WhitePassedPawnMasks[index] &amp; pieces._piece_bitboards[Pieces::Black][Pieces::Pawn]) pawn_promotion = pawn_promotion + StaticEvaluator::PawnStructure::DefaultPawnPromotion[index \/ 8];         else pawn_promotion = pawn_promotion + StaticEvaluator::PawnStructure::PassedPawnPromotion[index \/ 8];     }     while (black_pawns) {         index = BitboardOperations::bsf(black_pawns);         BitboardOperations::set_0(black_pawns, index);          if (PassedPawnMasks::BlackPassedPawnMasks[index] &amp; pieces._piece_bitboards[Pieces::White][Pieces::Pawn]) pawn_promotion = pawn_promotion - StaticEvaluator::PawnStructure::DefaultPawnPromotion[7 - index \/ 8];         else pawn_promotion = pawn_promotion - StaticEvaluator::PawnStructure::PassedPawnPromotion[7 - index \/ 8];     }      return pawn_promotion; }<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u044f \u0432\u044b\u0431\u0440\u0430\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435:<\/p>\n<pre><code class=\"cpp\">static constexpr std::array&lt;int32_t, 8> DefaultPawnPromotion = {0, 0, 0, 0, 10, 20, 30, 0}; static constexpr std::array&lt;int32_t, 8> PassedPawnPromotion = {0, 50, 50, 50, 70, 90, 110, 0};<\/code><\/pre>\n<p>\u041e\u043d\u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442, \u0447\u0442\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u043d\u0430\u044f \u043f\u0435\u0448\u043a\u0430 \u0432 2 \u0440\u0430\u0437\u0430 \u0441\u0438\u043b\u044c\u043d\u0435\u0435 \u0445\u043e\u0447\u0435\u0442 \u0434\u043e\u0439\u0442\u0438 \u0434\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u0447\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u0430\u044f. \u041f\u043e\u043c\u0438\u043c\u043e \u044d\u0442\u043e\u0433\u043e \u043b\u044e\u0431\u0430\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u043d\u0430\u044f \u043f\u0435\u0448\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043f\u043e 50 \u043a \u043e\u0446\u0435\u043d\u043a\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430 \u0442\u043e, \u0447\u0442\u043e \u043e\u043d\u0430 \u0435\u0441\u0442\u044c.<\/p>\n<h2>\u041f\u043e\u0442\u0435\u0440\u044f\u043d\u043d\u0430\u044f \u0440\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430<\/h2>\n<p>\u0428\u0435\u0441\u0442\u043e\u0439 \u0444\u0430\u043a\u0442\u043e\u0440 &#8212; \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043d\u0430\u044f \u0440\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430. \u0415\u0441\u043b\u0438 \u043a\u043e\u0440\u043e\u043b\u044c \u043f\u043e\u0442\u0435\u0440\u044f\u043b \u0440\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u043d\u0435 \u0440\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0432\u0448\u0438\u0441\u044c, \u0442\u043e \u044d\u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e\u0439 \u0441\u043b\u0430\u0431\u043e\u0441\u0442\u044c\u044e \u0434\u043b\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u0440\u043e\u043b\u044f. \u0412 \u043c\u043e\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u0443\u0445\u0443\u0434\u0448\u0430\u0435\u0442 \u0441\u0432\u043e\u044e \u043e\u0446\u0435\u043d\u043a\u0443 \u043d\u0430 50 \u0437\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043d\u0443\u044e \u0440\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443:<\/p>\n<pre><code class=\"cpp\">static constexpr int32_t CrashedCastling = -50;<\/code><\/pre>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"cpp\">int32_t StaticEvaluator::_king_safety_crashed_castling(bool w_l_castling, bool w_s_castling, bool b_l_castling, bool b_s_castling, bool white_castling_happened, bool black_castling_happened) {     int32_t crashed_castling = 0;      if (!white_castling_happened) {         if (!w_l_castling) crashed_castling = crashed_castling + StaticEvaluator::KingSafety::CrashedCastling;         if (!w_s_castling) crashed_castling = crashed_castling + StaticEvaluator::KingSafety::CrashedCastling;     }      if (!black_castling_happened) {         if (!b_l_castling) crashed_castling = crashed_castling - StaticEvaluator::KingSafety::CrashedCastling;         if (!b_s_castling) crashed_castling = crashed_castling - StaticEvaluator::KingSafety::CrashedCastling;     }      return crashed_castling; }<\/code><\/pre>\n<h2>\u041f\u0435\u0448\u0435\u0447\u043d\u044b\u0439 \u0449\u0438\u0442<\/h2>\n<p>\u0421\u0435\u0434\u044c\u043c\u043e\u0439 \u0444\u0430\u043a\u0442\u043e\u0440 &#8212; \u043f\u0435\u0448\u0435\u0447\u043d\u044b\u0439 \u0449\u0438\u0442. \u041f\u0435\u0448\u0435\u0447\u043d\u044b\u0439 \u0449\u0438\u0442 &#8212; \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u0440\u043e\u043b\u044f. \u0418\u0434\u0435\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0440\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u0430\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u043f\u0435\u0448\u043a\u0438 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0434\u0432\u0443\u0445 \u0441\u0442\u0440\u043e\u043a\u0430\u0445. \u0412 \u043c\u043e\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u0442 \u0441\u0432\u043e\u044e \u043e\u0446\u0435\u043d\u043a\u0443 \u043d\u0430 33 \u0437\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0442\u0430\u043a\u0443\u044e \u043f\u0435\u0448\u043a\u0443:<\/p>\n<pre><code class=\"cpp\">static constexpr int32_t PawnShield = 33;<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0444\u0430\u043a\u0442\u043e\u0440\u0430 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043c\u0430\u0441\u043a\u0438 \u043f\u0435\u0448\u0435\u0447\u043d\u044b\u0445 \u0449\u0438\u0442\u043e\u0432 \u0437\u0430\u0440\u0430\u043d\u0435\u0435:<\/p>\n<pre><code class=\"cpp\">#include &lt;array> #include \"..\/Base\/PositionRepresentation\/Bitboard.hpp\"   #pragma once   namespace PawnShieldMasks {     static consteval std::array&lt;Bitboard, 64> calc_white_pawn_shield_masks() {         std::array&lt;Bitboard, 64> white_pawn_shield_masks{};          for (uint8_t x = 0; x &lt; 8; x = x + 1) {             for (uint8_t y = 0; y &lt; 7; y = y + 1) {                 if (x != 0) BitboardOperations::set_1(white_pawn_shield_masks[y * 8 + x], (y + 1) * 8 + x - 1);                 if (x != 7) BitboardOperations::set_1(white_pawn_shield_masks[y * 8 + x], (y + 1) * 8 + x + 1);                 BitboardOperations::set_1(white_pawn_shield_masks[y * 8 + x], (y + 1) * 8 + x);                  if (y != 6) {                     if (x != 0) BitboardOperations::set_1(white_pawn_shield_masks[y * 8 + x], (y + 2) * 8 + x - 1);                     if (x != 7) BitboardOperations::set_1(white_pawn_shield_masks[y * 8 + x], (y + 2) * 8 + x + 1);                     BitboardOperations::set_1(white_pawn_shield_masks[y * 8 + x], (y + 2) * 8 + x);                 }             }         }          return white_pawn_shield_masks;     }       static consteval std::array&lt;Bitboard, 64> calc_black_pawn_shield_masks() {         std::array&lt;Bitboard, 64> black_pawn_shield_masks{};          for (uint8_t x = 0; x &lt; 8; x = x + 1) {             for (uint8_t y = 1; y &lt; 8; y = y + 1) {                 if (x != 0) BitboardOperations::set_1(black_pawn_shield_masks[y * 8 + x], (y - 1) * 8 + x - 1);                 if (x != 7) BitboardOperations::set_1(black_pawn_shield_masks[y * 8 + x], (y - 1) * 8 + x + 1);                 BitboardOperations::set_1(black_pawn_shield_masks[y * 8 + x], (y - 1) * 8 + x);                  if (y != 1) {                     if (x != 0) BitboardOperations::set_1(black_pawn_shield_masks[y * 8 + x], (y - 2) * 8 + x - 1);                     if (x != 7) BitboardOperations::set_1(black_pawn_shield_masks[y * 8 + x], (y - 2) * 8 + x + 1);                     BitboardOperations::set_1(black_pawn_shield_masks[y * 8 + x], (y - 2) * 8 + x);                 }             }         }          return black_pawn_shield_masks;     }       static constexpr std::array&lt;Bitboard, 64> WhitePawnShieldMasks = PawnShieldMasks::calc_white_pawn_shield_masks();     static constexpr std::array&lt;Bitboard, 64> BlackPawnShieldMasks = PawnShieldMasks::calc_black_pawn_shield_masks(); }<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0444\u0430\u043a\u0442\u043e\u0440 \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u0436\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"cpp\">int32_t StaticEvaluator::_king_safety_pawn_shield(Pieces pieces, bool white_castling_happened, bool black_castling_happened) {     int32_t pawn_shield = 0;      int32_t pawn_shield_ctr = 0;      if (white_castling_happened) {         Bitboard white_pawns = pieces._piece_bitboards[Pieces::White][Pieces::Pawn];         Bitboard white_pawn_shield = PawnShieldMasks::WhitePawnShieldMasks[BitboardOperations::bsf(pieces._piece_bitboards[Pieces::White][Pieces::King])];         pawn_shield_ctr = pawn_shield_ctr + BitboardOperations::count_1(white_pawns &amp; white_pawn_shield);     }      if (black_castling_happened) {         Bitboard black_pawns = pieces._piece_bitboards[Pieces::Black][Pieces::Pawn];         Bitboard black_pawn_shield = PawnShieldMasks::BlackPawnShieldMasks[BitboardOperations::bsf(pieces._piece_bitboards[Pieces::Black][Pieces::King])];         pawn_shield_ctr = pawn_shield_ctr - BitboardOperations::count_1(black_pawns &amp; black_pawn_shield);     }      pawn_shield = pawn_shield + StaticEvaluator::KingSafety::PawnShield * pawn_shield_ctr;      return pawn_shield; }<\/code><\/pre>\n<h2>\u0414\u0432\u0430 \u0441\u043b\u043e\u043d\u0430<\/h2>\n<p>\u0412\u043e\u0441\u044c\u043c\u043e\u0439 \u0444\u0430\u043a\u0442\u043e\u0432 &#8212; \u0434\u0432\u0430 \u0441\u043b\u043e\u043d\u0430. \u0415\u0441\u043b\u0438 \u0438\u0433\u0440\u043e\u043a \u0441\u043c\u043e\u0433 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u0432\u0443\u0445 \u0441\u043b\u043e\u043d\u043e\u0432, \u0442\u043e \u0437\u0430 \u044d\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043e\u0446\u0435\u043d\u043a\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u0432\u0430 \u0441\u043b\u043e\u043d\u0430 \u0432\u043c\u0435\u0441\u0442\u0435 \u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u0440\u0435\u0437\u0430\u0442\u044c \u043f\u0435\u0448\u043a\u0438 \u0438\u043b\u0438 \u043a\u043e\u0440\u043e\u043b\u044f. \u0412 \u043c\u043e\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0434\u0432\u0430 \u0441\u043b\u043e\u043d\u0430 \u0443\u043b\u0443\u0447\u0448\u0430\u044e\u0442 \u043e\u0446\u0435\u043d\u043a\u0443 \u043d\u0430 50:<\/p>\n<pre><code class=\"cpp\">static constexpr int32_t TwoBishops = 50;<\/code><\/pre>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"cpp\">int32_t StaticEvaluator::_two_bishops(Pieces pieces) {     int32_t two_bishops = 0;      if (BitboardOperations::count_1(pieces._piece_bitboards[Pieces::White][Pieces::Bishop]) >= 2) two_bishops = two_bishops + StaticEvaluator::TwoBishops;     if (BitboardOperations::count_1(pieces._piece_bitboards[Pieces::Black][Pieces::Bishop]) >= 2) two_bishops = two_bishops - StaticEvaluator::TwoBishops;      return two_bishops; }<\/code><\/pre>\n<h2>\u041e\u0441\u043e\u0431\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 \u0434\u043b\u044f \u044d\u043d\u0434\u0448\u043f\u0438\u043b\u044f<\/h2>\n<p>\u0412 \u044d\u043d\u0434\u0448\u043f\u0438\u043b\u0435 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u044b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u044b\u0442\u044b\u0432\u0430\u044e\u0442 \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u0430\u0436\u0435 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u044d\u043d\u0434\u0448\u043f\u0438\u043b\u044c \u043a\u0430\u043a \u043a\u043e\u0440\u043e\u043b\u044c \u0441 \u0444\u0435\u0440\u0437\u0435\u043c \u043f\u0440\u043e\u0442\u0438\u0432 \u043a\u043e\u0440\u043e\u043b\u044f \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043c\u0430\u0442 \u0432 20-30 \u0445\u043e\u0434\u043e\u0432, \u0447\u0442\u043e \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0434\u0430\u0436\u0435 \u0441\u0430\u043c\u044b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u0432\u0438\u0436\u043a\u0438.<\/p>\n<p>\u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446 \u041d\u0430\u043b\u0438\u043c\u043e\u0432\u0430 \u0438\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446 syzygy &#8212; \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u0433\u0434\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u044d\u043d\u0434\u0448\u043f\u0438\u043b\u0435\u0439. \u041f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u044d\u0442\u0438\u0445 \u0431\u0430\u0437 \u0418\u0418 \u043c\u043e\u0436\u0435\u0442 \u0438\u0433\u0440\u0430\u0442\u044c \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e, \u043d\u043e \u0443 \u044d\u0442\u0438\u0445 \u0431\u0430\u0437 \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432. \u041e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445 &#8212; \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c syzygy \u0431\u0443\u0434\u0435\u0442 \u0442\u0440\u0443\u0434\u043d\u0435\u0435, \u0447\u0435\u043c \u0432\u0441\u0435, \u0447\u0442\u043e \u0432\u044b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b\u0438 \u0434\u043e \u044d\u0442\u043e\u0433\u043e. \u0414\u0440\u0443\u0433\u043e\u0439, \u0431\u043e\u043b\u0435\u0435 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0439, &#8212; \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440. \u042d\u0442\u0438 \u0411\u0414 \u043c\u043e\u0433\u0443\u0442 \u0432\u0435\u0441\u0438\u0442\u044c \u0442\u0435\u0440\u0430\u0431\u0430\u0439\u0442\u044b, \u0447\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0434\u0432\u0438\u0436\u043a\u043e\u0432.<\/p>\n<p>\u0414\u0440\u0443\u0433\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0441\u043e\u0431\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 \u0434\u043b\u044f \u044d\u043d\u0434\u0448\u043f\u0438\u043b\u044f. \u041e\u043d\u0430 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0431\u043b\u0438\u0437\u043e\u0441\u0442\u044c \u043a\u043e\u0440\u043e\u043b\u044f \u043f\u043e\u0431\u0435\u0436\u0434\u0430\u044e\u0449\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043a \u043a\u043e\u0440\u043e\u043b\u044e \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0439, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u0440\u043e\u043b\u044f \u043e\u0442 \u0446\u0435\u043d\u0442\u0440\u0430:<\/p>\n<pre><code class=\"cpp\">static constexpr int32_t AttackerKingProximityToDefenderKing = 10; static constexpr int32_t DistanceBetweenDefenderKingAndMiddle = 10;<\/code><\/pre>\n<p>\u041d\u043e \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u044d\u043d\u0434\u0448\u043f\u0438\u043b\u044c? \u0412 \u043c\u043e\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u044d\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u043d\u0435\u0435 9 \u0444\u0438\u0433\u0443\u0440:<\/p>\n<pre><code class=\"cpp\">static constexpr int32_t MaximumPiecesForEndgame = 8;<\/code><\/pre>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u044d\u043d\u0434\u0448\u043f\u0438\u043b\u044c\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"cpp\">int32_t StaticEvaluator::_endgame(Pieces pieces, bool white_leading) {     int32_t endgame = 0;      if (BitboardOperations::count_1(pieces._all) > StaticEvaluator::Endgame::MaximumPiecesForEndgame) return endgame;      uint8_t attacker_side;     uint8_t defender_side;      if (white_leading) {         attacker_side = Pieces::White;         defender_side = Pieces::Black;     }     else {         attacker_side = Pieces::Black;         defender_side = Pieces::White;     }      uint8_t attacker_king_p = BitboardOperations::bsf(pieces._piece_bitboards[attacker_side][Pieces::King]);     uint8_t attacker_king_x = attacker_king_p % 8;     uint8_t attacker_king_y = attacker_king_p \/ 8;      uint8_t defender_king_p = BitboardOperations::bsf(pieces._piece_bitboards[defender_side][Pieces::King]);     uint8_t defender_king_x = defender_king_p % 8;     uint8_t defender_king_y = defender_king_p \/ 8;      endgame = endgame + StaticEvaluator::Endgame::AttackerKingProximityToDefenderKing * (16 - std::abs(attacker_king_x - defender_king_x) - std::abs(attacker_king_y - defender_king_y));     endgame = endgame + StaticEvaluator::Endgame::DistanceBetweenDefenderKingAndMiddle * (std::abs(defender_king_x - 3) + std::abs(defender_king_y - 4));      if (!white_leading) endgame = -endgame;      return endgame; }<\/code><\/pre>\n<h2>\u041c\u0438\u043d\u0438\u043c\u0430\u043a\u0441<\/h2>\n<p>\u041c\u044b \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043e\u0446\u0435\u043d\u043a\u0443. \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0430\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439. \u0421\u0430\u043c\u043e\u0439 \u043e\u0441\u043d\u043e\u0432\u043e\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043a\u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c. \u0415\u0433\u043e \u0438\u0434\u0435\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430: \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0449\u0435\u043c \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0438\u0439 \u0445\u043e\u0434 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0441 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a \u0442\u043e\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0438\u0435 \u0445\u043e\u0434\u044b. \u0412\u043e\u0442 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 \u0442\u0430\u043a\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430:<\/p>\n<pre><code>int maxi( int depth ) {     if ( depth == 0 ) return evaluate();     int max = -oo;     for ( all moves) {         score = mini( depth - 1 );         if( score > max )             max = score;     }     return max; }  int mini( int depth ) {     if ( depth == 0 ) return evaluate();     int min = +oo;     for ( all moves) {         score = maxi( depth - 1 );         if( score &lt; min )             min = score;     }     return min; }<\/code><\/pre>\n<p>, \u0433\u0434\u0435 depth &#8212; \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u0443\u0445\u043e\u0434\u043e\u0432 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0438\u0441\u043a\u0430\u0442\u044c, \u0430 evaluate() &#8212; \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0446\u0435\u043d\u043a\u0438 \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u044b\u043b \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440 \u0432\u044b\u0448\u0435.<\/p>\n<h2>\u041f\u0440\u043e\u0434\u043b\u0435\u043d\u0438\u0435 \u0448\u0430\u0445\u043e\u0432<\/h2>\n<p>\u0423\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0434\u043b\u0435\u0432\u0430\u044f \u0448\u0430\u0445\u0438. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441 \u043f\u0440\u043e\u0434\u043b\u0435\u043d\u0438\u0435\u043c \u0448\u0430\u0445\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0433\u043b\u0443\u0431\u043e\u043a\u0438\u0435 \u043c\u0430\u0442\u043e\u0432\u044b\u0435 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438. \u0418\u0434\u0435\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430\u044f &#8212; \u0435\u0441\u043b\u0438 \u0448\u0430\u0445, \u0442\u043e \u0433\u043b\u0443\u0431\u0438\u043d\u0443 \u043d\u0435 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c. \u042d\u0442\u043e \u043d\u0435 \u0432\u0437\u0440\u044b\u0432\u0430\u0435\u0442 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u0448\u0430\u0445\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0440\u0435\u0434\u043a\u043e \u0438 \u043f\u0440\u0438 \u043d\u0438\u0445 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0445\u043e\u0434\u043e\u0432.<\/p>\n<h2>\u0410\u043b\u044c\u0444\u0430-\u0431\u0435\u0442\u0430 \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435 \u0448\u0430\u0445\u043c\u0430\u0442 &#8212; 40. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0445\u043e\u0434\u0430 \u0435\u0441\u0442\u044c \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c 40 \u043e\u0442\u0432\u0435\u0442\u043d\u044b\u0445 \u0445\u043e\u0434\u043e\u0432. \u0412 \u0434\u0435\u0431\u044e\u0442\u0435 \u0438 \u044d\u043d\u0434\u0448\u043f\u0438\u043b\u0435 \u044d\u0442\u043e\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043a\u0443\u0434\u0430 \u043d\u0438\u0436\u0435, \u043d\u043e \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0438\u0433\u0440\u044b &#8212; 40. \u0422\u0435\u043f\u0435\u0440\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u043f\u043e\u0441\u043b\u0435 20 \u043f\u043e\u043b\u0443\u0445\u043e\u0434\u043e\u0432:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"40 ^ {20} \\approx 1.10 * 10 ^ {32}\" alt=\"40 ^ {20} \\approx 1.10 * 10 ^ {32}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7d8\/1d4\/009\/7d81d400966955c37de3b82edb3213c9.svg\" width=\"151\" height=\"21\"\/><\/p>\n<p>\u042d\u0442\u043e \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0442\u044c \u0442\u0440\u0438\u043b\u043b\u0430\u0440\u0434\u044b \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443, \u0447\u0442\u043e \u0432 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u0440\u0430\u0437 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438 \u0432\u0441\u0435\u0439 \u043f\u043b\u0430\u043d\u0435\u0442\u044b, \u0442\u043e \u043c\u044b \u0431\u044b \u043d\u0435 \u0443\u0441\u043f\u0435\u043b\u0438 \u0434\u0430\u0436\u0435 \u0437\u0430 \u0433\u043e\u0434. \u041e\u0434\u043d\u0430\u043a\u043e, \u0442\u0430\u043a\u0438\u0435 \u0442\u043e\u043f\u043e\u0432\u044b\u0435 \u0434\u0432\u0438\u0436\u043a\u0438 \u043a\u0430\u043a Stockfish \u0443\u043c\u0443\u0434\u0440\u044f\u044e\u0442\u0441\u044f \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0430 \u0442\u0430\u043a\u0443\u044e \u0433\u043b\u0443\u0431\u0438\u043d\u0443 \u0437\u0430 \u0441\u0435\u043a\u0443\u043d\u0434\u044b. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e Stockfish \u043d\u0435 \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0434\u0435\u0441\u044f\u0442\u044c \u0432 \u0442\u0440\u0438\u0434\u0446\u0430\u0442\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0439.<\/p>\n<p>\u041e\u0434\u0438\u043d \u0438\u0437 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0439\u0448\u0438\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0432 \u043c\u0438\u043d\u0438\u043c\u0430\u043a\u0441\u0435 &#8212; \u0430\u043b\u044c\u0444\u0430-\u0431\u0435\u0442\u0430 \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435. \u0418\u0434\u0435\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c, \u0447\u0442\u043e \u043e\u0446\u0435\u043d\u043a\u0430 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0432\u0435\u0442\u0432\u0438 \u043f\u043e-\u043b\u044e\u0431\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u0445\u0443\u0436\u0435 \u043e\u0446\u0435\u043d\u043a\u0438 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439, \u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430. \u0412\u043d\u0438\u0437\u0443 \u0435\u0441\u0442\u044c \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0438\u0437 \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438, \u043e\u043d\u0430 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u0430\u044f:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b42\/65c\/5bc\/b4265c5bc67adf7885b341301562d98b.png\" width=\"400\" height=\"203\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b42\/65c\/5bc\/b4265c5bc67adf7885b341301562d98b.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0432 \u0441\u0430\u043c\u043e\u043c \u0432\u0432\u0435\u0440\u0445\u0443 \u043c\u044b \u0438\u0449\u0435\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0442\u0440\u0435\u0445 \u0447\u0438\u0441\u0435\u043b (3, 6, 5). \u042d\u0442\u0438 \u0442\u0440\u0438 \u0447\u0438\u0441\u043b\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u0434\u0432\u0443\u0445 \u0447\u0438\u0441\u0435\u043b, \u043d\u043e \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0442\u0432\u0438 \u043c\u044b \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043d\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0443 \u043d\u0430\u0441 \u043f\u043e\u043f\u0430\u043b\u0430\u0441\u044c \u043f\u044f\u0442\u0435\u0440\u043a\u0430 \u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u043e\u0439\u0434\u0435\u0442 \u0434\u0430\u043b\u044c\u0448\u0435 \u044d\u0442\u0430 \u0432\u0435\u0442\u0432\u044c \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442, \u0442\u0430\u043a \u043a\u0430\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 5, \u0430 \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0430 \u0441 6 \u043d\u0430 \u0447\u0442\u043e-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0435 \u043d\u0443\u0436\u043d\u043e 7 \u0438\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435.<\/p>\n<p>\u0412\u043e\u0442 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434:<\/p>\n<pre><code>int alphaBetaMax( int alpha, int beta, int depthleft ) {    if ( depthleft == 0 ) return evaluate();    for ( all moves) {       score = alphaBetaMin( alpha, beta, depthleft - 1 );       if( score >= beta )          return beta;   \/\/ fail hard beta-cutoff       if( score > alpha )          alpha = score; \/\/ alpha acts like max in MiniMax    }    return alpha; }  int alphaBetaMin( int alpha, int beta, int depthleft ) {    if ( depthleft == 0 ) return evaluate();    for ( all moves) {       score = alphaBetaMax( alpha, beta, depthleft - 1 );       if( score &lt;= alpha )          return alpha; \/\/ fail hard alpha-cutoff       if( score &lt; beta )          beta = score; \/\/ beta acts like min in MiniMax    }    return beta; }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u043d\u0430\u0434\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 (\u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0446\u0432\u0435\u0442\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u044b) \u0441 alpha \u0440\u0430\u0432\u043d\u043e\u0439 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438 \u0438 beta \u0440\u0430\u0432\u043d\u043e\u0439 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438.<\/p>\n<h2>\u0410\u043b\u044c\u0444\u0430-\u0431\u0435\u0442\u0430 \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0441 \u043f\u0440\u043e\u0434\u043b\u0435\u043d\u0438\u0435\u043c \u0432\u0437\u044f\u0442\u0438\u0439<\/h2>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e. \u041f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0430\u043d\u0430\u043b\u0438\u0437 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0441 \u0433\u043b\u0443\u0431\u0438\u043d\u043e\u0439 8. \u041e\u0441\u043e\u0431\u043e \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0430 \u0432\u0435\u0442\u043a\u0430 \u0438 \u043e\u0434\u043d\u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u0432\u0435\u0442\u043e\u043a. \u0412\u0435\u0442\u043a\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0442\u0435\u043c, \u0447\u0442\u043e \u043d\u0430 8 \u0433\u043b\u0443\u0431\u0438\u043d\u0435 \u043c\u044b \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u043c \u0444\u0435\u0440\u0437\u044f, \u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u0432\u0435\u0442\u043e\u043a \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u0442\u0435\u043c, \u0447\u0442\u043e \u043d\u0430 2 \u0433\u043b\u0443\u0431\u0438\u043d\u0435 \u043c\u044b \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043d\u044f. \u0418\u0418, \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u044b\u0431\u0435\u0440\u0435\u0442 \u0432\u0435\u0442\u043a\u0443 \u0441 \u0432\u044b\u0438\u0433\u0440\u044b\u0448\u0435\u043c \u0444\u0435\u0440\u0437\u044f, \u0430 \u043d\u0435 \u0447\u0442\u043e-\u0442\u043e \u0438\u0437 \u0433\u0440\u0443\u043f\u043f\u044b \u0432\u0435\u0442\u043e\u043a \u0433\u0434\u0435 \u043c\u044b \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043d\u044f. \u041d\u043e \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u043a\u043e\u043d\u044f \u043c\u044b \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u043b\u0438, \u0430 \u043d\u0430 9 \u0433\u043b\u0443\u0431\u0438\u043d\u0435 \u0432\u0435\u0442\u043a\u0438 \u0441 \u0432\u044b\u0438\u0433\u0440\u044b\u0448\u0435\u043c \u0444\u0435\u0440\u0437\u044f \u0437\u0430\u0431\u0438\u0440\u0430\u043b\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u0444\u0435\u0440\u0437\u044f, \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0432\u044b\u0438\u0433\u0440\u044b\u0448\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e.<\/p>\n<p>\u0422\u0430\u043a\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u043c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430. \u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043d\u0430\u0448\u0435\u043c\u0443 \u0418\u0418 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u043b\u043e \u0433\u043b\u0443\u0431\u0438\u043d\u044b, \u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0438 \u0441\u0440\u0430\u0437\u0443 \u0434\u0432\u0435 \u043e\u0448\u0438\u0431\u043a\u0438: \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0442\u0443\u0442 \u043d\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 (\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u043a\u043e\u043d\u0444\u0443\u0437\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u0430\u043d\u0443\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0439 \u0433\u043b\u0443\u0431\u0438\u043d\u0435), \u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u044d\u0442\u0438\u043c \u043a\u0430\u043a \u0440\u0430\u0437 \u0435\u0441\u0442\u044c \u0447\u0442\u043e.<\/p>\n<p>\u0418\u0434\u0435\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043e\u0446\u0435\u043d\u043a\u0443, \u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0431\u0435\u0437 \u043b\u0438\u043c\u0438\u0442\u0430 \u043f\u043e \u0433\u043b\u0443\u0431\u0438\u043d\u0435, \u043d\u043e \u0441 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0437\u044f\u0442\u0438\u0439. \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043d\u0435 \u0443\u043b\u0443\u0447\u0448\u0430\u044e\u0442 \u043e\u0446\u0435\u043d\u043a\u0443, \u0442\u043e \u043d\u0430\u0434\u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440, \u0430 \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043e\u0446\u0435\u043d\u043a\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u0432\u0437\u044f\u0442\u0438\u0439.<\/p>\n<h2>\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0445\u043e\u0434\u043e\u0432<\/h2>\n<p>\u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u044c\u0444\u0430-\u0431\u0435\u0442\u0430 \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0445\u043e\u0434\u043e\u0432. \u0415\u0441\u043b\u0438 \u0445\u043e\u0434\u044b \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043e\u0442 \u043b\u0443\u0447\u0448\u0435\u0433\u043e \u043a \u0445\u0443\u0434\u0448\u0435\u043c\u0443, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043a\u043e\u0440\u043d\u044f \u043e\u0442 \u043e\u0431\u0449\u0435\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439, \u0430 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u043e. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0435\u0441\u043b\u0438 \u0445\u043e\u0434\u044b \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043e\u0442 \u0445\u0443\u0434\u0448\u0435\u0433\u043e \u043a \u043b\u0443\u0447\u0448\u0435\u043c\u0443, \u0442\u043e \u043c\u044b \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0444\u0438\u0442\u0430 \u043e\u0442 \u0430\u043b\u044c\u0444\u0430-\u0431\u0435\u0442\u0430 \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0417\u043d\u0430\u044f \u044d\u0442\u043e, \u043d\u0430\u0434\u043e \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0442\u044c\u0441\u044f \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u043e\u0434\u044b \u043e\u0442 \u043b\u0443\u0447\u0448\u0435\u0433\u043e \u043a \u0445\u0443\u0434\u0448\u0435\u043c\u0443. \u042d\u0442\u043e, \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u0440\u044f\u0434-\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u043d\u043e \u043f\u0440\u0438\u043b\u0438\u0447\u043d\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c.<\/p>\n<p>\u0414\u043b\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0445\u043e\u0434\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u043c \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0446\u0435\u043d\u043d\u0430\u044f \u0436\u0435\u0440\u0442\u0432\u0430 &#8212; \u043d\u0430\u0438\u043c\u0435\u043d\u0435\u0435 \u0446\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439. \u0418\u0434\u0435\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u044a\u0435\u0441\u0442\u044c \u043f\u0435\u0448\u043a\u043e\u0439 \u0444\u0435\u0440\u0437\u044f, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0432\u044b\u0433\u043e\u0434\u043d\u0435\u0435, \u0447\u0435\u043c \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442. \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443, \u0432\u0441\u0435 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432\u043f\u0435\u0440\u0435\u0434 \u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430, \u0430 \u0442\u0438\u0445\u0438\u0435 \u0445\u043e\u0434\u044b \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0446\u0435.<\/p>\n<p>\u041d\u043e \u043a\u0430\u043a \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0438\u0445\u0438\u0435 \u0445\u043e\u0434\u044b? \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0434\u0438\u043d \u0441\u043f\u043e\u0441\u043e\u0431. \u041e\u043d \u043d\u0435 \u0442\u0430\u043a\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u0430\u043a \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0437\u044f\u0442\u0438\u0439, \u043d\u043e \u0442\u043e\u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u0441\u0435\u0447\u044c \u0447\u0430\u0441\u0442\u044c \u0445\u043e\u0434\u043e\u0432. \u0418\u0434\u0435\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u0432\u0438\u0433\u0430\u0442\u044c \u0444\u0438\u0433\u0443\u0440\u0443 \u043f\u043e\u0434 \u043f\u0435\u0448\u043a\u0443 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u043b\u043e\u0445\u0430\u044f \u0438\u0434\u0435\u044f.<\/p>\n<p>\u0417\u043d\u0430\u044f \u0432\u0441\u0435 \u044d\u0442\u043e, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u043c. \u041e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0437\u0430 \u043a\u0432\u0430\u0434\u0440\u0430\u0442, \u043d\u043e \u0445\u043e\u0434\u043e\u0432 \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0434\u0430\u0436\u0435 \u0441 \u043f\u043b\u043e\u0445\u043e\u0439 \u0430\u0441\u0438\u043c\u043f\u0442\u043e\u0442\u0438\u043a\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e:<\/p>\n<pre><code class=\"cpp\">#include \"MoveSorter.hpp\"   MoveList MoveSorter::sort(Pieces pieces, MoveList moves) {     for (uint8_t i = 0; i &lt; moves.size() - 1; i = i + 1) {         for (uint8_t j = 0; j &lt; moves.size() - i - 1; j = j + 1) {             if (MoveSorter::_evaluate_move(pieces, moves[j]) &lt; MoveSorter::_evaluate_move(pieces, moves[j + 1])) std::swap(moves[j], moves[j + 1]);         }     }      return moves; } int32_t MoveSorter::_evaluate_move(Pieces pieces, Move move) {     int32_t evaluation = 0;      if (move._attacker_type != Pieces::Pawn) {         Bitboard opponent_pawn_attacks = PsLegalMoveMaskGen::generate_pawn_left_captures_mask(pieces, Pieces::inverse(move._attacker_side), true) | PsLegalMoveMaskGen::generate_pawn_right_captures_mask(pieces, Pieces::inverse(move._attacker_side), true);         if (BitboardOperations::get_bit(opponent_pawn_attacks, move._to)) {             switch (move._attacker_type) {                 case Pieces::Knight: evaluation = evaluation - StaticEvaluator::Material::Knight; break;                 case Pieces::Bishop: evaluation = evaluation - StaticEvaluator::Material::Bishop; break;                 case Pieces::Rook: evaluation = evaluation - StaticEvaluator::Material::Rook; break;                 case Pieces::Queen: evaluation = evaluation - StaticEvaluator::Material::Queen; break;                 \/\/ \u041a\u043e\u0440\u043e\u043b\u044c \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430 \u043f\u043e\u043b\u0435, \u0431\u0438\u0442\u043e\u0435 \u043f\u0435\u0448\u043a\u043e\u0439 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u0430.             }         }     }      if (move._defender_type != 255) {         switch (move._defender_type) {             case Pieces::Pawn: evaluation = evaluation + 1000 * StaticEvaluator::Material::Pawn; break;             case Pieces::Knight: evaluation = evaluation + 1000 * StaticEvaluator::Material::Knight; break;             case Pieces::Bishop: evaluation = evaluation + 1000 * StaticEvaluator::Material::Bishop; break;             case Pieces::Rook: evaluation = evaluation + 1000 * StaticEvaluator::Material::Rook; break;             case Pieces::Queen: evaluation = evaluation + 1000 * StaticEvaluator::Material::Queen; break;             \/\/ \u041a\u043e\u0440\u043e\u043b\u044f \u043d\u0435\u043b\u044c\u0437\u044f \u0441\u044a\u0435\u0441\u0442\u044c.         }         switch (move._attacker_type) {             case Pieces::Pawn: evaluation = evaluation - StaticEvaluator::Material::Pawn; break;             case Pieces::Knight: evaluation = evaluation - StaticEvaluator::Material::Knight; break;             case Pieces::Bishop: evaluation = evaluation - StaticEvaluator::Material::Bishop; break;             case Pieces::Rook: evaluation = evaluation - StaticEvaluator::Material::Rook; break;             case Pieces::Queen: evaluation = evaluation - StaticEvaluator::Material::Queen; break;             \/\/ \u0415\u0441\u043b\u0438 \u0441\u044a\u0435\u0434\u0430\u0435\u0442 \u043a\u043e\u0440\u043e\u043b\u044c, \u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0432\u044b\u0447\u0438\u0442\u0430\u0435\u043c, \u0432\u0435\u0434\u044c \u043a\u043e\u0440\u043e\u043b\u044f \u043d\u0435\u043b\u044c\u0437\u044f \u0441\u044a\u0435\u0441\u0442\u044c, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u043d\u043e\u0433\u043e \u0432\u0437\u044f\u0442\u0438\u044f, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u043d\u0435 \u0431\u0443\u0434\u0435\u0442.         }     }      return evaluation; }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u0430\u043b\u044c\u0444\u0430-\u0431\u0435\u0442\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u043e\u0434\u044b, \u0447\u0442\u043e \u0434\u0430\u0441\u0442 \u043f\u0440\u0438\u0431\u0430\u0432\u043a\u0443 \u043a \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438.<\/p>\n<h2>\u0425\u0435\u0448 \u0442\u0430\u0431\u043b\u0438\u0446\u0430<\/h2>\n<p>\u041f\u043e\u043c\u043d\u0438\u0442\u0435 \u043d\u0430\u0447\u0430\u043b\u043e \u0441\u0442\u0430\u0442\u044c\u0438? \u0422\u0430\u043c \u0431\u044b\u043b \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440 \u043f\u0440\u043e Zobrist \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0422\u043e\u0433\u0434\u0430 \u044f \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u043b, \u0447\u0442\u043e \u043e\u043d\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u0440\u043e\u0435\u043a\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0438 \u0435\u0449\u0435 \u043a\u043e\u0435-\u0447\u0435\u0433\u043e. \u0422\u0430\u043a \u0432\u043e\u0442: \u044d\u0442\u043e \u043a\u043e\u0435-\u0447\u0435\u0433\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0445\u0435\u0448 \u0442\u0430\u0431\u043b\u0438\u0446\u0430.<\/p>\n<p>\u0418\u0434\u0435\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u0435\u0440\u0435\u0432\u043e \u0438\u0433\u0440\u044b &#8212; \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0434\u0435\u0440\u0435\u0432\u043e, \u0430, \u0441\u043a\u043e\u0440\u0435\u0435, \u0433\u0440\u0430\u0444. \u041c\u043d\u043e\u0433\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0442\u0441\u044f \u0438 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0445 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u043e-\u043d\u043e\u0432\u043e\u043c\u0443 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0435 \u0440\u0430\u0437\u0443\u043c\u043d\u043e. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0438\u0441\u043a\u043e\u0432.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0437\u0430\u043f\u0438\u0441\u0438:<\/p>\n<pre><code class=\"cpp\">#include \"..\/Base\/PositionRepresentation\/ZobristHash.hpp\"   #pragma once   struct Entry {     Entry();     Entry(ZobristHash hash, int32_t depth, uint8_t best_move_index);      friend bool operator &lt;(Entry left, Entry right);      ZobristHash _hash;     int32_t _depth;     uint8_t _best_move_index; };<\/code><\/pre>\n<p>\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u043b\u0438 \u0445\u0435\u0448:<\/p>\n<pre><code class=\"cpp\">bool operator &lt;(Entry left, Entry right) {     return (left._hash &lt; right._hash); }<\/code><\/pre>\n<p>\u042d\u0442\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0430\u043c \u0445\u0435\u0448 (\u0434\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0441 \u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439 \u0438\u0437 \u0437\u0430\u043f\u0438\u0441\u0438), \u0433\u043b\u0443\u0431\u0438\u043d\u0443 \u043f\u043e\u0438\u0441\u043a\u0430 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 (\u0447\u0442\u043e\u0431\u044b \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b) \u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0443\u0447\u0448\u0435\u0433\u043e \u0445\u043e\u0434\u0430. <\/p>\n<p>\u041f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0442\u0430\u043a\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438, \u0430 \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u043f\u043e\u0438\u0441\u043a\u0430 \u0438\u0441\u043a\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0441 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u043c \u0445\u0435\u0448\u043e\u043c \u0438 \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0445\u043e\u0434 \u043f\u043e \u043b\u0443\u0447\u0448\u0435\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0432 \u043d\u0430\u0434\u0435\u0436\u0434\u0435, \u0447\u0442\u043e \u043e\u043d \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u043e\u0442\u0441\u0435\u0447\u043a\u0443 \u0434\u0435\u0440\u0435\u0432\u0430.<\/p>\n<p>\u041d\u043e \u0432 \u043a\u0430\u043a\u043e\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u044d\u0442\u0438 \u0437\u0430\u043f\u0438\u0441\u0438? \u042f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0432 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435, \u0442\u043e \u0435\u0441\u0442\u044c \u0432 std::set. \u041c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e &#8212; \u0441\u043f\u0438\u0441\u043e\u043a, \u043d\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u0432\u0435\u0434\u044c \u043f\u0440\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0435 \u043e\u043d \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u043c \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u043b\u0430\u0441\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0442\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0442\u043e\u0436\u0435 \u0437\u0430 \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u043e\u043c\u0443 \u0436\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u043c\u0443 \u043f\u043e\u0438\u0441\u043a\u0443.<\/p>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0445\u0435\u0448 \u0442\u0430\u0431\u043b\u0438\u0446\u044b:<\/p>\n<pre><code class=\"cpp\">#include &lt;set> #include \"Entry.hpp\"   #pragma one   class TranspositionTable { public:     TranspositionTable();      void add_entry(Entry entry);     uint8_t try_to_find_best_move_index(ZobristHash hash); private:     std::set&lt;Entry> _set; };<\/code><\/pre>\n<pre><code class=\"cpp\">#include \"TranspositionTable.hpp\"   TranspositionTable::TranspositionTable() = default; void TranspositionTable::add_entry(Entry entry) {     auto hash_copy = this->_set.find(entry);     if (hash_copy == this->_set.end() or hash_copy->_depth &lt; entry._depth) this->_set.insert(entry); } uint8_t TranspositionTable::try_to_find_best_move_index(ZobristHash hash) {     auto entry = this->_set.find({hash, 0, 0});      if (entry == this->_set.end()) return 255;     return entry->_best_move_index; }<\/code><\/pre>\n<h2>\u0418\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0443\u0433\u043b\u0443\u0431\u043b\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0426\u0435\u043b\u044c \u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0443\u0433\u043b\u0443\u0431\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u043b\u044c\u0444\u0430-\u0431\u0435\u0442\u0430 \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u044f. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a \u043f\u0440\u0435\u0440\u0432\u0430\u0442\u044c \u043f\u043e\u0438\u0441\u043a, \u0442\u0430\u043a \u043a\u0430\u043a \u0435\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0443\u0434\u0435\u0442 \u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u044b\u043c \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435.<\/p>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u043e\u0438\u0441\u043a \u043d\u0430 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 1, \u043f\u043e\u0442\u043e\u043c \u043d\u0430 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 2, \u043f\u043e\u0442\u043e\u043c \u043d\u0430 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 3 \u0438 \u0442.\u0434. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0438\u0441\u043a \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0440\u0432\u0430\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e. \u042d\u0442\u043e \u0437\u0432\u0443\u0447\u0438\u0442 \u043d\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435, \u043d\u043e \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0445\u0435\u0448 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0435\u0449\u0435 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0438\u0437-\u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0439.<\/p>\n<h2>\u0411\u0430\u0437\u0430 \u0434\u0435\u0431\u044e\u0442\u043e\u0432<\/h2>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u0432\u0441\u0435 \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0441\u0432\u0435\u0440\u0445\u0443 \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u043e, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043e\u0434\u043d\u043e\u0439 \u0434\u0435\u0442\u0430\u043b\u0438. \u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0438 \u0432\u0441\u0435 \u043f\u0430\u0440\u0442\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 1 \u0432 1. \u0418\u0433\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u0438\u0432 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u0430 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043a\u0443\u0447\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0442\u043e\u0438\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0431\u0430\u0437\u0443 \u0434\u0435\u0431\u044e\u0442\u043e\u0432 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0445\u043e\u0434\u044b.<\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0430\u0437\u044b \u0434\u0435\u0431\u044e\u0442\u043e\u0432 \u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0435 6 \u0445\u043e\u0434\u043e\u0432 (\u0438\u043b\u0438 12 \u043f\u043e\u043b\u0443\u0445\u043e\u0434\u043e\u0432) \u0438\u0437 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0441\u043a\u0430\u0447\u0435\u043d\u043d\u044b\u0445 \u0442\u044b\u0441\u044f\u0447 \u0438\u0433\u0440 \u0433\u0440\u043e\u0441\u0441\u043c\u0435\u0439\u0441\u0442\u0435\u0440\u043e\u0432. \u0412\u043e\u0442 \u043f\u0435\u0440\u0432\u044b\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a \u0438\u0437 \u0431\u0430\u0437\u044b:<\/p>\n<pre><code>e2e4 e7e5 g1f3 b8c6 f1c4 f8c5 c2c3 g8f6 d2d3 d7d6 b2b4 c5b6  d2d4 g8f6 c2c4 g7g6 f2f3 d7d5 c4d5 f6d5 e2e4 d5b6 b1c3 f8g7  c2c4 e7e6 b1c3 d7d5 d2d4 g8f6 c4d5 e6d5 c1g5 c7c6 d1c2 f8e7  e2e4 e7e6 d2d4 d7d5 b1d2 c7c5 g1f3 c5d4 f3d4 g8f6 e4d5 d8d5  e2e4 e7e5 g1f3 b8c6 f1b5 g8f6 d2d3 f8c5 b5c6 d7c6 b1d2 e8g8  c2c4 e7e5 b1c3 g8f6 g1f3 b8c6 g2g3 f8b4 c3d5 b4c5 f1g2 d7d6  d2d4 g8f6 c2c4 e7e6 g1f3 d7d5 b1c3 c7c5 c4d5 f6d5 e2e4 d5c3  d2d4 g8f6 c2c4 g7g6 f2f3 d7d6 e2e4 f8g7 g1e2 e8g8 c1e3 c7c5  e2e4 e7e5 g1f3 b8c6 f1b5 a7a6 b5a4 g8f6 e1g1 f8e7 d2d3 d7d6  d2d4 g8f6 c2c4 e7e6 b1c3 f8b4 d1c2 e8g8 c1g5 c7c5 d4c5 d8a5  e2e4 g7g6 d2d4 f8g7 b1c3 d7d6 c1e3 a7a6 a2a4 g8f6 h2h3 e8g8  e2e4 e7e5 g1f3 b8c6 f1b5 g8f6 e1g1 f6e4 d2d4 e4d6 b5c6 d7c6  c2c4 c7c5 g2g3 b8c6 f1g2 g7g6 g1f3 f8g7 e1g1 d7d6 b1c3 f7f5  d2d4 d7d5 c2c4 c7c6 g1f3 g8f6 d1b3 d5c4 b3c4 c8g4 b1d2 e7e6 <\/code><\/pre>\n<p>\u041f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0430\u0437\u044b \u0445\u043e\u0434\u044b \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u0432\u0435\u043a\u0442\u043e\u0440, \u043f\u0440\u0438\u0447\u0435\u043c \u044d\u0442\u0438 \u0445\u043e\u0434\u044b \u0431\u0443\u0434\u0443\u0442 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0430\u0448\u0443 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0445\u043e\u0434\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \u043b\u0435\u0433\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c (\u0432\u0434\u0440\u0443\u0433 \u0432 \u0431\u0430\u0437\u0435 \u043e\u0448\u0438\u0431\u043a\u0430). \u041f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043e\u0442\u0432\u0435\u0442. \u0412\u043e\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"cpp\">#include &lt;fstream> #include &lt;sstream> #include &lt;tuple> #include \"..\/Base\/MoveGeneration\/LegalMoveGen.hpp\"   #pragma once   class OpeningBook { public:     OpeningBook();     OpeningBook(const std::string&amp; path);      std::tuple&lt;Move, int32_t> try_to_find_move(const Position&amp; position); private:     std::vector&lt;std::vector&lt;Move>> _moves; };<\/code><\/pre>\n<pre><code class=\"cpp\">#include \"OpeningBook.hpp\"   OpeningBook::OpeningBook() = default; OpeningBook::OpeningBook(const std::string&amp; path) {     std::ifstream file(path);     if (!file.is_open()) {         std::cout &lt;&lt; ANSI::Red &lt;&lt; \"Could not find the opening book.\" &lt;&lt; ANSI::End &lt;&lt; std::endl;         std::exit(255);     }      std::string game;     std::stringstream game_thread;      std::string string_move;     uint8_t from;     uint8_t to;      MoveList possible_moves;     bool move_found;      Position buff;      while (std::getline(file, game)) {         game_thread = std::stringstream(game);         this->_moves.resize(this->_moves.size() + 1);          buff = {\"rnbqkbnr\/pppppppp\/8\/8\/8\/8\/PPPPPPPP\/RNBQKBNR\", 255, true, true, true, true, 1};          while (game_thread >> string_move and game_thread.good()) {             from = (string_move[1] - '1') * 8 + string_move[0] - 'a';             to = (string_move[3] - '1') * 8 + string_move[2] - 'a';              possible_moves = LegalMoveGen::generate(buff, buff._move_ctr - std::floor(buff._move_ctr) > 1e-7);             move_found = false;             for (uint8_t i = 0; i &lt; possible_moves.size(); i = i + 1) {                 if (possible_moves[i]._from == from and possible_moves[i]._to == to) {                     this->_moves.back().push_back(possible_moves[i]);                     buff.move(possible_moves[i]);                     move_found = true;                     break;                 }             }             if (!move_found) {                 std::cout &lt;&lt; ANSI::Red &lt;&lt; \"Error in the opening book.\" &lt;&lt; ANSI::End &lt;&lt; std::endl;                 std::exit(255);             }         }     }      file.close(); } std::tuple&lt;Move, int32_t> OpeningBook::try_to_find_move(const Position&amp; position) {     Position buff;      std::vector&lt;Move> possible_moves;     bool move_exist;      for (int32_t game = 0; game &lt; this->_moves.size(); game = game + 1) {         buff = {\"rnbqkbnr\/pppppppp\/8\/8\/8\/8\/PPPPPPPP\/RNBQKBNR\", 255, true, true, true, true, 1};          if (buff._pieces == position._pieces) {             move_exist = false;             for (auto added_move : possible_moves) {                 if (added_move == this->_moves[game][0]) {                     move_exist = true;                     break;                 }             }              if (!move_exist) possible_moves.push_back(this->_moves[game][0]);             continue;         }          for (int32_t move = 0; move &lt; this->_moves[game].size() - 1; move = move + 1) {             buff.move(this->_moves[game][move]);              if (buff._pieces == position._pieces) {                 move_exist = false;                 for (auto added_move : possible_moves) {                     if (added_move == this->_moves[game][move + 1]) {                         move_exist = true;                         break;                     }                 }                  if (!move_exist) possible_moves.push_back(this->_moves[game][move + 1]);             }         }     }      if (possible_moves.empty()) {         return std::make_tuple(Move(), 0);     }      return std::make_tuple(possible_moves[time(nullptr) % possible_moves.size()], possible_moves.size()); }<\/code><\/pre>\n<h2>\u0418\u0418. \u0424\u0438\u043d\u0430\u043b<\/h2>\n<p>\u041d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441. \u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0435 \u0432\u0438\u0436\u0443 \u0441\u043c\u044b\u0441\u043b\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u0435 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043e \u0447\u0435\u043c \u044f \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f. \u0412\u043e\u0442 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"cpp\">#include &lt;chrono> #include &lt;future> #include &lt;unistd.h> #include &lt;iomanip> #include \"..\/Base\/MoveGeneration\/LegalMoveGen.hpp\" #include \"MoveSorter.hpp\" #include \"TranspositionTable.hpp\" #include \"OpeningBook.hpp\"   #pragma once   class AI { public:     AI();     AI(const std::string&amp; opening_book_path);      Move best_move(const Position&amp; position, uint8_t side, int32_t min_ms, int32_t max_ms); private:     OpeningBook _opening_book;      static std::tuple&lt;int32_t, Move> _best_move(const Position&amp; position, uint8_t side, int32_t depth, TranspositionTable &amp;tt);      static std::tuple&lt;int32_t, Move> _alpha_beta_min(Position position, int32_t alpha, int32_t beta, int32_t depth_left, int32_t depth_current, TranspositionTable &amp;tt);     static std::tuple&lt;int32_t, Move> _alpha_beta_max(Position position, int32_t alpha, int32_t beta, int32_t depth_left, int32_t depth_current, TranspositionTable &amp;tt);      static int32_t _alpha_beta_min_only_captures(const Position&amp; position, int32_t alpha, int32_t beta, int32_t depth_current);     static int32_t _alpha_beta_max_only_captures(const Position&amp; position, int32_t alpha, int32_t beta, int32_t depth_current);      struct Infinity {         static constexpr int32_t Negative = -1e+9;         static constexpr int32_t Positive = 1e+9;     }; };<\/code><\/pre>\n<pre><code class=\"cpp\">#include \"AI.hpp\"   #define nsecs std::chrono::high_resolution_clock::now().time_since_epoch().count()   static std::atomic&lt;bool> stop_search;   static int64_t evaluated; static int32_t maximal_depth; static int32_t tt_cutoffs;   AI::AI() = default; AI::AI(const std::string&amp; opening_book_path) {     this->_opening_book = {opening_book_path}; } Move AI::best_move(const Position&amp; position, uint8_t side, int32_t min_ms, int32_t max_ms) {     std::cout &lt;&lt; std::endl;     StaticEvaluator::evaluate(position._pieces, position._w_l_castling, position._w_s_castling, position._b_l_castling, position._b_s_castling, position._white_castling_happened, position._black_castling_happened, true);      int64_t time_start = nsecs;     stop_search = false;     TranspositionTable tt;      std::tuple&lt;Move, int32_t> opening_book_result = this->_opening_book.try_to_find_move(position);     std::cout &lt;&lt; ANSI::Green &lt;&lt; \"Number of available moves in the opening book: \" &lt;&lt; std::get&lt;1>(opening_book_result) &lt;&lt; \".\" &lt;&lt; ANSI::End &lt;&lt; std::endl;     if (std::get&lt;1>(opening_book_result)) {         usleep(std::max((int64_t)0, (min_ms - (nsecs - time_start) \/ (int64_t)1e+6) * (int64_t)1e+3));         return std::get&lt;0>(opening_book_result);     }      std::cout &lt;&lt; ANSI::Green &lt;&lt; \"Search started.\" &lt;&lt; std::endl;      int32_t best_move_evaluation;     Move best_move;     std::future&lt;std::tuple&lt;int32_t, Move>> best_move_thread;      bool update_best_move;      for (int32_t i = 1; i &lt; 1e+3; i = i + 1) {         evaluated = 0;         maximal_depth = 0;         tt_cutoffs = 0;          best_move_thread = std::async(AI::_best_move, position, side, i, std::ref(tt));          update_best_move = true;         while (best_move_thread.wait_for(std::chrono::seconds(0)) != std::future_status::ready) {             if ((nsecs - time_start) \/ (int32_t)1e+6 >= max_ms) {                 update_best_move = false;                 break;             }             usleep(20000);         }          if (update_best_move or i == 1) std::tie(best_move_evaluation, best_move) = best_move_thread.get();         else {             stop_search = true;             break;         }          std::cout &lt;&lt; \"Base depth: \" &lt;&lt; std::setw(4) &lt;&lt; i &lt;&lt; \". Maximal depth: \" &lt;&lt; std::setw(4) &lt;&lt; maximal_depth &lt;&lt; \". Evaluation: \" &lt;&lt; std::setw(6) &lt;&lt; (float)best_move_evaluation \/ 100.0f &lt;&lt; \" pawns. Evaluated (this iteration): \" &lt;&lt; std::setw(10) &lt;&lt; evaluated &lt;&lt; \". TT cutoffs (this iteration): \" &lt;&lt; std::setw(10) &lt;&lt; tt_cutoffs &lt;&lt; \". Time (full search): \" &lt;&lt; std::setw(10) &lt;&lt; (nsecs - time_start) \/ (int32_t)1e+6 &lt;&lt; \" ms.\" &lt;&lt; std::endl;          if (best_move_evaluation > AI::Infinity::Positive - 2000 or best_move_evaluation &lt; AI::Infinity::Negative + 2000) break;     }      usleep(std::max((int64_t)0, (min_ms - (nsecs - time_start) \/ (int64_t)1e+6) * (int64_t)1e+3));      std::cout &lt;&lt; \"Search finished.\" &lt;&lt; std::endl &lt;&lt; ANSI::End;      return best_move; } std::tuple&lt;int32_t, Move> AI::_best_move(const Position&amp; position, uint8_t side, int32_t depth, TranspositionTable &amp;tt) {     if (side == Pieces::White) return AI::_alpha_beta_max(position, AI::Infinity::Negative, AI::Infinity::Positive, depth, 0, tt);     return AI::_alpha_beta_min(position, AI::Infinity::Negative, AI::Infinity::Positive, depth, 0, tt); } std::tuple&lt;int32_t, Move> AI::_alpha_beta_min(Position position, int32_t alpha, int32_t beta, int32_t depth_left, int32_t depth_current, TranspositionTable &amp;tt) {     if (stop_search) return std::make_tuple(0, Move());     if (depth_current > maximal_depth) maximal_depth = depth_current;      if (depth_left == 0) return std::make_tuple(AI::_alpha_beta_min_only_captures(position, alpha, beta, depth_current), Move());      if (position._fifty_moves_ctr >= 50 or position._repetition_history.get_repetition_number(position._hash) >= 3) return std::make_tuple(0, Move());      MoveList moves = LegalMoveGen::generate(position, Pieces::Black);     moves = MoveSorter::sort(position._pieces, moves);     Move move;     Move best_move;     uint8_t best_move_index;      bool in_check = PsLegalMoveMaskGen::in_danger(position._pieces, BitboardOperations::bsf(position._pieces._piece_bitboards[Pieces::Black][Pieces::King]), Pieces::Black);      if (moves.size() == 0) {         if (in_check) return std::make_tuple(AI::Infinity::Positive - depth_current, Move());         return std::make_tuple(0, Move());     }      int32_t evaluation;      Position copy;      uint8_t tt_result = tt.try_to_find_best_move_index(position._hash);      for (uint8_t i = 0; i &lt; moves.size(); i = i + 1) {         if (tt_result >= moves.size()) move = moves[i];         else {             if (i == 0) move = moves[tt_result];             else {                 if (i == tt_result) move = moves[0];                 else move = moves[i];             }         }          copy = position;         copy.move(move);         evaluation = std::get&lt;0>(AI::_alpha_beta_max(copy, alpha, beta, depth_left - !in_check, depth_current + 1, tt));          if (evaluation &lt;= alpha) {             if (tt_result >= moves.size() or i != 0) tt.add_entry({position._hash, depth_left, best_move_index});             else tt_cutoffs = tt_cutoffs + 1;             return std::make_tuple(alpha, best_move);         }         if (evaluation &lt; beta) {             best_move = move;             best_move_index = i;             beta = evaluation;         }     }      tt.add_entry({position._hash, depth_left, best_move_index});     return std::make_tuple(beta, best_move); } std::tuple&lt;int32_t, Move> AI::_alpha_beta_max(Position position, int32_t alpha, int32_t beta, int32_t depth_left, int32_t depth_current, TranspositionTable &amp;tt) {     if (stop_search) return std::make_tuple(0, Move());     if (depth_current > maximal_depth) maximal_depth = depth_current;      if (depth_left == 0) return std::make_tuple(AI::_alpha_beta_max_only_captures(position, alpha, beta, depth_current), Move());      if (position._fifty_moves_ctr >= 50 or position._repetition_history.get_repetition_number(position._hash) >= 3) return std::make_tuple(0, Move());      MoveList moves = LegalMoveGen::generate(position, Pieces::White);     moves = MoveSorter::sort(position._pieces, moves);     Move move;     Move best_move;     uint8_t best_move_index;      bool in_check = PsLegalMoveMaskGen::in_danger(position._pieces, BitboardOperations::bsf(position._pieces._piece_bitboards[Pieces::White][Pieces::King]), Pieces::White);      if (moves.size() == 0) {         if (in_check) return std::make_tuple(AI::Infinity::Negative + depth_current, Move());         return std::make_tuple(0, Move());     }      int32_t evaluation;      Position copy;      uint8_t tt_result = tt.try_to_find_best_move_index(position._hash);      for (uint8_t i = 0; i &lt; moves.size(); i = i + 1) {         if (tt_result >= moves.size()) move = moves[i];         else {             if (i == 0) move = moves[tt_result];             else {                 if (i == tt_result) move = moves[0];                 else move = moves[i];             }         }          copy = position;         copy.move(move);         evaluation = std::get&lt;0>(AI::_alpha_beta_min(copy, alpha, beta, depth_left - !in_check, depth_current + 1, tt));          if (evaluation >= beta) {             if (tt_result >= moves.size() or i != 0) tt.add_entry({position._hash, depth_left, best_move_index});             else tt_cutoffs = tt_cutoffs + 1;             return std::make_tuple(beta, best_move);         }         if (evaluation > alpha) {             best_move = move;             best_move_index = i;             alpha = evaluation;         }     }      tt.add_entry({position._hash, depth_left, best_move_index});     return std::make_tuple(alpha, best_move); } int32_t AI::_alpha_beta_min_only_captures(const Position&amp; position, int32_t alpha, int32_t beta, int32_t depth_current) {     if (stop_search) return 0;     if (depth_current > maximal_depth) maximal_depth = depth_current;      int32_t evaluation = StaticEvaluator::evaluate(position._pieces, position._w_l_castling, position._w_s_castling, position._b_l_castling, position._b_s_castling, position._white_castling_happened, position._black_castling_happened);     evaluated = evaluated + 1;      if (evaluation &lt;= alpha) return alpha;     if (evaluation &lt; beta) beta = evaluation;      MoveList moves = LegalMoveGen::generate(position, Pieces::Black, true);     moves = MoveSorter::sort(position._pieces, moves);     Move move;      Position copy;      for (uint8_t i = 0; i &lt; moves.size(); i = i + 1) {         move = moves[i];          copy = position;         copy.move(move);         evaluation = AI::_alpha_beta_max_only_captures(copy, alpha, beta, depth_current + 1);          if (evaluation &lt;= alpha) return alpha;         if (evaluation &lt; beta) beta = evaluation;     }      return beta; } int32_t AI::_alpha_beta_max_only_captures(const Position&amp; position, int32_t alpha, int32_t beta, int32_t depth_current) {     if (stop_search) return 0;     if (depth_current > maximal_depth) maximal_depth = depth_current;      int32_t evaluation = StaticEvaluator::evaluate(position._pieces, position._w_l_castling, position._w_s_castling, position._b_l_castling, position._b_s_castling, position._white_castling_happened, position._black_castling_happened);     evaluated = evaluated + 1;      if (evaluation >= beta) return beta;     if (evaluation > alpha) alpha = evaluation;      MoveList moves = LegalMoveGen::generate(position, Pieces::White, true);     moves = MoveSorter::sort(position._pieces, moves);     Move move;      Position copy;      for (uint8_t i = 0; i &lt; moves.size(); i = i + 1) {         move = moves[i];          copy = position;         copy.move(move);         evaluation = AI::_alpha_beta_min_only_captures(copy, alpha, beta, depth_current + 1);          if (evaluation >= beta) return beta;         if (evaluation > alpha) alpha = evaluation;     }      return alpha; }<\/code><\/pre>\n<h2>\u0418\u0442\u043e\u0433<\/h2>\n<p>\u042f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043d\u0430 SDL2 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430. \u0414\u043b\u044f \u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 deb \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043e\u0432 Linux \u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b deb \u043f\u0430\u043a\u0435\u0442. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, SDL2 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0439, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u043e\u0434 Windows \u0438\u043b\u0438 MacOS \u0431\u044b\u0442\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e.<\/p>\n<p>\u0418\u0433\u0440\u0430\u0435\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u043e, \u043c\u0435\u043d\u044f \u0441 \u0442\u0440\u0435\u0441\u043a\u043e\u043c \u043e\u0431\u044b\u0433\u0440\u044b\u0432\u0430\u0435\u0442. \u041d\u0430 \u043e\u0434\u043d\u043e\u043c \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u043c \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u043e\u043c \u0441\u0430\u0439\u0442\u0435 (\u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430: \u043e\u043d \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d \u0432 \u0420\u0424) \u044f \u043d\u0430\u0448\u0435\u043b \u0431\u043e\u0442\u043e\u0432 \u0438 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0438\u0445 \u0438\u0433\u0440\u044b \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u043d\u044b\u0439 \u0432 \u042d\u043b\u043e. \u0421\u044b\u0433\u0440\u0430\u0432 \u0441 \u043d\u0438\u043c\u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0441\u0432\u043e\u0435\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430, \u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u043b \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u042d\u043b\u043e \u044d\u0442\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043e\u043a\u043e\u043b\u043e 2000, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u044d\u0442\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b.<\/p>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0447\u0442\u0435\u043d\u0438\u0435. \u041a\u043e\u0434 \u0438 deb \u043f\u0430\u043a\u0435\u0442 \u0435\u0441\u0442\u044c <a href=\"https:\/\/github.com\/gth-other\/Natrix\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/682122\/\"> https:\/\/habr.com\/ru\/post\/682122\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041d\u0435 \u0442\u0430\u043a \u0434\u0430\u0432\u043d\u043e \u044f \u0437\u0430\u0445\u043e\u0442\u0435\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a. \u041d\u0430 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043d\u0430\u0448\u043b\u043e\u0441\u044c \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0445\u043e\u0440\u043e\u0448\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443. \u0411\u044b\u043b\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u0441 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043b\u0430\u0431\u044b\u043c\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438, \u043c\u043d\u043e\u0433\u0438\u0435 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0430\u0436\u0435 \u0443\u043c\u0443\u0434\u0440\u044f\u043b\u0438\u0441\u044c \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0430\u0436\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430. \u0410 \u0431\u044b\u043b\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u0441 \u0445\u043e\u0440\u043e\u0448\u0438\u043c\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438 (\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u043d\u0438\u0445 \u0431\u044b\u043b\u0438 \u0434\u0430\u0436\u0435 \u0447\u0443\u0442\u044c \u043b\u0443\u0447\u0448\u0435 \u0447\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0443 \u043c\u0435\u043d\u044f \u0432 \u0438\u0442\u043e\u0433\u0435), \u043d\u043e \u0442\u0430\u043c \u0430\u0432\u0442\u043e\u0440\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043b\u0438\u0448\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0438\u0434\u0435\u0438, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0441\u0432\u043e\u0435 \u043f\u043e \u0442\u0430\u043a\u0438\u043c \u0441\u0442\u0430\u0442\u044c\u044f\u043c \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e, \u0434\u0430\u0431\u044b \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u0436\u0438\u0437\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u043c\u0441\u044f \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0442\u0435\u043c\u0435. \u042f \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u044e \u043d\u0430 \u043b\u0443\u0447\u0448\u0443\u044e \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0438\u043b\u0438 \u043d\u0430 \u0447\u0438\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u043a\u043e\u0434, \u043d\u043e \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0431\u0443\u0434\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u0438\u043c \u0438 \u043b\u0435\u0433\u043a\u0438\u043c \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0445\u043e\u0447\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0441\u0432\u043e\u0435.<\/p>\n<h2>\u0411\u0438\u0442\u0431\u043e\u0440\u0434\u044b \u0438\u043b\u0438 \u0431\u0438\u0442\u043e\u0432\u044b\u0435 \u0434\u043e\u0441\u043a\u0438<\/h2>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u043a\u0438, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0430\u044f \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u0430\u043c\u0438 \u0438\u043b\u0438 \u0431\u0438\u0442\u043e\u0432\u044b\u043c\u0438 \u0434\u043e\u0441\u043a\u0430\u043c\u0438, \u0435\u0441\u043b\u0438 \u043f\u043e-\u0440\u0443\u0441\u0441\u043a\u0438. \u0418\u0434\u0435\u044f \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u043e\u0432 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u043d\u0430 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0438: \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u0430\u044f \u0434\u043e\u0441\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 64 \u043a\u043b\u0435\u0442\u043a\u0438, \u043a\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u044b \u0443\u043c\u0435\u044e\u0442 \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 64 \u0431\u0438\u0442\u043e\u0432\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c 12 \u0442\u0430\u043a\u0438\u0445 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u043e\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0444\u0438\u0433\u0443\u0440. \u041a\u0430\u0436\u0434\u044b\u0439 \u0442\u0430\u043a\u043e\u0439 \u0431\u0438\u0442\u0431\u043e\u0440\u0434 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0444\u0438\u0433\u0443\u0440\u0443 (\u0438\u043b\u0438 \u043f\u0435\u0448\u043a\u0443), \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 &#8212; \u043e\u0434\u0438\u043d \u0431\u0438\u0442\u0431\u043e\u0440\u0434 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0447\u0435\u0440\u043d\u044b\u0445 \u043a\u043e\u043d\u0435\u0439, \u0434\u0440\u0443\u0433\u043e\u0439 &#8212; \u0437\u0430 \u0431\u0435\u043b\u044b\u0435 \u043f\u0435\u0448\u043a\u0438, \u0442\u0440\u0435\u0442\u0438\u0439 &#8212; \u0437\u0430 \u0447\u0435\u0440\u043d\u043e\u0433\u043e \u043a\u043e\u0440\u043e\u043b\u044f.<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432\u044b\u0431\u043e\u0440\u0430 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u043e\u0432, \u0430 \u043d\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0430 64 \u043a\u043b\u0435\u0442\u043a\u0438 &#8212; \u0432\u044b\u0441\u043e\u043a\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438, \u043a\u0430\u043a, \u044d\u0442\u043e \u043d\u0435 \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u0443\u0434\u043e\u0431\u043d\u043e\u0441\u0442\u044c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u043f\u0435\u0448\u043a\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u043d\u043e\u0439. \u041f\u0440\u043e\u0445\u043e\u0434\u043d\u0430\u044f \u043f\u0435\u0448\u043a\u0430, \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438, \u044d\u0442\u043e<\/p>\n<blockquote>\n<p><a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D0%B5%D1%88%D0%BA%D0%B0\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0448\u043a\u0430<\/a>, \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438 \u043f\u0435\u0440\u0435\u0434 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u0435\u0448\u043a\u0438 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u0430, \u0430 \u043d\u0430<br \/>\u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044f\u0445 \u0438\u043b\u0438 \u043d\u0435\u0442 \u043f\u0435\u0448\u0435\u043a \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u0430 \u0438\u043b\u0438 \u043e\u043d\u0438 \u043d\u0435 \u0434\u0435\u0440\u0436\u0430\u0442 \u043f\u043e\u0434 \u0431\u043e\u0435\u043c<br \/>\u043f\u043e\u043b\u044f, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0435\u0448\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u043e\u0439\u0442\u0438 \u0434\u043e \u043f\u043e\u043b\u044f <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D1%80%D0%B5%D0%B2%D1%80%D0%B0%D1%89%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B5%D1%88%D0%BA%D0%B8\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f<\/a>.<\/p>\n<\/blockquote>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 64 \u043a\u043b\u0435\u0442\u043e\u043a, \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u0432 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0446\u0435\u043b\u044b\u0445 18 \u043a\u043b\u0435\u0442\u043e\u043a \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0435\u0448\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u043d\u044b\u043c\u0438, \u0430 \u043a\u0430\u043a\u0438\u0435 \u043d\u0435\u0442. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u044b, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0430 \u043a\u0430\u043a\u0438\u0445 \u043a\u043b\u0435\u0442\u043a\u0430\u0445 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u0442\u043e\u044f\u0442\u044c \u043f\u0435\u0448\u043a\u0438 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0448\u043a\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u043b\u0430\u0441\u044c \u043f\u0440\u043e\u0445\u043e\u0434\u043d\u043e\u0439, \u0430 \u0437\u0430\u0442\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0447\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u043f\u0435\u0448\u043a\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u043d\u043e\u0439 \u0437\u0430 \u043e\u0434\u043d\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043f\u043e\u0431\u0438\u0442\u043e\u0432\u043e\u0433\u043e &#171;\u0438&#187;.<\/p>\n<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430\u0448\u0438\u0445 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u043e\u0432. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438\u0445 \u043d\u0435 \u043d\u0430\u0434\u043e, \u0432\u0435\u0434\u044c \u0431\u0438\u0442\u0431\u043e\u0440\u0434 &#8212; \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f 64 \u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430. \u0422\u0430\u043a \u0447\u0442\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">typedef uint64_t Bitboard;<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0449\u0430\u044e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0431\u0435\u0437\u0437\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u0438\u0442\u043e\u0432\u044b\u0435 \u0441\u0434\u0432\u0438\u0433\u0438, \u0430 \u0431\u0438\u0442\u043e\u0432\u044b\u0435 \u0441\u0434\u0432\u0438\u0433\u0438 \u0441\u043e \u0437\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0435 \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 (\u0432\u0435\u0434\u044c 1 \u0431\u0438\u0442 \u0438\u0437 64 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0437\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0437\u043d\u0430\u043a \u0447\u0438\u0441\u043b\u0430 \u0438 \u0435\u0433\u043e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u0442\u0440\u043e\u0433\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442).<\/p>\n<p>\u041d\u043e \u0441 \u043e\u0434\u043d\u0438\u043c \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0436\u0438\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0433\u0440\u0443\u0441\u0442\u043d\u043e, \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u0436\u0438\u0437\u043d\u044c.<\/p>\n<pre><code class=\"cpp\">static constexpr void set_1(Bitboard &amp;bb, uint8_t square) {         bb = bb | (1ull &lt;&lt; square); } static constexpr void set_0(Bitboard &amp;bb, uint8_t square) {      bb = bb &amp; (~(1ull &lt;&lt; square)); }   static constexpr bool get_bit(Bitboard bb, uint8_t square) {     return (bb &amp; (1ull &lt;&lt; square)); }<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0432\u0430\u043c\u0438 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u0430\u043c \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443. \u041d\u0443\u0436\u043d\u043e \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0438\u0445 \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0435, \u043d\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u0431\u0435\u0437 \u043d\u0438\u0445 \u043d\u0438\u043a\u0443\u0434\u0430.<\/p>\n<p>\u0415\u0449\u0435 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0445 \u0431\u0438\u0442\u043e\u0432. \u042d\u0442\u043e \u0437\u043d\u0430\u043d\u0438\u0435 \u043d\u0443\u0436\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u043e\u0446\u0435\u043d\u043a\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438. \u0427\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0445\u043e\u0440\u043e\u0448\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043d\u0430\u0434\u043e, \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c, \u0443\u0437\u043d\u0430\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0438\u0433\u0443\u0440 \u0443 \u0431\u0435\u043b\u044b\u0445 \u0438 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0438\u0433\u0443\u0440 \u0443 \u0447\u0435\u0440\u043d\u044b\u0445, \u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u0438\u0445 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c.<\/p>\n<p>\u041d\u043e \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c? \u0421\u0430\u043c\u043e\u0435 \u043d\u0430\u0438\u0432\u043d\u043e\u0435 \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c &#8212; \u043f\u0440\u043e\u0439\u0442\u0438 \u043f\u043e \u0432\u0441\u0435\u043c 64 \u0431\u0438\u0442\u0430\u043c \u0438 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u043d\u043e \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043d\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e. \u041d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u0435\u0441\u0442\u044c <a href=\"https:\/\/habr.com\/ru\/post\/276957\/\" rel=\"noopener noreferrer nofollow\">\u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430 \u0445\u0430\u0431\u0440\u0435<\/a>, \u043d\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 bit, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0433\u043e\u0442\u043e\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439:<\/p>\n<pre><code class=\"cpp\">static constexpr uint8_t count_1(Bitboard bb) {         return std::popcount(bb); }<\/code><\/pre>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u0435\u0449\u0435 \u0434\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438: \u043f\u043e\u0438\u0441\u043a \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u0433\u043e \u0431\u0438\u0442\u0430 \u0438 \u043f\u043e\u0438\u0441\u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e. \u0414\u043b\u044f \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438 \u0434\u0430\u0436\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u0445. \u041d\u043e \u044f \u0438\u043c\u0438 \u0440\u0435\u0448\u0438\u043b \u043d\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u043f\u043b\u043e\u0445\u043e \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u0438 (\u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u0432 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c. \u041e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c \u0435\u0433\u043e \u044f \u043d\u0435 \u0431\u0443\u0434\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0443\u0439\u0434\u0435\u0442 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438 \u043d\u0430 \u0432\u0435\u0441\u044c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u0432\u0438\u0436\u043e\u043a, \u0430 \u044d\u0442\u043e \u044f\u0432\u043d\u043e \u043d\u0435 \u0442\u043e \u0437\u0430\u0447\u0435\u043c \u0441\u044e\u0434\u0430 \u043f\u0440\u0438\u0448\u043b\u0438 \u043b\u044e\u0434\u0438, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u044d\u0442\u0443 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, <a href=\"https:\/\/www.chessprogramming.org\/BitScan\" rel=\"noopener noreferrer nofollow\">\u0432\u0437\u044f\u0442\u0443\u044e \u0441 chessprogrammingwiki<\/a>:<\/p>\n<pre><code class=\"cpp\">static constexpr std::array&lt;uint8_t, 64> BitScanTable = {             0, 47,  1, 56, 48, 27,  2, 60,             57, 49, 41, 37, 28, 16,  3, 61,             54, 58, 35, 52, 50, 42, 21, 44,             38, 32, 29, 23, 17, 11,  4, 62,             46, 55, 26, 59, 40, 36, 15, 53,             34, 51, 20, 43, 31, 22, 10, 45,             25, 39, 14, 33, 19, 30,  9, 24,             13, 18,  8, 12,  7,  6,  5, 63 };   static constexpr uint8_t bsf(Bitboard bb) {     return BitboardOperations::BitScanTable[((bb ^ (bb - 1)) * 0x03f79d71b4cb0a89) >> 58]; } static constexpr uint8_t bsr(Bitboard bb) {     bb = bb | (bb >> 1);     bb = bb | (bb >> 2);     bb = bb | (bb >> 4);     bb = bb | (bb >> 8);     bb = bb | (bb >> 16);     bb = bb | (bb >> 32);      return BitboardOperations::BitScanTable[(bb * 0x03f79d71b4cb0a89) >> 58]; }<\/code><\/pre>\n<p>\u0415\u0449\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u044b \u0441 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c\u0438 \u0438 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0435\u0449\u0435 \u044d\u0442\u043e\u0442 \u043a\u0443\u0441\u043e\u043a \u043a\u043e\u0434\u0430:<\/p>\n<pre><code class=\"cpp\">namespace BitboardRows {     static consteval std::array&lt;Bitboard, 8> calc_rows() {         std::array&lt;Bitboard, 8> rows{};          for (uint8_t y = 0; y &lt; 8; y = y + 1) {             for (uint8_t x = 0; x &lt; 8; x = x + 1) BitboardOperations::set_1(rows[y], y * 8 + x);         }          return rows;     }       static constexpr std::array&lt;Bitboard, 8> Rows = BitboardRows::calc_rows();       static consteval std::array&lt;Bitboard, 8> calc_inversion_rows() {         std::array&lt;Bitboard, 8> inversion_rows{};          for (uint8_t i = 0; i &lt; 8; i = i + 1) inversion_rows[i] = ~Rows[i];          return inversion_rows;     }       static constexpr std::array&lt;Bitboard, 8> InversionRows = BitboardRows::calc_inversion_rows(); }   namespace BitboardColumns {     static consteval std::array&lt;Bitboard, 8> calc_columns() {         std::array&lt;Bitboard, 8> columns{};          for (uint8_t x = 0; x &lt; 8; x = x + 1) {             for (uint8_t y = 0; y &lt; 8; y = y + 1) BitboardOperations::set_1(columns[x], y * 8 + x);         }          return columns;     }       static constexpr std::array&lt;Bitboard, 8> Columns = BitboardColumns::calc_columns();       static consteval std::array&lt;Bitboard, 8> calc_inversion_columns() {         std::array&lt;Bitboard, 8> inversion_columns{};          for (uint8_t i = 0; i &lt; 8; i = i + 1) inversion_columns[i] = ~Columns[i];          return inversion_columns;     }       static constexpr std::array&lt;Bitboard, 8> InversionColumns = BitboardColumns::calc_inversion_columns(); }<\/code><\/pre>\n<p>\u041e\u043d \u0441\u0443\u043f\u0435\u0440 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u0441\u0434\u0432\u0438\u0433\u043e\u0432, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.<\/p>\n<h2>\u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0444\u0438\u0433\u0443\u0440<\/h2>\n<p>\u0418\u0437 \u0447\u0435\u0433\u043e \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0432 \u0448\u0430\u0445\u043c\u0430\u0442\u0430\u0445? \u0418\u0437 \u043f\u0440\u0430\u0432 \u043d\u0430 \u0440\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443, \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043f\u0440\u0430\u0432\u0438\u043b \u043f\u0440\u043e \u0442\u0440\u043e\u0435\u043a\u0440\u0430\u0442\u043d\u043e\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438, \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 50 \u0445\u043e\u0434\u043e\u0432 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435, \u043d\u043e \u0431\u0430\u0437\u0430 &#8212; \u044d\u0442\u043e \u0444\u0438\u0433\u0443\u0440\u044b \u0438 \u043f\u0435\u0448\u043a\u0438. \u0421\u0435\u0439\u0447\u0430\u0441 \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0444\u0438\u0433\u0443\u0440\u044b \u0438 \u043f\u0435\u0448\u043a\u0438. \u041d\u043e \u043a\u0430\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0438\u043f\u044b \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430? \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, 12 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u043e\u0432 \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u044b\u043b \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435, \u043d\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u043b\u043e. \u0422\u0430\u043a \u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u044b \u0432\u0441\u0435\u0445 \u0431\u0435\u043b\u044b\u0445 \u0438 \u0432\u0441\u0435\u0445 \u0447\u0435\u0440\u043d\u044b\u0445 \u0444\u0438\u0433\u0443\u0440, \u0432\u0441\u0435\u0445 \u0444\u0438\u0433\u0443\u0440 \u0432\u043e\u043e\u0431\u0449\u0435, \u0438 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u044b, \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0435 \u044d\u0442\u0438\u043c \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u0430\u043c. \u0422\u0430\u043a\u0438\u0435 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 12 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u043e\u0432 \u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u043e\u0432. \u041d\u043e \u0437\u0430\u0447\u0435\u043c \u043e\u043d\u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0445\u043e\u0434\u043e\u0432. \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0445\u043e\u0434\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u043d\u044f, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043b\u0438 \u0432 \u043a\u043b\u0435\u0442\u043a\u0435 \u0444\u0438\u0433\u0443\u0440\u0430 \u0442\u043e\u0433\u043e \u0436\u0435 \u0446\u0432\u0435\u0442\u0430, \u0447\u0442\u043e \u0438 \u043a\u043e\u043d\u044c, \u0438 \u0435\u0441\u043b\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f &#8212; \u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u0445\u043e\u0434 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u0430 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u043e \u0432 \u043a\u043e\u0434\u0435. \u0412\u043e\u0442 \u0442\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442:<\/p>\n<pre><code class=\"cpp\">std::array&lt;std::array&lt;Bitboard, 6>, 2> _piece_bitboards{}; std::array&lt;Bitboard, 2> _side_bitboards{}; std::array&lt;Bitboard, 2> _inversion_side_bitboards{}; Bitboard _all; Bitboard _empty;<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u0446\u0438\u0438 \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b. \u0412\u043e\u0442 \u043e\u043d\u0438:<\/p>\n<pre><code class=\"cpp\">static constexpr uint8_t Pawn = 0; static constexpr uint8_t Knight = 1; static constexpr uint8_t Bishop = 2; static constexpr uint8_t Rook = 3; static constexpr uint8_t Queen = 4; static constexpr uint8_t King = 5;  static constexpr uint8_t White = 0; static constexpr uint8_t Black = 1;<\/code><\/pre>\n<p>\u0422\u0430\u043a \u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0443\u044e \u0431\u0435\u043b\u043e\u0435 \u0432 \u0447\u0435\u0440\u043d\u043e\u0435, \u0430 \u0447\u0435\u0440\u043d\u043e\u0435 \u0432 \u0431\u0435\u043b\u043e\u0435. \u0422\u0430\u043a \u043a\u0430\u043a \u0431\u0435\u043b\u043e\u0435 \u0438 \u0447\u0435\u0440\u043d\u043e\u0435 \u0443 \u043d\u0430\u0441 \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043e \u043a\u0430\u043a 0 \u0438 1, \u0442\u043e \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0446\u0432\u0435\u0442\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0442\u0440\u0438\u0446\u0430\u043d\u0438\u0435:<\/p>\n<pre><code class=\"cpp\">uint8_t Pieces::inverse(uint8_t side) {     return !side; }<\/code><\/pre>\n<p>\u0415\u0449\u0435 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b:<\/p>\n<pre><code class=\"cpp\">bool operator ==(Pieces left, Pieces right) {     for (uint8_t i = 0; i &lt; 2; i = i + 1) {         for (uint8_t j = 0; j &lt; 6; j = j + 1) {             if (left._piece_bitboards[i][j] != right._piece_bitboards[i][j]) return false;         }     }      return true; }<\/code><\/pre>\n<p>\u0423\u0436\u0435 \u0431\u044b\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u043f\u0440\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0444\u0438\u0433\u0443\u0440, \u043d\u043e \u0435\u0449\u0435 \u043d\u0435 \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u043a\u0430 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u043a\u0430\u043a \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u044b.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e \u0432\u0442\u043e\u0440\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u044b\u0445 \u0431\u0438\u0442\u0431\u043e\u0440\u0434\u0430\u0445, \u0442\u043e \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435:<\/p>\n<pre><code class=\"cpp\">void Pieces::update_bitboards() {     this->_side_bitboards[Pieces::White] = this->_piece_bitboards[Pieces::White][Pieces::Pawn] |                                            this->_piece_bitboards[Pieces::White][Pieces::Knight] |                                            this->_piece_bitboards[Pieces::White][Pieces::Bishop] |                                       <\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-336920","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/336920","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=336920"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/336920\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=336920"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=336920"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=336920"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}