Как выглядит королева в шахматах на компьютере

Обновлено: 06.07.2024

При изучении правил шахмат начинаем с шахматных фигур. Из этой статьи узнаем о всех фигурах: где они расположены в начале партии, как ходят, и какова их ценность.

Что такое шахматные фигуры?

Во время шахматной партии вы передвигаете фигуры по доске. В шахматах шесть различных фигур. В начале партии у каждого их противников по 16 фигур: восемь пешек, два слона, два коня, две ладьи, ферзь и король. Знакомимся с ними!

Пешка

В начале партии у каждого из противников по восемь пешек. Белые пешки занимают вторую горизонталь, а черные пешки - седьмую.

pawn starting position

Пешки в начальной позиции.

Пешка - самая слабая из фигур. Ее ценность принимается за один балл. Еще не ходившая пешка может пойти вперёд на одно или два поля. Уже ходившая пешка может передвигаться только на одно поле за ход. Пешка может брать только по диагонали на одно поле влево или вправо перед собой. На диаграмме пешка только что сделала ход с поля e2 на e4, и взяла под бой поля d5 и f5.

pawn captures attacks

Пешка e4 держит под боем поля d5 и f5.

У каждого из противников по два слона, один на белых полях, а другой - на черных. В начале партии белые слоны занимают поля c1 и f1, а черные - c8 и f8.

bishops starting position

Слоны в начальной позиции.

Слон считается легкой фигурой (как и конь) и стоит три балла. Слон может ходить на любое число полей по диагонали, если на пути не стоят собственные или вражеские фигуры. Легко запомнить, что, если отметить возможные ходы слона, расположенного в центре доски, получится буква "X". Слон может взять фигуру противника, заняв поле, где та находится.

bishop moves

С поля d4 слон может пойти на много полей по диагонали. Если отметить возможные ходы, у нас получится буква "X".

В начале партии у каждого из противников по два коня: один на королевском и другой на ферзевом фланге. Белые кони занимают поля b1 и g1, а черные кони - на b8 и g8.

knights starting position

Кони в начальной позиции.

Конь считается легкой фигурой (как и слон) и стоит три балла. Конь - единственная шахматная фигура, способная перепрыгивать через другие фигуры! Конь проходит два поля в одном направлении, потом поворачивает и проходит одно поле в перпендикулярном направлении. Иначе говоря, его ход похож на букву "Г". Конь берет ту фигуру противника, чье поле он занимает а не фигуры, которые он перепрыгивает!

knight captures

С поля e4 конь держит под боем восемь полей. Его ходы похожи на букву "Г".

Ладья

В начале партии у каждого из противников по две ладьи, одна на ферзевом и одна на королевском фланге. Все четыре ладь расположены по углам доски. Белые ладьи в начале партии занимают поля a1 и h1, а черные - a8 и h8.

rooks starting position

Ладьи в начальной позиции.

Ладья считается тяжелой фигурой (как и ферзь) и стоит пять очков. Она может ходить на любое число полей влево и вправо по горизонтали и на любое число полей вверх и вниз по вертикали (если на пути не стоят другие фигуры). Легко запомнить, что, если отметить возможные ходы ладьи, расположенной в центре доски, получится знак "+".

rook moves captures

С поля e4 ладья может пойти на много полей по диагонали. Если отметить возможные ходы, у нас получится знак "+".

Ферзь

Ферзь - самая сильная шахматная фигура! В начале партии у каждого из противников по одному ферзю. Белый ферзь стоит на поле d1, а черный - на поле d8.

queen starting position

Ферзи в начальной позиции.

Ферзь считается тяжелой фигурой (как и ладья) и стоит девять очков. Он может ходить на любое число полей влево и вправо по горизонтали и на любое число полей вверх и вниз по вертикали (как ладья). Он может ходить на любое число полей по диагонали (как слон). Легко запомнить, что ферзь ходит как ладья и слон одновременно!

queen moves

С поля e4 ферзь может пойти на много полей. Он ходит как ладья и как слон.

Король

