Нужен алгоритм определния мата

Discussion in 'Машинное отделение' started by Vital72, 9 Feb 2008.

  1. Vital72
    Оффлайн

    Vital72 Учаcтник

    Репутация:
    0
    Всем привет!
    Программа без интеллекта, только управляет игрой, играют два человека, нужно определить окончание партии. Пока у меня только такая мысль: проверить возможность перемещения короля и возможность перекрыть/съесть атакующую фигуру, но похоже, будет много проверок.
    Полагаю, есть более оптимальные алгоритмы, хотел бы услышать ваше мнение.
     
  2. WildCat
    Оффлайн

    WildCat Коршунов Игорь Staff Member

    Репутация:
    0
    Такая программа по-любому должна уметь определять легальность ходов. Тогда мат определяется просто - нет легальных ходов и король под шахом.
     
  3. Vital72
    Оффлайн

    Vital72 Учаcтник

    Репутация:
    0
    Программа определяет легальность ходов, но не будем же мы перебирать все возможные ходы, чтоб проверить их легальность? Это будет еще затратней, чем я предложил.
     
  4. WildCat
    Оффлайн

    WildCat Коршунов Игорь Staff Member

    Репутация:
    0
    Неужели это затратно?
     
  5. Vital72
    Оффлайн

    Vital72 Учаcтник

    Репутация:
    0
    Если я вас правильно понял, вы предлагаете следующий алгоритм:
    брать свою фигуру и ставить ее на следующую легальную клетку и проверять, стоит ли король под шахом, и так все клетки, потом брать следущую фигуру и так - пока не пройдем по всем фигурам.
    Вы это предлагаете? Поправьте, если я ошибся.

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

    дуп Учаcтник

    Репутация:
    0
    Интересная у Вас программа. А что, проверять каждый сделанный человеком ход ей не надо ?
     
  7. WildCat
    Оффлайн

    WildCat Коршунов Игорь Staff Member

    Репутация:
    0
    Я предложил вариант, чтобы почти не писать нового кода.
    Сначала объясни для чего нужны производительные алгоритмы в данном случае.
     
  8. Vital72
    Оффлайн

    Vital72 Учаcтник

    Репутация:
    0
    Я не понял ваш вопрос.
    Ходы на корректность проверяются, но проверить ход и определить мат - совсем не одно и тоже. Программа, конечно, не даст сделать ход, если стоит мат, но она и не знает, что ходов то больше нет, вот это я и пытаюсь определить программно.
     
  9. Vital72
    Оффлайн

    Vital72 Учаcтник

    Репутация:
    0
    Это мой стиль, я не могу без этого))
     
  10. дуп
    Оффлайн

    дуп Учаcтник

    Репутация:
    0
    Тогда я тоже не понимаю, чем не устраивает вас собственный алгоритм или прдложенный WC. Не все ли равно, на сколько миллисекунд раньше\позже будет определен мат.
     
  11. Vital72
    Оффлайн

    Vital72 Учаcтник

    Репутация:
    0
    Люблю быстрые алгоритмы, иначе не вижу смысла писать программы вообще.
     
  12. Vital72
    Оффлайн

    Vital72 Учаcтник

    Репутация:
    0
    Что то обсуждение перешло не в ту плоскость, мне бы все таки хотелось услышать предложения иного алгоритма, чем предложенные здесь.
     
  13. WildCat
    Оффлайн

    WildCat Коршунов Игорь Staff Member

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

    Алексей Н. Алексей

    Репутация:
    0
    Vital72, вообще то игра заканчивается еще в случае пата, троекратного повторения позиции, по правилу 50 ходов (с учетом исключений). Вашему алгоритму что, проверять все это не нужно?
     
  15. Vital72
    Оффлайн

    Vital72 Учаcтник

    Репутация:
    0
    Честно говоря, я не понял о чем вы. Я не спец по шахматам и что такое "правило 50 ходов" не знаю. Если вы мне скажете, где в моем алгоритме недоработка, буду признателен.
     
  16. Алексей Н.
    Оффлайн

    Алексей Н. Алексей

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

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

    2) Произошло трехкратное повторение одной и той же позиции (с сохранением очередности хода и возможности/невозможности рокировки).

    3) Сделано 50 ходов подряд без взятий и продвижений пешек (правило 50 ходов).

    Из последнего правила есть список исключений, когда доказано, что выигрыш одной из сторон достигается, но для этого требуется больше 50 ходов. Но исключения это, конечно, уже экзотика, в первом приближении можно обходиться и без них. А вот все три основых ничейных правила постоянно употребляются на практике.
     
  17. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    Нет никакого списка исключений.
     
  18. Vital72
    Оффлайн

    Vital72 Учаcтник

    Репутация:
    0
    Меня такие тонкости не интересуют, мне нужен только один момент - определение мата, все остальное - только не в тему.
     
  19. Алексей Н.
    Оффлайн

    Алексей Н. Алексей

    Репутация:
    0
    Извиняюсь. Их, оказывается, полностью отменили, а я не знал.
     
  20. Алексей Н.
    Оффлайн

    Алексей Н. Алексей

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

    дуп Учаcтник

    Репутация:
    0
    Пат то у Вас сделан ? Мат это вроде тоже самое + король под шахом.
     
  22. Vital72
    Оффлайн

    Vital72 Учаcтник

    Репутация:
    0
    Все правильно, т.к. играют только люди, в конце концов они до чего то договорятся, но если ход невозможен, мне надо, чтоб программа об этом знала
     
  23. Vital72
    Оффлайн

    Vital72 Учаcтник

    Репутация:
    0
    Пат не сделан, но думаю, проблем сделать, имея алгоритм с матом, это не составит
     
  24. kostik
    Оффлайн

    kostik Учаcтник

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

    дуп Учаcтник

    Репутация:
    0
    А что написано на кнопочке и какого она цвета ?
     
  26. WinPooh
    Оффлайн

    WinPooh В.М. Staff Member

    Репутация:
    95
    Откуда это известно, вы смотрели код сервера?
     
  27. kostik
    Оффлайн

    kostik Учаcтник

    Репутация:
    0
    Опредeлил логически.

    А кнопочка была, мне кажется, зеленая.
     
  28. дуп
    Оффлайн

    дуп Учаcтник

    Репутация:
    0
    Да пошутил я про кнопочку, извините.
    А "логически" это определить невозможно. Вы же не видите, как пользователь, "изнанки".
     
  29. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    Сервер устает каждый раз перебирать ходы?
     
  30. kostik
    Оффлайн

    kostik Учаcтник

    Репутация:
    0
    Мало ли... Я вот своих кишков тоже ни разу не видел еще, однако берусь утверждать, что они у меня есть. С вероятностью этак в 99,9%..


    Лошади устают. Серверу, при нескольких тысячах пользователей играющих одновременно, могут просто выйти ресурсы. Вот так взять, и выйти...
     
  31. Mustitz
    Оффлайн

    Mustitz баннер

    Репутация:
    36
    Движок на моей машине смотрит 0.5 мегапозиций/секунду. Это с функциями оценки позиции. Определения мата требует перебор допустим на два полухода (ход черных/ответ). Что примерно 40^2 = 1600. Итого получаем возможность обработать 300 ходов в секунду.
     
  32. Серый
    Оффлайн

    Серый Сергей

    Репутация:
    1
    4)Если на доске возникло такое соотношение материала, при котором невозможно объявить мат ни одной из сторон. Отличается от п.3 :)
     
  33. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    А проверять легальность/результат партии на клиенте слабо?
     
  34. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    Для проверки мата нужно сгенерировать все ходы, и для каждого проверить легальность. То есть 1 генерация ходов, 40 исполнений, 40 проверок не бод боем ли король, и одна проверка не под боем ли король на входе.
     
  35. Mustitz
    Оффлайн

    Mustitz баннер

    Репутация:
    36
    Ничья еще фиксируется в случае просрочки времени одним из участников, когда нет кооперативного мата.