Как сделать шахматную программу

Добавил пользователь Дмитрий К.
Обновлено: 17.09.2024

Сейчас трудно поверить, но эта история началась ещё до выхода сериала "Ход королевы".

Привет! Меня зовут Данила Пилин. Мой дед неплохо играл в шахматы. Буквально сутками просиживал за доской. В детстве я часто приезжал к нему — так постепенно и полюбил игру.

В институте шахматы забылись: карьера-учеба, вот это все. А потом я увлекся снова. Стал ходить в шахматный клуб на Полянке. Играл с дедами — и постоянно им проигрывал, так как плохо знал теорию. Стал проходить курсы, изучать дебютную подготовку. Начал кого-то обыгрывать. И это дико мотивировало и драйвило.

В начале 2020-го я сидел и думал, чего хочу дальше. Вот уже два года как я работал аналитиком в Skyeng: занимался продуктовой аналитикой, A/B тестами, строил витрины данных. Это перспективно. Но чего-то не хватало. И я решил заняться тем, что меня драйвит: шахматами.

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

Не желая бросать новую мечту, я бросился изучать, что есть в онлайне. Заодно решил оценить весь объем услуг онлайн и офлайн (не зря же я продуктовый аналитик). Оказалось, что в конце 2019-го шахматы обогнали по популярности хоккей, а по приросту активной аудитории уступали только футболу! Плюс, их добавили в обязательную программу начальных классов — вместо одного из уроков физкультуры.

К концу 2019-го шахматами, по данным Министерства спорта РФ, занимались уже порядка 900 тысяч человек в стране.

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

А в компании был продукт — онлайн-школа для детей Skysmart, на которой уже можно было изучать математику. Ее платформу как раз адаптировали для новых предметов. Технически ее можно было приспособить и для шахмат. Так у меня появилась идея.

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

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

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

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

Для создания контента нужны:

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

К концу ноября сформировался костяк этой команды. Благодаря сарафану внутри компании к нам пришел контент-менеджер Степа. Раньше он помогал верстать контент по английскому, но оказался фанатом шахмат и попросился в мой проект. Затем к Степе присоединилась контент-менеджер Оксана.

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

Затем у нас появилась иллюстратор Лиза — она делает чумовые иллюстрации. И очень быстро.

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

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

Как-то раз мы созвонились с Марией Фоминых, чемпионкой России и Европы среди девушек и автором детских книг по шахматам — она подтвердила эту гипотезу. И посоветовала просто найти людей, которые добились хороших результатов в работе с детьми со своей методологией. Эту методологию и можно взять за основу.

В итоге я нашел методиста: Марию Лапину (Лысенко) она пишет свои книги, преподает уже девять лет и ее ребята занимают места на разных турнирах.

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

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

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

Но тут нам снова повезло. В команде разработки был идеальный кандидат. Мы созвонились и начали работу.

Рассказывает Владлен Волков, наш фронтенд-разработчик

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

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

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

Процесс разработки был скучным — как спланировал, так все и прошло.

Моей задачей было написать модуль шахматной доски для комнаты. Я хотел сделать модуль изолированным: на входе получать сущности из основного приложения, но наружу ничего не выпячивать. В своей команде я топлю за TDD. И тут такая удача — описать что-то с нуля. Решил писать через тесты. И еще раз убедился, что это не аффектит производительность и трудозатраты. Так даже легче - не надо ничего в голове держать при планировании архитектуры, плюс оно документируется лучше.

Модуль получился экспериментальным во многих смыслах. Я смог реализовать несколько оберток для нашего кастомного стейт-менеджера, а заодно подключил нашего QA-лида к написанию юнит-тестов — до этого он писал только end-to-end. Опыт получился позитивным, хотим еще раз попробовать.

Надо было удалить доску математики и вставить шахматную доску. Выпилить — понятно. А что вставить?

— Я смотрел готовые библиотеки. Сначала хотел взять ChessboardJS — проверенный инструмент. Но он тащит JQuery: чтобы развернуть доску, нужно брать 300кб всякого ненужного от мамонта.

Стал искать что-то более независимое и инкапсулированное. И нашел cm-chessboard — она не добавляется в глобальную область видимости, есть импорты-экспорты. То, что нужно. Но был нюанс: нужно было кастомизировать доску, заменить поля на другой цвет и поменять скины фигурок — а делать верстку было лень. И я откладывал :)

Так у меня появился джун: я объяснил ему, как работать с монорепой нашего фронтенда — что, как, куда. Скоро стили были в проде.

Опыт шахматиста в итоге пригодился?

А что-то свое, кроме TDD, удалось в проект внести?

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

(рассказываю снова я)

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

Поэтому первые демки мы делали на взрослых, которые связаны с продуктовой разработкой. Я отписался в один из чатов компании — на тест записалось 100 человек, но до новогодних праздников мы провели около сорока тестов. Нам повезло: люди были разного уровня подготовки и почти все пришли на созвон. Мы проверяли все: от того, как заходит контент, до функционала доски. По итогу убрали много сложных механик, которые не могли осилить даже взрослые…

Параллельно стали составлять портрет преподавателя. Сейчас наша основная задача — обучать новичков. Мы поняли, что для этой аудитории не нужны титулованные преподаватели: достаточно иметь 2-й или 1-й разряд и следовать методологии. На что действительно обращаем внимание: это опыт работы с детьми, харизма и энергичность. И отбираем тем, кто с любовью расскажет ребенку о шахматах.

Первых таких репетиторов мы наши среди тех, кто уже ведет математику в той Skysmart, детской онлайн-школе от Skyeng. В целом, неудивительно — тем более экспериментами доказано, что изучение шахмат влияет на успеваемость по точным предметам (ссылка в конце поста). А дальше включился стандартный флоу подбора преподавателя. Сейчас подбирать их нам помогает Настя, она руководит поиском учителей для всей компании. И так сложилось, что в детстве сама много занималась шахматами, а ее папа преподает игру до сих пор.

1 февраля шахматы от Skysmart запустились в паблик. Мы реализовали все ключевые фичи MVP, но еще многое впереди. Сейчас можно играть и заниматься с ПК или планшета, а вот с мобилки - только если в браузере. Пока у нас нет турниров — здесь есть масса готовых решений с большими командами разработки, нет смысла гнаться за ними. Наш приоритет — интерактивное обучение. Так что будем добавлять механики в домашки, делать мини-игры и работать над удобством платформы.

А из интересных планов — Владлен уже подбирает игровой ИИ, чтобы в будущем на нашей платформе можно было играть против компьютера. И тут ему снова помогает опыт КМС.

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

  • Что получилось у нас — индивидуальные онлайн-уроки шахмат от Skysmart
    от издания Reminder, которую очень всем рекомендую последнее время — внутри много ссылок на исследования
  • Где брать данные министерства спорта по динамике прироста аудитории и числу активно занимающихся разными видами

Вы делаете доброе дело. Можно детей отвлеч от онлайн игр в интернете. Таким образом спасёте психику многих подростков. Благородно! Примите мой респект.

Благородно = бесплатно
А здесь просто хорошая миссия.

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

Шахматы - не игра?

Шахматы - это жизнь.

У тебя брат Сибирский?

Спасибо за Ваши слова!

Соревновательный StarCraft II - те же шахматы, но на скорость.

Просто по кайфу. А вы проходите мимо со своим идиотским комментом

Бесспорно — lichess/chess лучшие, на текущий момент, платформы для игры в шахматы.
Цель статьи — не провести сравнительный анализ того, что есть на рынке, а рассказать про наш проект, что мы сделали за 3 месяца, и какие у нас планы.
Про сравнение с индустрией можно будет написать в отдельной статье)

Но если кратко, какие у нас преимущества, на мой взгляд:
Для ученика/родителя:
1. Интерактивные уроки с различными механиками. На уроках, помимо игры и теории, дети знакомятся с интересными фактами о шахматах, в дз, помимо задач, записываем мини видео для закрепления изученного материала.
2. Программа обучения. Уроки писали титулованные шахматистки, уровень сложности уроков выстроен так, чтобы ребенок не заскучал от шахмат через пару занятий.
3. Весь процесс обучения на одной вкладке. Домашки, связь с преподавателем, прогресс обучения — все внутри платформы.
4. Обратная связь для родителей. Если не подошел преподаватель, мы можем его поменять на подходящего. Регулярно рассказываем родителям об успехах ребенка.
5. Отбор преподавателей. Помимо регалий и опыта для нас важно, чтобы преподаватель был энергичным, смог заинтересовать ребенка.

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

Плюсы
1. На самом деле шахматы ОЧЕНЬ популярны в России.
2. Нет понятной площадки для обучения детей - ваша могла бы ей стать.

_______
Зашёл на сайт посмотреть цены, непонятно, стоимость 8 уроков 1130 рублей или каждого из этих уроков по 1130 рублей? (Если второе, то 8800 рублей за один этап занятий это слишком дорого)

Ведь, по существу, очень часто, говоря об успехах в области искусственного интеллекта (ИИ), в качестве примера приводят не невнятные персептроны, и не роботов, которые умны только в новостях науч-попа, а компьютерные программы, обыгрывающие чемпионов мира.

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

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

Чем являются шахматы с нашей точки зрения? Это игра детерминированного типа, то есть не подразумевающая скрытых случайностей, влияющих на ситуацию. В ней все определено и ясно заранее. К недетерминированному типу (т.е. случайному) относится большинство карточных игр, кости, рулетка и тому подобное.

  1. Написание шахматной программы — это конкретная, а не абстрактная задача. Мы знаем правила, расстановку и т.п.
  2. Универсального алгоритма или метода для расчетов не придумано. Есть несколько базовых находок.

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

Теперь перейдем к структурным блокам шахматной программы. Для их описания мы будем чаще всего использовать названия функций. Приступим.

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

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

Полный перебор для современных компьютеров — вещь утопическая, потому как ветвление дерева поиска происходит экспоненциально. В среднем из каждой позиции имеется 40 вариантов перемещений для одного игрока. При глубине 4 получается 40х40х40х40, то есть, 2560000, а при глубине 5 — 40х40х40х40х40 вариантов, что равняется 102400000 (102 млн. 400 тыс.). А дальше рост вычислений продолжает увеличиваться в экспоненциальной прогрессии. Глубина 6 является предельной для реализации полного перебора в рамках современных вычислительных систем, а это подразумевает рассмотрение чуть больше, чем 24 млрд. позиций (чуть больше — это 96 млн). Именно поэтому нужно вводить особые условия и ограничения с выделением наиболее перспективных ветвей.

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

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

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

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

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

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

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

Непосредственно, сама реализация перемещения. Многие программисты смотрят на данный вопрос по-разному. Лично я использую MakeMove() для создания новой позиции на доске после указанного перемещения. То есть до этого у нас расположение фигур было одним, после MakeMove оно изменилось. Данная функция необходима для подготовки к расчетам оценок в рамках Evaluate Position().

"Если хочешь быть умным, надо делать всё самому и всё начинать с нуля - так проще понять, что и как работает".

Собственно, суть вопроса такая: хочу написать для себя программу "шахматы". Даже не задумывая сейчас о каком-либо интерфейсе, важен "внутренний мир". и главный вопрос - с чего начать и как продолжать?

Язык программирования: С++

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

Начни с шахмат.
Для продолжения поупражняйся с TStringGrid.
Потом создай классы фигур. Надели их нужными свойствами.
Опиши логику взаимодействия классов(процесс игры).
Нарисуй фигуры.
Напиши ИИ бота(компьютер-противник)
Прикрути OpenGL.
Написать сайт к игре.
Разбросать по каталогам программ.
Заниматься поддержкой.

Послесловие.
Советы не новичка, но любителя.

xwicked, отлично!

1 - начать с шахмат - я знаю "как играть в шахматы", играла.
2 - TStringGrid - это я так понимаю, надо начать работу с таблицами?
в С++


Так, буду пока что с этим разбираться, спасибо вам большое!

TStringGrid - это если будешь использовать C++ Builder. Это простейший способ представить шахматную доску за короткое время не рисуя её в PaintBox или на канве других компонентов типа TImage. Можно использовать текст для начала, потом и рисование изображений на канве TStringGrid. И только в самую последнюю очеред перевод на OpenGL или на основанный на холсте самодельный графический движок.

Использование VCL-компонентов влечет за собой их многочисленные сложности в настройке, поскольку они универсальны. Гораздо проще представить шахматную доску в виде двумерного массива. Как работают массивы напечатано в любом справочнике по C++. Столбцы - номера клеток, строки - буквы. Аргумент ячейки массива - число типа Byte, которое является ссылкой на индекс фигуры. Пусть черные пронумерованы от 0 до 15, а белые от 100 до 115. Далее нужен класс "Фигура" и набор процедур: "Ход", "Атака", "Гибель", и пр. вспомогательные.

TStringGrid - это если будешь использовать C++ Builder. Это простейший способ представить шахматную доску за короткое время не рисуя её в PaintBox или на канве других компонентов типа TImage. Можно использовать текст для начала, потом и рисование изображений на канве TStringGrid. И только в самую последнюю очеред перевод на OpenGL или на основанный на холсте самостоятельный графический движок.

Использование VCL-компонентов влечет за собой их многочисленные сложности в настройке, поскольку они универсальны. Гораздо проще представить шахматную доску в виде двумерного массива. Как работают массивы напечатано в любом справочнике по C++. Столбцы - номера клеток, строки - буквы. Аргумент ячейки массива - число типа Byte, которое является ссылкой на индекс фигуры. Пусть черные пронумерованы от 0 до 15, а белые от 100 до 115. Далее нужен класс "Фигура" и набор процедур: "Ход", "Атака", "Гибель", и пр. вспомогательные.

Массив проще, соглашусь.
А почему бы не сделать так, что массив двумерный, 8х8, но задать "цвет клетки" какой-нибудь формулой, например, считай с клетки 1х1, если сумма чётная - (i+j) - белая или чёрная, - ну и наоборот.
Хотя такой проще может показаться "долгим", просто, на мой взгляд, не нужно будет выводить два массива (для белых и чёрных).

есть ещё вариант, можно массив вручную ввести, типа "0" и "1", ну и цвет для цифры, тогда там надо будет просто проверить - (i,j) =1? - ну и так далее.

Ну хорошо, момент с доской вроде бы поняла.

Давайте ещё раз и с самого начала:

сейчас моя цель сделать доску, представить её, пусть даже, массивом, и проверить чтобы он проверял клетки, так?

Второй шаг - я должна сделать классы - фигуры. Объяснить как они будут ходить. Так?

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

Теперь про поле, как бы сделал я. Варианта тут может быть два. Пожалуй, более правильный в данном случае - создать массив 8*8 указателей на объекты фигур. Если указатель равен нулю - значит, клетка свободна. Если нет - значит, на ней есть фигура.
Второй вариант - просто массив (а лучше - вектор std::vector, список std::list или дек std:: deque) указателей на объекты, всю информацию о своем положении хранят только сами фигуры. Такой способ хорошо подойдет для игр, в которых объекты располагаются не в одной из фиксированных клеток, а либо могут занимать несколько клеток (например, как в HMM 3) или вовсе располагаться абсолютно произвольно. Но в шахматах он, думаю, себя не оправдывает.

Классы фигур тривиальнее всего сделать наследниками общего класса вроде такого

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

Отрисовка поля происходит просто - сначала рисуем доску, затем пробегаем по всем фигурам (по всем указателям поля) и заставляем их рисовать себя. Свои цвет и координаты они знают, поэтому справятся.

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

И вот, кажется, и все шахматы. Только нужно еще добавить возможность рокировки (навскидку не скажу, как именно) и проверку на шах и мат (проще всего добавить соответствующую функцию классу короля).
Можно также добавить функцию, которая бы возвращала список всех клеток, на которые фигура может сходить в данный момент - для подсветки их на игровом поле.

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

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

  1. "плюс" - начальная позиция на доске
  2. "корзина" - очистка всех фигур с доски
  3. "стрелки" - перевернуть доску

Экспорт и загрузка позиций в формате FEN

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

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

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