Король - самая важная шахматная фигура. Помните, что цель партии - дать мат королю! В начале партии у каждого из противников по одному королю. Белый король занимает поле e1, а черный - поле e8.

king starting position

Короли в начальной позиции.

Король - не самая сильная фигура. Он может ходить (или брать) только на одно поле в любом направлении. Заметим, что короля нельзя взять! Если король под боем, говорят, что ему "шах".

king moves

С поля e4 король может пойти на отмеченные поля.

Заключение

Чтение статьи - отличная возможность узнать новое, но кому-то принесет больше пользы просмотр видео! Смотрим видео, чтобы лучше понять сравнительную ценность фигур и решаем задания из соответствующего урока!
Мы узнали, как ходят шахматные фигуры, где они расположены в начале партии, и какова их ценность. Пора играть!


На этом изображении вы можете увидеть шахматную доску со всеми ее фигурами. В начале игры у одного противника есть армия белых фигур, а другой противник управляет армией черных фигур. Количество фигур у каждого игрока — 16.

Где на шахматной доске стоят пешки

На 2-й и 7-й горизонтали дружно в ряд выстроились пешки. В начале игры их у вас целых 8 штук.

Где на шахматной доске стоят ладьи

Далее, по краям шахматной доски, расположились ладьи — фигуры, похожие на башни.

Где на шахматной доске стоят кони

У ладей есть соседи — удивительные фигуры, похожие на лошадей. Только называются они чуть более официально — не лошади, а кони.

Где на шахматной доске стоят слоны

Рядом с конями не менее интересные фигуры — слоны. Действительно слоны, хоть и без хобота и красивых больших ушей.

Где на шахматной доске стоит ферзь

Теперь перейдем к поистине величественной фигуре — ферзю. Он стоит в центре доски и всем своим видом говорит, что он здесь главный. Корона, все дела — ну как ему не поверить! Но нет, есть фигура посерьезнее. 👑

Ферзь любит свой цвет и стоит только на поле своего цвета. То есть черный ферзь на поле черного цвета, белый ферзь — на белом.

где на шахматной доске стоит король

Во главе шахматного войска стоит король. Он, как и ферзь, расположен в центре шахматной доски. Да-да, у каждой армии есть предводитель, и в шахматах он тоже есть.

Да, шахматную армию на путь к победе ведет игрок. Но король важен для своих фигур, ведь цель шахмат — свергнуть вражеского монарха!

Вот мы и познакомились со всеми шахматными фигурами, их названиями и расстановкой. Пора перейти к подробному описанию каждой фигуры и раскрыть их главные особенности.

Ходы шахматных фигур

Король

Король — главная фигура в шахматах. Вот он, с короной на голове и ключом от шахматного государства.

Король — шахматная фигура

Главным я его называю не просто так. Партия заканчивается, когда король оказывается в ловушке под названием мат. Выигрывает тот, кто первым поставил мат королю соперника. Поэтому вам следует оберегать своего короля.

Фигура эта, конечно, великая, но двигается она медленно. Зато во все стороны: вперед, назад, вбок и наискосок. Но только на одну клетку за один ход. Вот такой вот вам монарх! Только не надо его ругать: свою силу и ловкость он отдал ферзю, о котором мы поговорим чуть позже.

Как ходит король в шахматах

Пешка

Пешка — самая маленькая фигура, но нельзя ее недооценивать. Это смелый боец, который первым рвется в бой. Кроме того, у пешки есть один секрет, о котором я вам сейчас расскажу.

Пешка — шахматная фигура

Пешка может двигаться только вперед и только на одну клетку. Но если она стоит в своем домике (на начальной позиции), то может выбрать — сходить на одну клетку вперед или сделать стремительный рывок на две клетки вперед. После этого пешка продолжает двигаться как обычно.

Как ходит пешка в шахматах

А вот и главный секрет этого маленького и хитрого воина. Как только пешка дошла до противоположного края доски, она может превратиться в одну из фигур: ферзя, ладью, слона или коня.

Превращение пешки

Подумайте, почему пешка не может превратиться в короля? 🤔 Догадались? Молодцы! Конечно, король у нас всегда один. Напомню, что цель шахмат — первым свергнуть короля противника. Это было бы трудно сделать, имей мы несколько королей.

Шахматный слон совсем не похож на слона, которого мы привыкли видеть в зоопарке, да и весит поменьше. Но бегать этот слон все же умеет, только по шахматной доске.

Слон — шахматная фигура

В партии у вас есть два слона, и они отличаются друг от друга. Один может ходить только по полям белого цвета — такой слон называется белопольным. Другой слон ходит только по полям черного цвета и называется чернопольным. Слоны перемещаются по доске в любую сторону и на любое расстояние наискосок по полям одного цвета. Линии перемещения слона еще называют диагональю.

Чернопольный и белопольный слон

Ладья

Ладья — это фигура, которая напоминает крепостную башню. Давным-давно ладьи были не просто фигурами на шахматной доске, а большими лодками, с помощью которых люди бороздили моря и океаны. Но шахматам больше 2000 лет, некоторые фигуры поменяли свой внешний облик и назначение, и ладья уже не похожа на лодку.

Ладья — шахматная фигура

Ладья — очень мобильная фигура. Она может двигаться в любом направлении по прямым линиям: вперед, назад, вправо, влево на любое количество клеток. Прямые линии, которые идут слева направо, называются горизонталями. Прямые линии, расположенные сверху вниз, называются вертикалями.

Как ходит ладья в шахматах

Ферзь

Итак, мы перешли к изучению самой сильной фигуры в шахматах — ферзя.

Ферзя в некоторых странах именуют королевой (по-английски queen). Например, в названии популярного шахматного сериала «Ход королевы» (Queen’s gambit). Но к нам эта фигура пришла со своей историей и именем färz из Турции, поэтому будем называть ее просто и благородно — ферзь.

Ферзь — шахматная фигура

Ферзь сочетает в себе ходы двух других фигур — ладьи и слона. Это значит, что он может двигаться в любом направлении на любое расстояние по прямым линиям (вертикалям и горизонталям) и по диагоналям. Только, в отличие от слона, ферзь не привязан к диагоналям лишь одного цвета. Если ферзь стоит на черном поле — ему доступны черные диагонали, если на белом поле — белые диагонали.

Как ходит ферзь

Ферзь — самый сильный воин во всей шахматной армии. Эту фигуру часто используют для заключительной атаки на вражеского короля.

Конь — фигура, которая соответствует своему названию. Невозможно представить себе древнее войско без коней: они всегда участвовали в военных сражениях, вот и в шахматах тоже участвуют. Не забываем, что мы с вами ведем великую битву!

Конь — шахматная фигура

От природы коням даны мощные ноги, и они отлично справляются с прыжками через препятствия. Так вот, шахматные кони не менее удивительны. Они даже могут перепрыгивать через фигуры — почти как настоящие!

Ход коня — самый необычный из всех шахматных фигур. Конь может двигаться в любом направлении: вперед, назад, вправо, влево. Только делает он это с помощью прыжка через две клетки, а завершает свое движение поворотом на одну клетку в сторону.

Как ходит конь в шахматах

Обязательно потренируйтесь с ходом этой фигуры самостоятельно! Вот вам небольшое задание. Попробуйте добраться вашим конем с поля a1 до поля h8, не наступая на препятствия. И помните — две клетки в любую сторону, прыжком вбок завершаем движение.

Задача на тренировку хода конем

На этом наше путешествие по сказочному миру шахмат подошло к концу. Теперь вы знаете все про шахматные фигуры — их названия, ходы и даже немного больше. Немного тренировок — и вы с уверенностью сможете отличить пешку от ферзя. А прокачаться еще быстрее помогут онлайн-уроки по шахматам в школе Skysmart. Запишитесь сейчас и получите до 3 уроков в подарок при первой оплате!

Расстановка шахматных фигур, названия, как ходит, какая самая сильная фигура.

Дата публикации: 2015-04-07

Шахматные фигуры

Шахматная фигура это специальная игровая единица, которая обладает определенными свойствами, заданными правилами игры. К этим свойствам относяться правила передвижения на шахматной доске, начальная позиция, название и силу.

