Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Написать валидацию доски (позиции на доске). #34

Closed
nekr0z opened this issue Mar 7, 2023 · 12 comments
Assignees

Comments

@nekr0z
Copy link
Collaborator

nekr0z commented Mar 7, 2023

No description provided.

@nekr0z nekr0z self-assigned this Mar 7, 2023
@nekr0z
Copy link
Collaborator Author

nekr0z commented Mar 7, 2023

В теме проверки легальности позиции (даже если мы не берём 960) оказалось на удивление много вкусного; некоторые даже считают, что задача эта алгоритмически невыполнима.

Из курьёзов: автор этой диаграммы считает, что позиция на доске (ход белых, пешка c5 может быть взята на проходе, у чёрных доступна рокировка) не может быть достигнута легально…
image
Он, конечно, неправ — позиция абсолютно легальная и достижимая. Другой вопрос, что такая позиция, конечно, не могла бы быть достигнута в реальной игре (т.е. в такой, где хотя бы один из игроков не стремился бы именно этой позиции достичь :)

Вот это последнее соображение приводит меня к мысли, что целиться в абсолютную валидацию, может быть, и незачем; достаточно валидировать основные моменты:

  1. Существует один и только один король каждого цвета.
  2. Король цвета, у которого нет хода (в том смысле, что ход у другой стороны), не находится под шахом.
  3. Король цвета, имеющего ход, находится под шахом не больше, чем двойным; если шах двойной, то это не два слона, не два коня, не пешка+пешка, не пешка+конь, не пешка+слон.
  4. На доске не больше 8 пешек каждого цвета.
  5. На горизонталях 1 и 8 пешек нет.
  6. В случае, если открыто взятие на проходе, перед «проходным» полем находится пешка нужного цвета, проходное поле и поле за ним пусты.
  7. Количество фигур соответствует количеству недостающих пешек: два ферзя и три ладьи одного цвета требуют не более шести пешек этого цвета на доске, и т. д. Учесть, что из двух однопольных одноцветных слонов один — проведённый.
  8. Конфигурация пешек должна хотя бы примерно соответствовать количеству фигур на доске; так, 6 белых пешек на вертикали h возможны только в том случае, если у чёрных на доске не осталось ничего, кроме короля (и вряд ли такая позиция возникла в реальной игре).
  9. Белые пешки на h2 и h3 означают, что белой пешки на g2 быть не может, и т.д.
  10. Король не на месте не сочетается с возможностью рокировки, аналогично для ладьи.
  11. Белый слон может быть заперт на 1-й горизонтали пешками только на своей стартовой позиции (т.е. невозможна позиция с белым слоном на e1 и белыми пешками на d2 и f2, например). При наличии белых пешек на d2 и f2 чёрный слон может оказаться на e1 только в результате проведения туда пешки; если белая пешка есть и на e2, чёрного слона на e1 быть не может вообще. Аналогично для 8-й горизонтали.

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

Что думаете?

@loskutovanl
Copy link
Collaborator

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

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

@loskutovanl
Copy link
Collaborator

loskutovanl commented Mar 8, 2023

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

@nekr0z
Copy link
Collaborator Author

nekr0z commented Mar 8, 2023

Ещё я не могу себе представить двойной шах двумя ладьями.

image
Ход белых.
После fxg=R чёрный король под двойным шахом двумя ладьями.

Аа, ну да.
С ферзем также получается.

Очень замороченно будет валидировать все случаи

@nekr0z
Copy link
Collaborator Author

nekr0z commented Mar 8, 2023

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

image
Ход белых. После Ne8 имеем двойной шах конь+слон.

@da070116
Copy link
Collaborator

da070116 commented Mar 8, 2023

есть ещё кейс задачи-шутки, там бывает и не такое. Ради интереса полез в редактор доски на lichess, там позиция ошибочна только при нескольких королях на доске, ходе стороны, которая даёт шах, и пешках на 1/8 горизонталях. Sapienti satis?)

@nekr0z
Copy link
Collaborator Author

nekr0z commented Mar 8, 2023

Ради интереса полез в редактор доски на lichess [...]

Lichess в явном виде поддерживает 960 и Bughouse, поэтому у них так: в их редакторе пользователь, сколько мне помнится, нигде в явном виде не выбирает, для какого варианта он редактирует доску, поэтому отсекаются только такие, которые заведомо невозможны ни в каком варианте.

@da070116
Copy link
Collaborator

da070116 commented Mar 8, 2023

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

@sadmadrus
Copy link
Owner

sadmadrus commented Mar 8, 2023

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

@loskutovanl
Copy link
Collaborator

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

image
Ход белых. После Ne8 имеем двойной шах конь+слон.

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

@nekr0z
Copy link
Collaborator Author

nekr0z commented Mar 9, 2023

Может для простоты просто проверять что шах не тройной ? ..

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

@nekr0z nekr0z mentioned this issue Mar 10, 2023
12 tasks
@nekr0z nekr0z closed this as completed Mar 13, 2023
@nekr0z
Copy link
Collaborator Author

nekr0z commented Mar 13, 2023

Написано. Для добавления проверок открыл новый тикет #41

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants