Цитата:
Сообщение от
miklenew
Цитата:
Сообщение от
petergunn
... надо бы спросить у игрока в диалоговой форме какую фигуру он хочет выставить на доску: слона, коня, ладью или ферзя.
Спасибо. Исправил.
Если при выборе фигуры выставляемой на доску закрыть окно выбора по
[x], то получим ошибку:
"Метод 'ChessItem.label' должен быть перекрыт.". (т.к. переменная typeFigureNew получает значение ChessTypeFigure::Empty и далее создается экземпляр класса СhessItem)
Взятие пешки на проходе
Цитата:
Сообщение от
miklenew
Цитата:
Сообщение от
petergunn
Интересный побочный эффект текущей реализации взятия пешки на проходе.
и берём конем пешку на e5.
Исправил.
Выкладываю обновление.
Classes\ChessItem\move():
X++:
...
if(typeFigure != ChessTypeFigure::Knight)
{
pawnOnMove = this.checkCutPawnOnMove(_moveTo);
if(pawnOnMove)
if (typeFigure == ChessTypeFigure::Pawn || Box::yesNo("Вы можете взять пешку на проходе. Взять?" ,DialogButton::No) == DialogButton::Yes)
if(this.cutPawnOnMove(_moveTo, pawnOnMove))
return true;
}
...
Не, тут дело не в специфике фигуры коня. При текущей реализации пример на ту же тему но уже со слоном:
1. e2-e4 d7-d6
2.Cf1-c4 e7-e5
И при попытке хода слоном с c4 на e6 получается та же картина с диалогом и взятием пешки на e5
(см. картинку во вложении).
Тут дело в порядке проверки условий взятия на проходе - Вы сначала анализируете есть ли взятие на проходе и только потом смотрите что это за фигура. По правилам взять на проходе может только пешка - поэтому условие на проверку фигуры нужно поднять выше проверки взятия на проходе.
Если не возражаете, предложу такой вариант реализации кода:
X++:
...
if( typeFigure == ChessTypeFigure::Pawn )
{
pawnOnMove = this.checkCutPawnOnMove(_moveTo);
if( pawnOnMove )
{
if( Box::yesNo("Вы можете взять пешку на проходе. Взять?" ,DialogButton::No) == DialogButton::No )
return false ;
if( this.cutPawnOnMove(_moveTo, pawnOnMove))
return true;
}
}