Шахматные фигуры – это несколько шахматных фигур, образующих определенный комплект для каждого игрока. Как правило их 32 шкуки по 16 для каждого игрока. Один комплект имеет цвет "Черный", а другой "Белый".

К внешним свойствам шахматных фигур относится материал, размер и дизайн. Основным материалом, из которого изготавливают шахматы - это дерево и пластик. На рисунке показан пример профессиональных турнирных фигур:

Расстановка шахматных фигур

Ладьи ставят по углам доски, на вертикалях "a" и "h". Кони ставятся рядом с ладьями. После коней ставим слонов, а в середине ставятся ферзь и король. Как правило, проблем с запоминанием расстановки шахматных фигур на доске не возникает пробелм, но иногда начинающие шахматисты путают местами ферзя и короля. Чтобы всегда правильно ставить ферзь, нужно запомнить такую поговорку: "Ферзь любит свой цвет". Она говорит о том, что Белый ферзь ставиться на белое поле (d1), а Черный ферзь на черное (d8). Ниже показана расстановка начальных фигур:

Начальная расстановка фигур

Игровые особенности

У нас есть шесть уникальных шахматных фигур, каждая из которых имеет свое название: король, ферзь, ладья, слон, конь, пешка. У каждой фигуры есть свои определенные возможности. Некоторые малоподвижны с маленькой ударной силой, некоторые более подвижны, с большей силой. Одни ходят по белым, другие только по черным полям, есть которые ходят по всем полям доски. Даже есть фигуры, которые нужно защищать, под угрозой проигрыша. Поэтому, в шахматах не все фигуры равных.

Когда мы играем партию, то должны аккуратно разменивать фигуры, пытаясь разменять более слабую фигуру на более сильную фигуру оппонента. Иначе наш соперник получить большое материальное преимущество и с легкостью выиграет партию.

В этой таблице, мы приводим описание фигур, их ценность и на какие фигуры их можно менять:

Таблица описания фигур

Если против ферзя стоит три легкие фигуры, то это означает, что ферзя можно менять на три фигуры. Если Вы поменяете ферзя на одну легкую фигуры, то произойдет невыгодный размен и вы понесете материальные потери, а ваш противник получит шансы выиграть партию.

Если разменять ладью на слона с двумя пешками, то произойдет равноценный размен, но если ладь поменять на коня или слона, то здесь уже идет потеря качества (ладья более качественная, чем слон или конь). Обычно говорят, что игрок проиграл качество. Если вы меняете ладью на одну или две пекшу, то это уже материальные потери.

Во время партии, бывает возникают такие позиции, в которые слабые фигуры ведут успешную больбу против сильных шахматных фигур. Например: Слон сильнее ладьи, или ладья сильнее ферзя и т.д. Таким образом есть абсолютная и относительная сила фигур. Абсолютная сила указана в таблице, приведенной выше, а вот относительную силу измерить нельзя. Она зависит от игровой ситуации и в каждой позиции она может менять.

Высшее мастерство в шахматном искусстве это умения создавать такие позиции, когда слабые фигуры оказываются сильнее сильны.

В следующих уроках, мы подробно рассмотрим особенности каждой шахматной фигуры.

Примечание: Если вы стремитесь к резкому увеличению шахматного уровня , то необходимо систематически работать над всеми элементами игры:

  • Тактика
  • Позиционная игра
  • Атакующие навыки
  • Техника эндшпиля
  • Анализ классических игр
  • Психологическая подготовка
  • И еще многое другое

Всем привет! Меня зовут Борис Николаев, сегодня я хотел бы поделиться с вами своими наработками по технической реализации простого шахматного движка на Kotlin.

Пару месяцев назад я посмотрел сериал «Ход королевы», и вполне ожидаемо, что сразу захотелось поиграть в шахматы. Прежде всего я установил несколько бесплатных и условно-бесплатных игр. Но в каждом варианте были какие-то недостатки и ограничения. Ну, а поскольку я программист, то довольно быстро «захотелось поиграть» превратилось в «реализовать свой шахматный движок» и алгоритм игры.


В принципе это две большие темы. Забегая вперед скажу, что при реализации большую часть времени я потратил именно на сам движок, который обеспечивает правила игры, а не на алгоритм игры компьютера.

В шахматах обманчиво простые правила, которые со всеми особыми случаями не так-то просто сделать единообразно. Я приведу пример реализации логики игры на Kotlin, при этом сознательно не буду рассматривать графическую часть движка — для этого есть множество вариантов решений, в том числе и готовых. Ну, а для самых любопытных все исходники проекта я выложил на github.

Если у вас есть идеи по улучшению архитектуры и алгоритмов движка, то смело предлагайте их в комментариях! Но хотелось бы оговорить, что жду рекомендации, как улучшить производительность не в ущерб читаемости.

Обозначения для шахматных фигур

Для начала определимся с терминами и названиями. Не все, что стоит на доске, является фигурой (англ. «piece»). Пешку к фигурам не относят. Но это скорее профессиональный сленг. Мы для простоты все будем называть фигурами.

Познакомимся c фигурами и запомним их вид в нашем движке.

Иконка Фигура

Пешка — pawn

Конь — knight

Слон — bishop

Ладья — rook

Ферзь — queen

Король — king

Здесь кратко напомню, как ходят фигуры.

Пешка (англ. «pawn») — самая слабая фигура. Фактически, «пушечное мясо». Двигается только вперед. Атакует только по диагонали вперед на одну клетку.

То есть в процессе атаки пешка переходит на соседний ряд. При этом прямо атаковать не может, поэтому, встретив у себя на пути любую другую фигуру, оказывается заблокированной. Слабость пешек компенсируется их количеством. Кроме того, это единственная фигура, которая превращается в любую другую (кроме короля), если достигнет противоположного края доски. Чаще всего пешку превращают (это действие promotion ) в самую сильную фигуру — в ферзя. У каждого игрока по 8 пешек, они располагаются в ряд перед остальными фигурами.

Ладья (устар. «тура», англ. «rook») — фигура основательная. Хотя бы своим видом, похожим на башню. Ходит по горизонтали и вертикали в любом направлении на любое количество клеток, пока не встретит на своем пути другую фигуру. У каждого игрока по две ладьи, которые ставятся по углам доски.

Слон (устар. «офицер», англ. «bishop») ходит по диагонали в любом направлении, пока не упрется в другую фигуру. У каждого игрока по два слона, которые стоят по бокам от короля и ферзя. Из этого следует, что один слон всегда ходит по белым полям («белопольный» слон), а другой — всегда по черным полям.

Конь (англ. «knight») отличается как самым оригинальным внешним видом, так и самым причудливым ходом, который проще всего представлять буквой «Г». Две (или одна) клетка по горизонтали в любом направлении и одна (или две) клетки по вертикали. Причем неважно, есть на этих клетках другие фигуры или нет. То есть конь — единственная фигура, которая умеет «перепрыгивать» другие. У каждого игрока по два коня, которые ставятся между ладьей и слоном.

Ферзь, он же королева (англ. «queen») ходит как хочет: и по горизонтали, и по вертикали, и по диагонали в любом направлении на любое количество клеток. По сути ход королевы является комбинацией ходов слона и ладьи. С точки зрения первоначальной расстановки на доске ферзь ставится рядом с королем и всегда на поле своего цвета.

Король (англ. «king») ходит так же, как и королева, в любом направлении. Но монарху не к лицу суетиться, поэтому он ходит только на 1 клетку в каждую сторону. Также королю доступна рокировка (это действие castling ) с ладьей, если между ними нет других фигур. Потеря короля означает проигрыш, поэтому ходы, в результате которых король окажется под ударом вражеской фигуры, запрещены.

Обозначения ходов

Для этого используем краткую запись, которая на первый взгляд похожа на набор букв и цифр, однако на деле все довольно просто.

Расскажу и покажу наглядно.

