Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Проверка завершения текущей партии метод EndGameTest().






Подобную проверку удобно выделить в отдельный метод — назовем его EndGameTest(). Описание этого метода класса в виде строки void EndGameTest(); добавить в описание класса TForm1 в файле DiceUnit.h лучше разместить рядом с описанием метода Showlnfo().

В методе EndGameTest() с помощью метода GameFinish() класса TReferee будет выполняться проверка, не завершена ли текущая партия, и если да, то будет вызвано диалоговое окно с сообщением о том, победил человек или проиграл. Метод должен также добавить в список TotalScores новую строку, информирующую об итоговом счете.

В конец файла DiceUnit.cppдобавить самостоятельно заготовку:

void TForm1:: EndGameTest()

{

 

 

}

Проверку на окончание партии можно выполнить условным оператором:

if(Referee.GameFinish()){…}; Метод GameFinishO сразу возвращает логическое значение типа bool — именно то, что и требуется условному оператору.За оператором if следует логический блок, заключенный в фигурные скобки. В начале этого блока надо определить временную переменную типа AnsiString:

AnsiString s; //которая потребуется для хранения строк, предназначенных для вывода на экран. Так как внутри нового блока известно, что один из игроков одержал победу, надо выяснить, кто это был конкретно. В этом опять поможет условный оператор:

if(Referee.Human.Scores> = GAME_FINISH_SCORE) {…}; else {….};

Сначала проверяются набранные очки человека. Если они больше или равны 100, то в переменную s заносится строка о победе человека (ее надо описать в файле Text.h:

const AnsiString HUMAN_WON_STR = " Победилчеловек";

в противном случае — строка, сообщающая о поражении:

const AnsiString COMPUTER_WON_STR = " Победилкомпьютер";

Здесь же следует увеличить на единицу счетчик числа побед для соответствующего игрока (Human или Computer).

 

if(Referee.Human.Scores> = GAME_FINISH_SCORE)

{

Referee.Human.WinNum += 1;

s = HUMAN_WON_STR;

} else

{

Referee. Computer.WinNum ++;

s = COMPUTER_WON_STR;

}

После выполнения расширенного условного оператора в переменной s будет храниться строка с сообщением о том, выиграл человек или проиграл. Теперь эту строку надо вывести на экран в диалоговом окне: ShowMessage(s);

Далее информацию о победе и текущий счет необходимо добавить в список TotalScores. Для формирования такого сообщения к содержимому переменной s через пробел справа надо приписать соотношение побед, например, " 8: 5". Получить текстовые представления соответствующих переменных WinNum можно с помощью стандартной функции IntToStr(), а добавить пробел и двоеточие — используя уже упоминавшуюся операцию сцепления строк:

s = s + " " + IntToStr(Referee.Human.WinNum) + ": " + IntToStr(Referee.Computer.WinNum);

 

Элемент управления TotalScores состоит из строк. Исходно список пуст. Но в классе TListBox визуального компонента ListBox нет метода добавления новой строки. В нем содержатся лишь базовые методы, общие для всех компонентов, своим поведением в той или иной степени напоминающие работу списков.

Доступ к содержимому списка, представленному набором строк, осуществляется через свойство Items (Элементы) класса TListBox. Это свойство имеет тип TStrings (специальный класс, предназначенный для работы со списками строк). А уже в этом классе есть метод Add() (Добавить). С помощью метода Add() мы и включим новую текстовую строку (типа AnsiString) в конец списка.Список TotalScores и свойство Items доступны, как и другие стандартные объекты C++Builder, через указатели: TotalScores-> Items-> Add(s);

С помощью этого оператора в конец списка TotalScores будет добавлена новая строка s.

Текстметода void TForm1:: EndGameTest()

{

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

}

9. Программный код пункта меню «Новая Игра»

Соответствующий пункт меню в Инспекторе объектов можно назвать NewGameItem. Для него надо вышеописанным способом создать метод реакции (он автоматически получит название NewGameltemClick())

void __fastcall TForm1:: NewGameItemClick(TObject *Sender)

{

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

}

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

// Проверяем, закончена ли партия:

if(Referee.GameFinish())

{

Referee-NewGame(); // Если да, то начинаем новую игру:

ShowInfo(); // и выводим на экран начальную информацию

}

2.— А что делать, если партия продолжается?

— Программа всегда должна в подобных случаях реагировать на действия человека, сообщая ему хотя бы минимальную информацию. Поэтому, используя расширенный вариант условного оператора, с помощью ключевого слова else добавим вызов диалогового окна с кратким напоминанием о том, что игра не завершена. Это напоминание надо определить как константу в файле Text.h:

const AnsiString GAME_NOT_FINISHED_STR = " Партиянезакончена";

А альтернативная часть условного оператора запишется так:

else

ShowMessage(GAME_NOT_FINISHED_STR);

10. Программный код пункта меню «Бросить кубик»

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

 

С помощью Инспектора объектов задайте пункту меню Бросить кубик название UseDiceltem и создайте метод реакции на выбор этого пункта. ОнполучитназваниеUseDiceItemClick().

void __fastcall TForm1:: UseDiceItemClick(TObject *Sender)

{

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

}

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

if(Referee.GameFinish()){

ShowMessage(GAME_FINISHED_STR);






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.