- •Ход работы:
- •7.1 Описание классов.
- •7.2 Определяем первый класс Кубик - tDice
- •7.3 Описание метода для объекта Кубик, имитирующий его бросок.
- •7.4. Описываем класс Игрок
- •7.6 Описание Конструктора tPlayer
- •7.7 Описание класса судьи tReferee
- •7.7.1. Алгоритм реализация метода NewGameQ в файле Game.Cpp (смотри рисунок 5)
- •7.7.3 Метод GameFinish() дает информацию окончена ли игра или нет.
- •8. Продолжаем работать с интерфейсом программы на форме Form1.( смотри рисунок 1)
- •Событие «Новая игра»
- •8.2 Новая игра: описание методов ShowInfo(),EndGameTest().
- •8.2.1. Описание метода ShowInfo()
- •8.2.2 Текстовые константы , новый пользовательский файл Text.H
- •8.2.3. Конструктор класса tForm1
- •8.2.4. Проверка завершения текущей партии метод EndGameTest().
- •9. Программный код пункта меню «Новая Игра»
- •2.— А что делать, если партия продолжается?
- •10. Программный код пункта меню «Бросить кубик»
- •10. Программный код пункта меню «Передать очередь хода»
- •11. Продолжаем работать с интерфейсом программы на форме Form1.( смотри рисунок 1)
- •11.1 Настраиваем командные кнопки
- •12 Программирование пользовательского интерфейса
- •13. Случайная генерация
8.2.3. Конструктор класса tForm1
Чтобы программа при запуске исходно сразу была готова к игре, неплохо также вызвать методы Referee.NewGame() и ShowInfo() один раз где-то в самом начале работы. Лучше всего это сделать в конструкторе класса TForm1 — этот конструктор уже сгенерирован автоматически, и в его пока пустое содержимое надо только вписать два оператора:
_fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
{
Referee.NewGame() ;
ShowInfo() ;
}
8.2.4. Проверка завершения текущей партии метод 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()
{
// заполнить самостоятельно в соответствии с приведенным выше алгоритмом, и подробным его //описанием
}