Так что название — это только половина фактического проекта. После создания движка я реализовал сокеты, чтобы два игрока могли играть с разных компьютеров. Это первая часть моего проекта, в конечном итоге я хотел бы заняться искусственным интеллектом и создать шахматного бота, как это сделал Lichess. ПРЕДУПРЕЖДЕНИЕ: если вы перейдете на мою страницу github для этого проекта, вы можете быть сбиты с толку некоторыми расположениями функций, такими как один из массивов, содержащих черные части, на самом деле содержит массив белых частей. Это было сделано из-за путаницы, и я в основном кодировал, используя имя, противоположное фактическому названию произведения.
Я создал несколько проектов для своего резюме, чтобы подать заявку на стажировку, и я думаю, что один из лучших проектов, которые я мог бы сделать, — это шахматный движок. Моя логика заключается в том, что как только у меня появится движок, проект может пойти по множеству разных маршрутов, таких как реализация сокетов, создание бота или обзор шахматных партий, а также прогнозирование игр на основе собранных данных. Сначала я начал с шахматного движка, и мне нужно было позаботиться о нескольких вещах:
Представительство в совете директоров
Для изготовления шахматной доски у меня была куча вариантов. Я мог бы использовать OpenGL или SDL, чтобы распечатать представление платы в графическом интерфейсе, или я мог бы построить плату прямо из символов ASCII. Я выбрал символы ASCII. Я построил двумерный массив, который принимал строки. Например, плитки будут представлены как « * » - всего будет 3 символа, так как я хочу содержать пробелы между каждым элементом и по-прежнему поддерживать исходный размер доски 8 на 8, всего имея 64 элемента в массиве . Я создал объект класса специально только для представления платы, которому в качестве входных данных требовался массив платы, а функции внутри класса заполняли и печатали доску.
Логика игры
Логика игры была важна до того, как вы начали, если вы никогда не играли в шахматы, прежде чем я буду обсуждать отдельно правила каждой фигуры и другие правила, которые применяются ко всей игре.
Пешки могут двигаться только на 1 клетку вверх, однако есть исключения: если пешка находится в исходной позиции, она может подняться на 2 клетки, а когда вражеская фигура находится на 1 клетку вверх и 1 в сторону, она может съесть фигуру. Башни вертикально и горизонтально и могут рокироваться с королем, если король и башня не были перемещены из начальной позиции. Слон может двигаться только по диагонали, а ферзь в основном сочетает в себе движение слона и движение башни. Лошадь является лишней в стеке, поскольку она движется в форме буквы L. Другими правилами игры являются также правила шахов и матов, которые, по сути, заканчивают игру. Это означает, что если король подвергается нападению, то король находится под шахом и должен двигаться. Если король не может переместиться ни в какое место, игра заканчивается. Другое правило — когда пешка достигает заднего ряда противника, она превращается в любую фигуру по своему выбору — обычно игроки выбирают ферзя.
Это правила шахматной игры, которые я реализовал, и в этом посте я рассмотрю код каждой фигуры по отдельности.
пешка
У пешек другая логика по сравнению с другими фигурами. В своей начальной позиции они могут переместиться на одну или две плитки вверх, но, выйдя из исходной позиции, они могут сделать только один ход. Их атакующее исполнение также сильно отличается от других шахматных фигур, поскольку они совершают наклонные атаки, как слоны, но только одна плитка перемещается вверх и в любую сторону. Они не могут ни двигаться назад, ни атаковать назад. Как только они дойдут до конца, их можно будет превратить в кусок по выбору игрока. У меня в движке только то, что у игрока сразу будет ферзь.
Вот код:
Королева, башня, король и слон
Ферзь, по сути, самая универсальная фигура в игре, и нам придется сочетать движение нашей башни и движение нашего слона. Наша башня движется только вверх-вниз и из стороны в сторону — это означает, что движется только одна ось, а другая — нет, по существу, в одном и том же месте. Если мы визуализируем это в коде, мы можем проверить, совпадает ли одно из желаемых местоположений игрока с координатами текущего положения. Если это так, нам пришлось бы протестировать различные функции, например, если деталь блокируется и т. д.…
Вот код башни:
Вместо этого слон движется по диагонали, что означает, что он должен изменить обе координаты, чтобы быть верным. Чтобы вычислить путь слона, мы можем использовать уравнение, которое мы все выучили еще в средней и старшей школе: уравнение прямой — Y = MX + B. B — точка пересечения с осью y, а m — наклон линия и x - это наш ввод. В шахматном движке мы координируем с позиции x или y. Оттуда мы хотим проследить возможные пути в зависимости от его направления, которое может быть представлено в основном тремя состояниями во всех частях этого движка: 0, 1 или -1. Оттуда мы можем получить различные возможные направления для каждой координаты y и x для этой конкретной части. На самом деле это относится и к башне.
Вот код епископа:
Ферзь теперь сочетается с кодом башни и слона. Королева является абстракцией обеих этих функций и облегчает нашу жизнь.
Вот код королевы:
Лошадь/Рыцарь
К несчастью для лошади, я был менее изобретателен, когда дело дошло до создания эффективного алгоритма для каждого возможного пути, поскольку каждый возможный путь отличается от частей. Лошадь, безусловно, самая уникальная, поскольку она имеет L-образную траекторию, а также может перепрыгивать через фигуры и, в конечном итоге, не может быть заблокирована вражескими фигурами. Для лошади я мог бы проверить каждый возможный путь, используя операторы if.
Вот код лошади:
рефери
Теперь о правилах. Самые важные правила — это правила атаки и правила проверки — по крайней мере, для меня. Как только мы закончим это, у нас может быть запущенная игра, которая в конечном итоге может закончиться. Для атакующего правила я написал функцию, которая в основном проверяла пути и смотрела, есть ли на пути вражеская фигура. Если у нашей желаемой координаты есть враг, она должна проверить несколько вещей:
- ) Является ли фигура вражеской фигурой, если да, верните True
- ) Поставит ли ход фигуры шах моему королю, если не вернется True
Вы видите, что правило атаки и правило шаха идут рука об руку, потому что друг без друга мы не можем вести плавную игру, потому что фигура будет двигаться, не осознавая своего короля.
Я написал правило атаки отдельно, чтобы упростить реализацию кода:
Правило проверки довольно избыточно и, на мой взгляд, может быть улучшено. Я в основном проверяю каждый путь, который есть у короля, и смотрю, есть ли на одном из путей смертельный враг. Если это произойдет, то он попытается двигаться, а если не сможет, то игра окончена. Я довольно часто использую функцию чека в начале новой позиции, а также во время движения фигур.
Вот краткий обзор кода, потому что его много:
Для функции проверки я все еще пытаюсь ввести все маты для белого короля и черного короля, рано или поздно это будет сделано.
Теперь мы можем создать оператор switch, который берет текущую фигуру, которую мы хотим переместить, и смотрит, есть ли у нее возможности, и смотрит, возможна ли желаемая позиция этой конкретной фигуры:
Краткий обзор
Вот краткий обзор того, как клиент подключается к серверу, чтобы играть в шахматы в той же игре, где вы увидите очень простые движения.
Кривая обучения и как улучшить
В настоящее время я реализую сетевой стек, чтобы играть на платформе, на которой оба игрока могут входить в систему с разных компьютеров, и первый тест прошел успешно. Этот проект помог мне понять, как логически решать задачу, и немного лучше понять шахматы. Проект также помог мне понять различные структуры данных и алгоритмы, которые можно использовать для плавной игры. Сейчас текущая цель — закончить сетевой стек и, возможно, реализовать концепцию шахматного движка в веб-приложении, используя React и Node в качестве сервера для хранения игр, пользователей, очков и достижений. Будем надеяться, что шахматная игра будет развиваться, улучшится код и появится графический интерфейс вместо использования символов ASCII, которые могут сбить игроков с толку. Чтобы узнать больше об этом путешествии, просто зайдите на мой сайт вверху.