Комментарии 7
def check_shah
шах = check, а у вас сейчас функция проверки персидского короля.. на что? )
Я в своем проекте делал что-то подобное, и пришел к выводу что нельзя рассматривать фигуры с отрывом от позиции на доске. Вы кстати на этом же попались когда делали рокировку и взятие на проходе. В итоге (сугубо мое мнение) получилось некрасиво - помесь одного с другим. Т.е. Вы сначала делаете проверку на возможность хода фигуры, потом выделяете короля в отдельную сущность, потом выделяете пешку в отдельную сущность и... Вот это и некрасиво.
Далее. Вы проверяете только пат. Но в шахматах есть кроме пата еще правила на ничью - трехкратное повторение позиции, недостаточно материала для мата, правило 50 ходов. И если последнее правило Вы можете обойти если не пишите партию, то два остальных как обойти? Это полноценные правила которые Вы игнорируете, а ведь они эквивалентны пату.
Еще про рокировку. Либо я недоглядел, но где проверка того ходила фигура или нет? Ведь это тоже запрет рокировки.
Из рекомендаций. Я бы посоветовал хранить FEN позицию, тогда проверка возможности рокировки и взятие на проходе упрощается резко и в разы.
Да, рокировка и взятие на проходе, действительно, оформлены не очень красиво, признаю.
На счёт условий для ничьи Вы правы. Я поленился их добавлять, расчитывая на то, что игроки договорятся сами
А на счёт условия для рокировки о котором Вы написали, оно есть. У каждой фигуры есть параметр already_moved. Он проверяется для ладьи и короля.
А так, спасибо за критику, попытаюсь добавить то, о чём вы написали когда появятся силы.
Легче сразу работать по FEN-записи на самом деле. Я у себя ее просто загружаю и разбираю по свойствам внутри объекта "Шахматная доска". Просто нельзя рассматривать фигуры в отрыве от доски, это единое целое именно из-за рокировки и взятия на проходе, увы. И всякие примеры типа "наследования" в шахматной реальности не работают :-) потому что без доски - толку ноль.
Кстати, если хотите увидеть интересный код, посмотрите реализацию cm-chessboard на js.
Шахматы на pygame: дубль два