Показать сообщение отдельно
Старый 30.12.2008, 10:24   #30  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
SP4 (29.12.2008)
Цитата:
Сообщение от 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;
        }
    }
Миниатюры
Нажмите на изображение для увеличения
Название: chess_bishop.JPG
Просмотров: 533
Размер:	51.8 Кб
ID:	4121