Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Проект №7. Описание игры с использованием ООП.docx
Скачиваний:
23
Добавлен:
11.04.2015
Размер:
223.71 Кб
Скачать

10. Программный код пункта меню «Передать очередь хода»

С помощью Инспектора объектов задайте пункту меню Передать очередь хода название NextItem и создайте метод реакции на выбор этого пункта.

void __fastcall TForm1:: NextItem Click(TObject *Sender)

{

// добавить код самостоятельно по указаниям, приведенным ниже

}

Сначала, точно так же, как и в предыдущем методе обработки броска кубика, необходимо проверить, не завершена ли игра. Затем в переменной, где хранятся набранные человеком очки, надо запомнить число очков, накопленное на текущем ходу, после чего выполнить ход программы и, как и при ходе человека, обновить экран и проверить, не закончена ли партия:

Referee.Human.Scores = Referee.Human.CurrentScores;

Referee.ComputerMove() ;

Showlnfo() ;

EndGameTest();

11. Продолжаем работать с интерфейсом программы на форме Form1.( смотри рисунок 1)

Осталось только присвоить командным кнопкам соответствующие действия, выполняемые при выборе пунктов меню.

11.1 Настраиваем командные кнопки

Действие командных кнопок настраивается следующим образом.

1. Щелчком левой кнопки мыши выберите на форме нужную кнопку.

2. В Инспекторе объектов перейдите на вкладку Events (События).

3. В строке OnClick определяется метод, который будет вызван при щелчке на этой кнопке. В раскрывающемся списке приведен набор методов, вызываемых при выборе пунктов строки меню.

4. Задаем методы.

Кнопка 1 — NewGameltemClick (Новая игра);

Кнопка 2 — GameExitltemClick (Выход);

Кнопка 3 — UseDiceltemClick (Бросить кубик);

Кнопка 4 — NextltemClick (Передать ход компьютеру).

Попутно для каждой кнопки желательно задать значение свойства Hint — всплывающей подсказки. Подсказками, например, могут быть названия соответствующих пунктов меню. Для того чтобы во время выполнения программы показывалась подсказка, надо также свойству ShowHint соответствующей кнопки задать значение true.

Наконец программа, на первый взгляд, готова. Просмотрите исходные тексты — не встретится ли где-нибудь явных опечаток и ошибок, откомпилируйте программу и запустите ее.

 

12 Программирование пользовательского интерфейса

Проверяем, все ли в порядке

После запуска программы на экране отобразится такое окно (см. рис. 7).

 

Рис. 7. Окно программы вовремя работы

Сейчас ход человека. То, что компьютер не ходил первым, понятно из того, что у него нет очков, а последней на кубике выпала не единица, а пятерка.

 

Щелкните на кнопке Бросить кубик или выберите соответствующий пункт в меню. Должно выпасть 3 — это число запишется в текущие набранные человеком очки. Бросьте кубик еще раз (опять выпадет 3), и щелкните на кнопке Передать очередь хода. В вашу общую копилку занесется 6, а компьютеру ничего не запишется — он выполнил свой ход мгновенно, но ничего не набрал, потому что у него выпала единица. Бросьте кубик (выпадет 5), потом еще раз — и тут выпадет единица, о чем программа и сообщит в диалоговом окне.

Щелкните на кнопке ОК, компьютер сделает ход и наберет 3 очка. На вашем ходу опять выпадет единица, компьютер уйдет в отрыв, набрав 8 очков, после чего на своем ходу вы выбросите 5. Попробуйте передать ход компьютеру, чтобы наверняка положить эту «пятерку» в свою копилку, и тут выяснится, что число ваших очков стало не 11 (6+5), а 5. Видимо, в программе допущена ошибка. Закройте приложение и вернитесь в редактор.

Пошаговая отладка

Выявить допущенную ошибку можно во встроенном отладчике C++Builder. С точками прерывания мы уже знакомы. С их помощью мы проверяли работу валютного калькулятора. Теперь попробуем проанализировать, как реально выполняется игровая программа.

Перезапустите программу, повторите все вышеописанные действия до момента, когда в копилке будет 6 очков, а на кубике выпадет пятерка. Теперь перейдите в редактор C++Builder и найдите там метод NextltemClickQ, который вызывается при щелчке на кнопке Передать очередь хода. Поставьте с помощью клавиши F5 точку остановки на первый оператор и вернитесь к запущенному приложению. Теперь при попытке передать ход компьютеру работа программы прервется, и зеленая стрелка укажет, какой оператор должен выполняться на следующем шагу (см. рис. 39). Можно посмотреть значения переменных Referee.Human. Scores и Referee. Human. CurrentScores, наведя на них указатель мыши — получится, соответственно, 6 и 5.

Далее выполнение программы можно продолжить в пошаговом режиме — останавливаясь после выполнения очередного оператора, точнее, всех операторов, расположенных в очередной строке, имеющей пометку круглым маркером.

Пошаговое выполнение очень удобно тем, что позволяет взглянуть на работу приложения изнутри, в динамике, непрерывно контролируя изменения любых переменных. Выполнить очередную строку, помеченную стрелкой, можно, нажав клавишу F8. Следующая строка, которая будет выполнена, выделится в редакторе синим цветом.

Если теперь проверить содержимое переменной Referee.Human.Scores, то выяснится, что в ней записано число 5 (хотя планировалось 11), которое методом Showlnfo() и будет выведено на экран.Во время нахождения в отладчике и выполнения программы по шагам переключиться на запущенное приложение нельзя, так какого выполнение приостановлено. Продолжить его работу можно только нажатием клавиши F9.

Наверное, вы уже поняли причину ошибки. Дело в том, что значение переменной Referee. Human. CurrentScores не прибавлялось к переменной Referee.Human. Scores. Происходила просто перезапись старого значения. Для правильной реализации логики работы надо операцию = заменить на операцию +=:

Referee.Human.Scores += Referee.Human.CurrentScores;

Видите, как сильно может влиять на логику работы всего один пропущенный символ? А подобные опечатки не обнаружит никакой компилятор.

Теперь отлаживаемую программу надо завершить, нажав комбинацию Ctrl+F2, затем убрать точку остановки, перекомпилировать текст и запустить приложение заново. Проверьте его работу — в нужный момент в накопленную человеком сумму запишется число 11. Так и должно быть. По клавише F8 выполняются сразу всё операторы в очередной строке. По клавише F7 происходит «вход внутрь» в очередной метод, при условий, что он, конечно, в данной строке имеется. Например, если должна выполняться строка Referee. ComputerMove();

то при нажатии на клавишу F7 отладчик перейдет к выполнению операторов метода ComputerMove(). По окончании выполнения этого метода отладчик вновь вернется обратно, в метод NextItemClick().