Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Определение мата в шахматах?

29K
27 мая 2012 года
webdev
56 / / 08.05.2010
Подскажите пож как можно определить мат в шахматах? А то не могу придумать как это запрограммировать.
Дошел до того, что могу определять какие клетки под ударом, чтоб король туда не мог ходить.
Могу сделать, чтоб каждый раз проверяло не находится ли король под ударом... Это все можно, но вопрос и проблема в том, что если например король под ударом и все позиции куда он может походить тоже под ударом..
Остается такая штука как.. Противник жертвует фигурой прикрывая короля и после этого у короля например открывается свободная клетка для хода...

В общем, подскажите как кто видит как можно организовать мат для противника? Игра друг против друга, без "ИИ".

Спаасибо заранее, а то мучаюсь уже долго с этой проблемой.. :(
1
28 мая 2012 года
kot_
7.3K / / 20.01.2000
необходимо реализовать процедуру на проверку шаха и если она отрабатывает с положительным результатом - вызывается процедура просчета мата.
277
28 мая 2012 года
arrjj
1.7K / / 26.01.2011
Решение в лоб: пересчитать все возможные ходы.
1
28 мая 2012 года
kot_
7.3K / / 20.01.2000
Цитата: arrjj
Решение в лоб: пересчитать все возможные ходы.


для шахов и соотвественно мата все равно надо будет выполнять отдельный пересчет )) если не использовать БД для их узнавания.
поэтому (по крайней мере один из способов) перед выполнения просчета запускается процедура просчета шахов - потому как если шах - просчет ходов становится граздо менее объемным ))

1
28 мая 2012 года
kot_
7.3K / / 20.01.2000
и даже если использовать БД - все равно отдельно надо выбирать ситуацию когда король под ударом
465
30 мая 2012 года
QWERYTY
595 / / 25.03.2012
Вы можете определять от какой фигуры исходит угроза?

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

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

Пока ничего проще в голову не приходит, может ещё кто что посоветует.
465
30 мая 2012 года
QWERYTY
595 / / 25.03.2012
Цитата: kot_
необходимо реализовать процедуру на проверку шаха и если она отрабатывает с положительным результатом - вызывается процедура просчета мата.



Про процедуру мата и спрашивают, а вы пишите примените процедуру мата.

465
30 мая 2012 года
QWERYTY
595 / / 25.03.2012
Да, ещё нужно определить не исходит ли угроза от двух фигур.
Я попадал в такую ситуацию, когда например мне ставили шах ладьёй и в то же время открывался офицер бьющий по моему королю. В такой ситуации как вы понимаете бессмыслено искать фигуру для перекрытия. Здесь сразу нужно проверять может ли король ходить, если нет то пипец.
1
30 мая 2012 года
kot_
7.3K / / 20.01.2000
это как раз и есть две процедуры - одна проверка на угрозу королю, вторая - на возможность избежать угрозы - т.е. выполнить ход королем либо прикрыть фигурой. На самом деле в зависимости от сложности алгоритма работы программы - двумя угрозами можно и пренебрегать - т.е. просчитывать каждую по отдельности, например. Либо просчитывать на ход вперед
465
30 мая 2012 года
QWERYTY
595 / / 25.03.2012
Двумя фигурами может и можно пренебреч. Но если проверить на это то остальные расчёты упрощаются если угрожают две фигуры.
В этом случае не запускается механизм поиска фигуры для перекрытия, и выбора из всех найденых фигуры с защитой или которая разблокирует короля. сразу проверяется может ли король уйти.

Я же не говорю что этот вариант единственно верный и важный, всё зависит от требований ко времени просчёта, размеру кода и его сложности.

Вообще лучше бы автор что нибудь написал, годится ему так или нужно чтото другое придумать.
Или вообще проблема решена и он не нуждается в решении.
29K
31 мая 2012 года
webdev
56 / / 08.05.2010
Спасибо всем за ответы, - столько советов, что я даже не знаю какого курса держаться, - пока что я оставил этот вопрос, может продолжу через недельку, поэтому, я как автор не проявлял активности.

Да, нуждаюсь, но как только начинаю думать, вот-так и так, то вылазит, а еще это нужно учесть, а еще так и... я чуток запутался.
Тем не менее вы меня навели на несколько интересных мыслей..
1
31 мая 2012 года
kot_
7.3K / / 20.01.2000
Цитата: QWERYTY

Про процедуру мата и спрашивают, а вы пишите примените процедуру мата.


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

465
31 мая 2012 года
QWERYTY
595 / / 25.03.2012
"Определение мата в шахматах?" - Это вопрос.

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

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

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

Мы говорим о разных вещах, я говорю про мат, как и спрашивал вопрошающий. А процедура определения шаха по любому должна быть, нет смысла проверять на мат если королю не угрожают. Но вопрошающий не спрашивал про определение шаха, я понимаю с этим нет проблем.
1
01 июня 2012 года
kot_
7.3K / / 20.01.2000
и что именно не устроило тебя в моем ответе? какого хера переливать из пустого в порожнее? Я не собираюсь догадываться что понимает ТС, а что нет - я ответил так, как происходит детектирование мата в большинстве шахматных программ - происходит проверка под ударом ли король, если да, то запускается процедура просчета мата. а что она возвращает - ТРУ либо пустой массив возможных переходов, либо другой признак позволяющий выполнить либо не выполнить переход - это существенно и столь важно?
Цитата:
Я предложил реализовать одну процедуру на проверку мата. Если она отрабатывает с результатом TRUE значит это мат, В противном случае был всего лиш шах.


да ты гений парниша. ты в состоянии пересказать своими словами то, что я написал в первом ответе три дня назад. Потому что я тоже предложил реализовать ОДНУ процедуру по определению мата. Не две, ни три - ОДНУ. И одну, которая проверяет под ударом ли король.
Молодец, возьми с полки пирожок. буквы на клавиатуре ты уже освоил. Теперь научись понимать написанное.

83K
03 июня 2012 года
JumperPro
4 / / 29.05.2012
Все зависит от вашего способа представление элементов на доске , если вы пользуетесь , к примеру , двумерным массивом для отображение всего того ,что происходит на доске , вернее вы отображаете на доске все то что происходит в массиве , то вам стоит придумать флаги отображения состояния полей , которые будут проверяться после каждого хода , например , можно назначить элемент массива(клетку) в которой нет никакой фигуры и которая не бьется ни одной из сторон флагом "0", клетка на которой есть фигура флагом "(название фигуры например белый Слон - B [eng .Bishop]), тоесть в итоге вы дойдете к флагам которые будут отвечать за битую клетку белыми(например - "1"), битую клетку чёрными(например - "2") и если вы будете после каждого хода переназначать флаги (соответсвенно рациональным путём) то в итоге можно будет просто проверить все возможные варианты хода Короля , елси нет таковых, тоесть все флаги соседних клеток имеют значения битого поля противоположной стороны и Король находится под Шахом , то соответсвенно - МАТ .
465
03 июня 2012 года
QWERYTY
595 / / 25.03.2012
JumperPro, зря беспокоитесь.

В первом ответе уже всё подробно расписали.
465
03 июня 2012 года
QWERYTY
595 / / 25.03.2012
Цитата: kot_

да ты гений парниша. ты в состоянии пересказать своими словами то, что я написал в первом ответе три дня назад. Потому что я тоже предложил реализовать ОДНУ процедуру по определению мата. Не две, ни три - ОДНУ. И одну, которая проверяет под ударом ли король.
Молодец, возьми с полки пирожок. буквы на клавиатуре ты уже освоил. Теперь научись понимать написанное.



Вот ты и должен был написать своими словами что ты там предполагал

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог