Рекомендуемый формат данных для описания правил игры в шахматы

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

Я бы предпочел, чтобы формат был:

  • текстовый
  • человек читаемый
  • на основе стандарта (например, YAML, XML)
  • легко разбирается на разных языках

Но я готов пожертвовать любым из них ради подходящего решения.

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

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

Редактировать: В ответ на просьбу прояснить ситуацию - учтите, что у меня будет сервер, написанный на Python, один клиент, написанный на C#, и другой клиент, написанный на Java. Я бы не хотел указывать правила (например, допустимое перемещение фигур, обстоятельства для проверки и т. д.) В каждом месте. Я бы предпочел указать эти правила один раз независимо от языка.

Вы ищете язык / формат, специально предназначенный для этого? Нравится BoardGaML? (вымышленный)

Oddmund 11.10.2008 21:03

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

tzot 11.10.2008 23:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
2
1 778
9

Ответы 9

Давай подумаем. Мы описываем объекты (места и части) состояниями и поведением. Нам нужно отметить текущее состояние и постоянно меняющийся набор разрешенных изменений состояния по сравнению с текущим состоянием.

Это программирование. Вам не нужен какой-то «метаязык», который затем можно разобрать на обычном языке программирования. Просто используйте язык программирования.

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

За небольшими исключениями, языки программирования все

  • Текстовый
  • Человек читаемый
  • Достаточно стандартизованный
  • Легко анализируется соответствующими компиляторами или интерпретаторами.

Просто выберите язык, и готово. Поскольку для проработки нюансов потребуется время, вам, вероятно, будет больше нравится динамический язык, такой как Python или Ruby, чем статический язык, такой как Java или C#.

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


Поскольку исходные требования были неполными, второстепенная проблема - как иметь код, работающий совместно с несколькими клиентами.

  1. У вас нет клиентов на нескольких языках. Выбери один. Ява, например, и придерживаюсь ее.

  2. Если у вас должны быть клиенты на нескольких языках, вам нужен язык, который можно встроить во все три языковые среды выполнения. У вас есть два варианта.

    • Встроить переводчика. Например, Python, Tcl и JavaScript - это легкие интерпретаторы, которые можно вызывать из программ на C или C#. Этот подход работает для браузеров, он может сработать и для вас. Java через JNI также может это использовать. Есть механизмы правил BPEL, с которыми вы можете попробовать это.

    • Создать интерпретатор как отдельный подпроцесс. Откройте именованный канал или сокет или что-то между вашим приложением и порожденным интерпретатором. Ваши клиенты Java и C# могут взаимодействовать с подпроцессом Python. Ваш сервер Python может просто использовать этот код.

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

James Fassett 11.10.2008 20:53

«Более чем на одном языке» не имеет большого смысла. Имеет смысл использовать более одной платформы. Более чем один язык ложен. Вот почему у нас есть интерфейсный слой между Random Client Language и вашей системой правил Chess.

S.Lott 11.10.2008 21:28

Извините, я вас неправильно понял. У меня есть клиент, написанный на C#, который общается с сервером, написанным на Python. И клиент, и сервер должны знать правила игры в шахматы. Как мне избежать написания правил игры в обоих местах?

James Fassett 11.10.2008 21:34

@James Fassett: Пожалуйста, сформулируйте свой вопрос еще раз, включив в него эти полезные, необходимые факты.

S.Lott 11.10.2008 21:45

Джеймс: Напишите правила на python (например) с определенным интерфейсом. Затем скомпилируйте его в байт-коды Java (с помощью jython) и свяжите с вашим клиентом Java. То же самое для C# (с использованием IronPython). Или воспользуйтесь одним из других методов, предложенных С.Лоттом.

Brian 11.10.2008 23:05

Редактировать: Излишне многословный ответ удален.

Короткий ответ: напишите правила на Python. Используйте Iron Python для взаимодействия с клиентом C# и Jython для клиента Java.

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

Vinko Vrsalovic 12.10.2008 14:16

Это ответ на следующий вопрос :-)

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

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

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

Да, и кстати: Представительство в Википедии

Все, что не входит в состав совета директоров, относится к самой программе, как многие уже отмечали.

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

Как вы пишете правила (в отличие от ходов) в этих форматах?

Mike F 11.10.2008 21:49

Я бы предложил Пролог для описания правил.

В Drools есть современная реализация правил, понятная человеку - https://www.jboss.org/drools/. У них есть способ, которым пользователи могут вводить свои правила в Excel. Намного больше пользователей могут понять, что находится в Excel, чем в других инструментах.

Что я понял из ответов на данный момент:

Для представления данных шахматной доски:

См. Статью в Википедии о [изображениях на шахматной доске] (http://en.wikipedia.org/wiki/Board_presentation_(chess)).

Для представления данных шахматного хода:

См. Статьи в Википедии о Обозначение портативных игр и Алгебраическая шахматная система обозначений

Для представлений шахматных правил:

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

  1. Используйте язык, на котором существует встраиваемый интерпретатор для целевых языков (например, Lua, Python).
  2. Используйте виртуальную машину, в которую могут компилироваться распространенные языки (например, IronPython для C#, JPython для Java).
  3. Используйте фоновый демон или подпроцесс для правил, с которыми могут взаимодействовать целевые языки.
  4. Реализуйте алгоритмы правил на каждом целевом языке.

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

Чтобы представить текущее состояние доски (включая возможности рокировки и т. д.), Вы можете использовать Обозначение Форсайта-Эдвардса, который даст вам краткое представление ascii. например.:

rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1

Было бы стартовой позицией на доске.

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

Что касается представления правил - я бы хотел знать сам. В настоящее время правила для моего шахматного движка просто написаны на Python и, вероятно, не так декларативны, как хотелось бы.

Я согласен с комментарием, оставленным ΩΤΖΙΟΥ, а именно. просто позвольте серверу выполнить проверку и позволить клиентам представить потенциальный ход. Если вы не хотите подходить к дизайну, просто напишите правила на Python, как это было предложено С. Лоттом и другими.

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

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

Для каждого отправленного потенциального хода вам просто нужно будет проверить правила в следующем порядке:

  1. Предлагаемый ход потенциально действителен? (правильная «форма» изделия)
  2. подходит ли он к ограничениям доски? (фигура заблокирована, не отодвинется ли она от края)
  3. Переезд нарушает государственные требования? (Я нахожусь под шахом после этого хода? Могу ли я пройти через шах? Законно ли это взятие на проходе?)

Если все в порядке, сервер должен принять этот ход как законный ...

Другие вопросы по теме