#prolog #chess
Вопрос:
Я играю в шахматы с ИИ в прологе, используя алгоритм min-max с альфа-бета-обрезкой, и я застрял в проблеме с движением моей ладьи. вот как я писал эти ходы до сих пор:
%%rook possible moves: movement(Board,piece(Color, rook, Col, Row), piece(Color, rook, NewCol, Row)) :- between(0, Col, DeltaCol), dif(DeltaCol, 0), NewCol is Col - DeltaCol, in_boundaries(NewCol,Row), nonmember(piece(Color,_,NewCol,Row),Board); ( enemy(Color,OppColor), member(piece(OppColor,_,NewCol,Row),Board)). movement(Board,piece(Color, rook, Col, Row), piece(Color, rook, NewCol, Row)) :- between(0, Col, DeltaCol), dif(DeltaCol, 0), NewCol is Col DeltaCol, in_boundaries(NewCol,Row), nonmember(piece(Color,_,NewCol,Row),Board); ( enemy(Color,OppColor), member(piece(OppColor,_,NewCol,Row),Board)). movement(Board,piece(Color, rook, Col, Row), piece(Color, rook, Col, NewRow)) :- between(0, Row, DeltaRow), dif(DeltaRow, 0), NewRow is Row - DeltaRow, in_boundaries(Col,NewRow), nonmember(piece(Color,_,Col,NewRow),Board); ( enemy(Color,OppColor), member(piece(OppColor,_,Col,NewRow),Board)). movement(Board,piece(Color, rook, Col, Row), piece(Color, rook, Col, NewRow)) :- between(0, Row, DeltaRow), dif(DeltaRow, 0), NewRow is Row DeltaRow, in_boundaries(Col,NewRow), nonmember(piece(Color,_,Col,NewRow),Board); ( enemy(Color,OppColor), member(piece(OppColor,_,Col,NewRow),Board)).
и все идет не так, как планировалось, главная проблема для меня заключается в том, чтобы установить новые вертикальные и горизонтальные границы для ладьи в случае, если в той же строке есть другая фигура, например, посмотрите на эту вертикальную доску: (,,Q,, R,,_, P).
Q = Королева, R= Ладья. P= Позиция пешки Q равна (3,1) (столбец 3, Строка 1), значение R равно (5,1) (Столбец 5,Строка 1), а позиция пешки равна (8,1) (столбец 8,строка 1).
для примера предположим, что ферзь черная, ладья и пешка белые, и я хочу вернуть возможные ходы ладьи, которые:(3,1)(4,1)(6,1)(7,1) как бы я это сделал? это не работает с тем, как я это написал.