Сперва пишется первая буква, обозначающая фигуру (для пешек букву не используем). Затем поле, с которого фигура совершает ход. Координата по Х обозначается буквами от a до h, по Y — цифрами, начиная с 1. Очень похоже на морской бой.

Если в ходе была уничтожена вражеская фигура, то пишем «x», если никто не пострадал, то будет «–». Затем указываем поле, на которое перешла фигура. Ну, и в конце обозначаем особые случаи: для шаха — «+», для мата «++», для пата «=». Для превращения пешки указываем в конце тип новой фигуры.

Техническая реализация

На шахматной доске 8 на 8 клеток, всего 64. Поскольку на каждой клетке может находиться только одна фигура, то во всех современных движках шахматные фигуры хранятся в виде битовых полей в типе Long , который как раз имеет разрядность 64 бита. То есть каждая клетка получает порядковый номер от 0 до 63 и если на данной клетке есть фигура, то соответствующий бит равен 1. Но это делается для оптимизации расходов памяти и просчета большого количества комбинаций. Поскольку в моей реализации ничего такого нет, я сделал упор на читаемость кода и решил хранить фигуры в Map , где ключом является вот такой тип Point .


Data class — это неизменяемый тип, автоматически определяющий такие методы, как equals и hashCode , а потому его можно использовать в качестве ключа мапы. Х — расположение фигуры по горизонтали, а Y — по вертикали.

Для самой фигуры определим два параметра: цвет и тип.

Цветов в шахматах всего два: белый и черный. Поэтому реализуем это в виде enum class с одним вспомогательным методом other() , возвращающим противоположный цвет (такой метод нам пригодится далее).


Тип фигуры также определим в виде enum class с параметрами: название, ценность и краткое обозначение.


Признак useForPromotion показывает, может ли пешка превращаться в данную фигуру. Как видим, пешка не может превращаться только в короля и в саму себя.

Поле notation нам потребуется для записи ходов (помним, что для пешки нет специального обозначения).

Теперь мы подошли к такому вопросу, как ценность фигур.

Ценность фигур


Ценность шахматных фигур можно считать по-разному. Она меняется в течение игры в зависимости от того, какие фигуры уже выбыли. Но в самом простом случае можно взять пешку за единицу измерения, как самую слабую фигуру.

Отсюда получается, что конь и слон примерно равны между собой и равноценны трем пешкам. Ладья более ценна и равна пяти пешкам. Ферзь чуть дороже ладьи и слона вместе взятых, и его ценность равна девяти пешкам. Король имеет самую высокую ценность, ведь без него игра прекращается, поэтому просто возьмем заведомо большое число, превышающее суммы всех остальных фигур вместе взятых.

Движок

К этому моменту мы можем полностью хранить текущее состояние игры в виде мапы. Для этого будем использовать поле pieces класса BoardImpl , который и будет по сути нашим движком. Затем, совершая каждый ход, мы будем менять нашу мапу pieces . Все совершаемые ходы будут добавляться в историю (поле history ).


Чтобы не хардкодить первоначальное расположение фигур на доске, его можно считывать из текстового файла. Например, файл может выглядеть так:


В этом файле 8 строк по 8 символов в каждой, т.е. 1 символ соответствует клетке на доске. Каждая фигура обозначается соответствующей буквой (например, пешка — буквой P). Регистр буквы определяет цвет фигуры: верхний регистр — это белые фигуры, нижний — черные.

Поскольку мы считываем начальное расположение фигур из файла, то довольно легко реализовать сохранение состояния доски в любой момент времени. Затем также легко его можно будет восстановить.

Генерация доступных ходов

В начале каждого хода движок будет генерировать список доступных ходов (множество клеток доски) для каждой фигуры. Это удобно и для человека (подсвечивать в интерфейсе доступные клетки), и для компьютера (просто выбирать оптимальный ход из полученного множества). Ходы бывают нескольких типов: обычный, ход с превращение пешки и рокировка. Определим интерфейс Turn :


Каждый ход содержит информацию о фигуре sourcePiece , которая этот ход совершает, ее исходную позицию from , пункт назначения to и вражескую фигуру enemyPiece (опционально, если она находится в пункте назначения). Также имеется два метода, принимающие текущее состояние доски: execute() для выполнения хода и revert() для его отмены. По сути это паттерн «Команда».

Обычный ход

Этот интерфейс реализует класс NormalTurn . Его метод для выполнения хода execute() выглядит так:


Просто извлекаем текущую фигуру по ключу from и помещаем на новую клетку доски по ключу to . При этом, если там была вражеская фигура, она просто перезатрется, т.е. удалится с доски.

Для отмены хода в методе revert() нам нужно знать, была ли в пункте назначения вражеская фигура и какой у нее был тип. Поэтому выполняем действия в обратном порядке и восстанавливаем вражескую фигуру.

Ход с превращением

Также сделаем другую реализацию интерфейса Turn . Это будет специальный ход пешки, в результате которого она превращается в другую фигуру. Назовем его PromotionTurn и добавим в него одно дополнительное поле, а именно: в какую фигуру пешка должна превратиться. То есть перед этим ходом у нас имеется пешка, а после — уже другая фигура. Поэтому создаем копию исходной фигуры, поменяв ее тип с помощью метода copy() .


Для отмены хода нужно также учесть этот факт и восстановить исходную пешку, которая хранится в sourcePiece . Аналогично обычному ходу, восстанавливаем вражескую фигуру, если она была уничтожена.

Генератор ходов

Теперь создадим следующий интерфейс, который будут реализовать генераторы ходов для каждого типа фигуры:


Он состоит из одного метода getTurns() , который принимает текущее состояние доски и выбранную фигуру, для которой ищем доступные ходы (в виде ее координаты position ). Метод возвращает множество доступных для данной фигуры ходов с учетом расположения других фигур на доске.

Также нам потребуется несколько утилитарных методов, которые мы будем использовать в наших генераторах.

Метод addPointIfPossible() принимает текущую позицию, относительно которой ищем ходы, состояние доски, а также смещение deltaX и deltaY относительно текущей позиции. В методе мы проверяем, не выходит ли новая точка за пределы доски, а также смотрим, нет ли в полученной точке фигуры. Если фигуры нет — ход доступен. Если фигура вражеская — тоже ход доступен. Дополнительно сохраняем информацию о вражеской фигуре. Ну, и если в полученной точке есть другая наша фигура, то ход недоступен.


Метод generateRectangularTurns() проверяет доступные ходы, распространяясь из исходной точки в четырех направлениях под прямым углом. То есть слева, справа, сверху и снизу. Как только где-то встретили препятствие, то дальше по этому направлению ходы не ищем. Также ограничиваем диапазон поиска с помощью параметра maxRange .


Эта логика поиска доступных ходов характерна для ладьи.

Далее идет еще один подобный метод generateDiagonalTurns() для поиска ходов по диагоналям также в четырех направлениях с центром в указанной точке. И тут же ограничиваем поиск по maxRange .


Эта логика поиска подходит для слона.

Генераторы ходов для каждой фигуры

Начнем реализовывать интерфейс TurnGenerator . Самая простая реализация будет у ладьи и слона, так как мы будем вызывать один из двух утилитарных методов, рассмотренных выше.

Для ладьи вызовем generateRectangularTurns() и укажем максимальный диапазон, в котором следует сгенерить ходы (8 клеток в каждом направлении):


Для слона также будем генерить ходы в диапазоне 8 клеток, но с помощью метода generateDiagonalTurns() .


Для ферзя используем аналогичный подход, но будем вызывать оба утилитарных метода, объединив их в одно результирующее множество:


Для короля будет все так же, за исключением того, что MAX_RANGE будет равен 1 клетке.


Для коня нам нужно проверить только те точки, до которых можно добраться ходом, напоминающим русскую букву Г (или английскую L, кому как больше нравится). Если в точке нет фигуры или есть вражеская фигура, то данная точка доступна для хода.


Самый сложный генератор ходов будет для пешки. Ведь первый ход пешка может прыгнуть сразу на две клетки вперед. При этом пешка атакует только по диагонали. Ну, и еще по достижении края доски пешка может превратиться в одну из других фигур.

Для краткости приведу только основной метод.


Метод getStartY() по цвету пешки определяет ее стартовую позицию по вертикали. Поэтому если текущая позиция равна стартовой, то добавляем к возможным ходам на 1 клетку больше.


Метод getDirectionY() в зависимости от цвета определяет направление хода пешки (приращение по вертикали), так как она может двигаться только вперед.


Если перед пешкой стоит другая фигура (своя или чужая), то пешка вперед двигаться не может. Если же пешка может идти вперед, то добавляем эту клетку к доступным ходам. Попутно проверяем, что если пешка в результате этого хода достигнет края доски, то это ход с превращением пешки в другую фигуру.


Наконец, проверяем клетки атаки впереди слева и впереди справа от пешки.

Объединяем все вместе

Теперь пришла пора объединить все эти классы внутри нашего движка.

Генераторы выдают допустимые ходы, не учитывая при этом статус нашего короля. Например, фигура прикрывала короля от прямой атаки, перемещаем эту фигуру на другое поле и сразу наступает мат. Поэтому ход другой фигуры, ставящий нашего короля под мат, является недопустимым, и мы на уровне движка должны это отсекать. В этом нам поможет пара утилитарных методов.

Метод getSpacesUnderAttack() строит мапу, где ключом является игрок, а значением — множество клеток, которые могут быть атакованы фигурами этого игрока. По сути просто проходимся по всем фигурам игрока, для каждой из них получаем допустимые ходы и затем объединяем их в одно общее множество ходов.


Метод isKingUnderAttack() получает множество всех фигур на доске и цвет короля, для которого производим проверку. Внутри метода мы просто берем множество всех клеток, которые атакует другой игрок ( kingColor.other() — противоположный цвет), и смотрим, есть ли среди этих клеток та, на которой находится наш король.


Теперь мы можем определить метод getTurnsForPiece() , который будет отсекать все ходы, в результате которых наш король попадает под мат.


Здесь мы получаем все множество допустимых ходов для данной фигуры. Выполняем каждый ход по очереди с помощью execute() , проверяем, не попадает ли король под мат в результате выполнения этого хода, и затем отменяем ход с помощью revert() . И так для каждого из возможных ходов, которые возвращает генератор.

После этой фильтрации окончательное множество допустимых ходов для фигуры может быть отображено в интерфейсе пользователю. Также это множество можно передать игроку-компьютеру, чтобы он выбрал наиболее оптимальный ход.

Выполнение хода и проверка статуса игры

Когда ход выбран пользователем или компьютером, движок получает выбранный объект Turn и просто выполняет его в методе executeTurn() , попутно проверяя состояние игры (шах, мат или пат) и фиксируя историю ходов.


Проверка состояния в методе getGameState() производится по следующей логике:

Игрок может сделать хотя бы один ход? Его король под ударом? Статус игры


Шах


Обычное состояние, игра продолжается


Мат


Пат
Раньше у меня было какое-то упрощенное понятие пата. Я думал, что это когда ни один игрок не может совершить ход. В обоих случаях вражеский король загнан в угол, и по факту битва уже проиграна. Но если он никем не атакован и при этом не может совершить ни один ход (так как «под мат» ходить нельзя), то это уже ничья. Согласитесь, что это неочевидно?

История ходов может быть представлена в виде списка из элементов Turn . Поскольку каждый объект неизменяемый и хранит всю необходимую информацию о ходе, мы легко можем сохранять всю историю, не создавая каких-то дополнительных сущностей.

Дальше — дело за ИИ

В этой части статьи я постарался подробно объяснить логику движка с комментариями к коду. Уже удалось сыграть с компьютером, и результаты были разные: когда-то побеждал я, когда-то уходил побежденным. Движок работает, теперь мне осталось описать другую составляющую — алгоритм игры в шахматы для компьютера.

Но это я оставил для следующей небольшой части статьи, возможно, в комментариях вы поделитесь своими идеями, как можно было бы улучшить игровой процесс не в ущерб читаемости кода.

Читайте также: