Показать полную графическую версию : Определение мата в шахматах?
Killer_13
27-05-2012, 13:58
Подскажите пож как можно определить мат в шахматах? А то не могу придумать как это запрограммировать.
Дошел до того, что могу определять какие клетки под ударом, чтоб король туда не мог ходить.
Могу сделать, чтоб каждый раз проверяло не находится ли король под ударом... Это все можно, но вопрос и проблема в том, что если например король под ударом и все позиции куда он может походить тоже под ударом..
Остается такая штука как.. Противник жертвует фигурой прикрывая короля и после этого у короля например открывается свободная клетка для хода...
В общем, подскажите как кто видит как можно организовать мат для противника? Игра друг против друга, без "ИИ".
Спаасибо заранее, а то мучаюсь уже долго с этой проблемой.. :(
Ну вам по сути необходимо определить следующие необходимые и достаточные критерия мата:
1. Королю шах.
2. Все соседние клетки возле короля под ударом / заняты фигурами.
3. Нельзя снять фигуру, которая организует шах. То есть нельзя туда пойти фигурой. (в.т.ч королем)
4. Нельзя закрыться от шаха. Т.е. нельзя пойти на соответсвующую линию / диагональ. Этот случай отметается, если:
1). если линий/диагоналей несколько одновременно;
2). это конь или пешка;
3). одна линия/диагональ + конь.
По реализации:
1. Опеределить клетки, которые нам интересны. Место короля, вокруг короля, линии/диагональ удара, фигура, организующая шах.
2. Можно ли осуществить ход какой-либо фигурой в интересные клетки (клетки вокруг короля рассмотреть только для короля). Если можно, то не мат.
Вроде так. Может чего и упустил.
Killer_13, проверять все возможные ходы всех фигур матуемого ( :unsure: ) короля. Если какой либо ход предотвращает бой короля, то тогда мата нет. Противник жертвует фигурой прикрывая короля и после этого у короля например открывается свободная клетка для хода... »
"Противник жертвует фигуру, прикрывая короля ИЛИ атакует фигуру объявившую шах" - это можно.
"у короля например открывается свободная клетка для хода" - это, простите, не ваше дело.
Т.е. оценивать ситуацию вперед никто не просит. Вперед паровоза бежать не надо.
Есть мат - отлично. Нет мата - болит голова у человека.
В противном случае, если компьютер будет думать за человека даже на 1 ход, это будет ИИ. Это уже противоречит условиям Игра без "ИИ". »
Т.е. еще раз. Смотрим все ходы, всех фигур, которые могут ходить (не открывая короля под бой), атаковать фигуру объявившую шах или закрывать короля + ходы короля, на безопасные клетки. Все, больше ничего не требуется. Никаких "думалок" вперед и пр.
Killer_13
27-05-2012, 14:41
Много полезной информации, нужно переварить...
Я почему еще задал вопрос.. Я не знаю как заканчивать игру..
Имеется ввиду например, проиграл такой-то игрок. А Такое нельзя писать исходя только из того, что король под ударом и ему некуда походить..
Т.е. еще раз. Смотрим все ходы, всех фигур, которые могут ходить (не открывая короля под бой), атаковать фигуру объявившую шах или закрывать короля + ходы короля, на безопасные клетки. » - осталось все это организовать в своем алгоритме..
Спасибо, теперь есть почва для размышлений. :)
Спасибо, теперь есть почва для размышлений. »
На здоровье! :)
Программой потом поделитесь? (желательно в исходниках, исключительно для личного пользования)
Killer_13
27-05-2012, 14:53
Программой потом поделитесь? (желательно в исходниках, исключительно для личного пользования) - могу, мне не жалко.
Просто пока писалась локальная игра - код был читабельный, и менее более правильно запрограммирован - тоисть логика отделена от вьюва и так д..
Когда начал писать сетевой вариант началась каша.. как бы все работает.. но мне не нравится мой кашеварный код.. :( Сервер организовывал с помощью RPC. Но опять же чтоб моментально прослушивать ход или чат, таймер стучит серверу каждую секунду. Ну короч... много разного.. которое я бы имплементировал по другому, если было б время и... так д...
могу, мне не жалко. »Очень будет интересно посмотреть на исходник.
Возможно его тут и "вылижут" до блеска.
Я сам не такой большеголовый сишник (наверно у вас написано на С), как lxa85, Iska, .... и многие другие,
Просто всегда есть интерес, каким образом складывается алгоритм у разных людей в окончательный, пусть и не доведёный до блеска эрзац
Killer_13
27-05-2012, 16:28
Очень будет интересно посмотреть на исходник. » - чтоб мне стыдно стало? :(
Возможно его тут и "вылижут" до блеска. » - не сомневаюсь, но мне свои мозги шевелить нужно. :)
Я сам не такой большеголовый сишник (наверно у вас написано на С), как lxa85, Iska, .... и многие другие, » - а разве я говорил что это "С"? :) Это Java со свинговским интерфейсом, игрой по сети. чатом, историей и так д...
Просто всегда есть интерес, каким образом складывается алгоритм у разных людей в окончательный, пусть и не доведёный до блеска эрзац » - у меня например много лишнего кода.. Есть поле для рефакторинга, но опять же.. все упирается во время..
чтоб мне стыдно стало? »Ну зачем так. Ни в коем случае.
но мне свои мозги шевелить нужно. »Если будет пример и облизаный - тогда и будете шевелить мозгами - почему так, а не иначе :)а разве я говорил что это "С"? »Нет, не говорили. Что это будет на Java со свинговским интерфейсом, игрой по сети. чатом, историей и так д... »просто не ожидал.
у меня например много лишнего кода.. »Вот и посмотрите на "полный минимализм" кода, если кто-то и ребят возьмётся для спортивного и общего интереса :)
yurfed, справедливости ради токмо, скажу, что я давно уже не C-шник — в том плане, что мои познания в С устарели лет на пятнадцать-двадцать как минимум. Я остановился в программировании на C где-то на рубеже «закат эры DOS/Windows 3.1». По повсеместному распространению C++ прочёл несколько книг, дабы хоть иметь некоторое представление о базовых принципах, писать же на нём и вовсе ничего не писал. С C# знаком и вовсе понаслышке.
Так что, мой нынешний уровень — худо-бедно могу прочесть не специфический код, понять о чём он, попытаться определить причину конкретного поведения приложения (http://forum.script-coding.com/viewtopic.php?pid=14177#p14177). Но не более.
Killer_13
27-05-2012, 17:23
просто не ожидал. » - почему? :)
Вот и посмотрите на "полный минимализм" кода, если кто-то и ребят возьмётся для спортивного и общего интереса » - да боюсь, что кто посмотрит на код, тот и скажет - лучше заново написать... :)
yurfed, я тебя тоже попрошу в приличном обществе не выражаться :) Я "паскалевик", в лучшем случае "дельфишник". Недавно писал "на коленке" код под бейсик. С++ я в лучшем случае - читаю, пытаюсь понять принцип работы.
Сишники у нас pav, ferget, Admiral, Delirium, Drongo.
P.S. Главное чтобы они мне теперь "вычитку" не сделали :)
Вот и посмотрите на "полный минимализм" кода, если кто-то и ребят возьмётся для спортивного и общего интереса »
Я, честно сказать, хотел "из общего интереса" студентам сплавить, как задачу. Т.е. у меня исходный эталон (какой есть) у них его подобие.
Я тоже ожидал C++, не Java. С последней не успел подружиться. Будет повод :)
Iska, lxa85, ну чё наехали :) Откуда я знаю кто из вас любит розовый, а кто голубой. Отстаньте противные, я не хотел этого :).
Просто первые имена на вскидку...
Killer_13
27-05-2012, 18:27
Если вы не утратили интерес к исходникам, то напомните через недельки 3. К тому времени должен доработать..
Killer_13
27-05-2012, 23:04
Значит так, добился пока этого, прошу поправить если что пропустил...
1. Если 2 шаха, то мат! Тоисть если король атакован двумя фигурами и ему некуда бежать.(сделал).
2. Если шах с одной фигуры и фигуру нельзя побить остается только подложить на пути атакующей фигуры другую фигуру. Правильно?
3. Если фигуру нельзя побить и на пути нельзя ничего поставить и королю некуда бежать, то мат!
Еще варианты к определению мата в дополнение? Мыслей уже много прочитал, теперь стараюсь отобразить в коде, какие еще ситуации??
Еще бы придумать как "пат" определять...
Всем спасибо!
2. Если шах с одной фигуры и фигуру нельзя побить остается только подложить на пути атакующей фигуры другую фигуру. Правильно? »
Нет. Я могу закрыться допустим пешкой, прикрытой в свою очередь конем или другой фигурой.
Мат (шахматы) (http://ru.wikipedia.org/wiki/Мат_(шахматы))
CyberDaemon
27-05-2012, 23:25
Я почему еще задал вопрос.. Я не знаю как заканчивать игру.. »
Вспомнилось.
Играл я во времена 8088 CGA и DOSа с компом в шахматы.
У получилось у меня загнать эту электронную башку в мат. Только кремниевоголовый нимало не смутился, что его королю мат, и сделал ответный ход.
Я сожрал ему короля :)
Комп продолжил играть без этой никчемной фигуры, а у меня стали внезапно пропадать фигуры с доски - похоже, призрак короля их ел :lol:
Killer_13
27-05-2012, 23:28
Пока что остается реализовать только этот пункт, все остальное готово...
У игрока нет возможности закрыться от шаха другой фигурой; - нужно пошевелить.. как это сделать...
Нет. Я могу закрыться допустим пешкой, прикрытой в свою очередь конем или другой фигурой. » - так это уже просчет в 2 хода..
Вспомнилось.
Играл я во времена 8088 CGA и DOSа с компом в шахматы.
У получилось у меня загнать эту электронную башку в мат. Только кремниевоголовый нимало не смутился, что его королю мат, и сделал ответный ход.
Я сожрал ему короля
Комп продолжил играть без этой никчемной фигуры, а у меня стали внезапно пропадать фигуры с доски - похоже, призрак короля их ел » - вот-вот.. :)
Killer_13, а элементарно, условие на битое поле нет возможности пойти королём ни как?
- так это уже просчет в 2 хода.. »
Нет. Читай внимательно.
Если шах с одной фигуры и фигуру нельзя побить остается только подложить на пути атакующей фигуры другую фигуру. Правильно? »
Нет. Я могу закрыться допустим пешкой, прикрытой в свою очередь конем или другой фигурой. »
Например развитие начальной позиции.
1: e4, f6. 2: Ф h5+
По твоей версии - мат. Шах с одной фигуры и фигуру нельзя побить остается только подложить на пути атакующей фигуры другую фигуру.
По моей версии - g6. Прикрыта она, не прикрыта - дело пятое. Я могу вскрыть линию жертвуя фигурой.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC