Практикум прикладного программирования на MFC и C++ в среде VS.NET

Игра в кубик

Разбить на страницы
Показывать лекцию целиком

Реализация в IDE C++Builder 6

Файлы к данной лабораторной работе, Вы можете скачать здесь.

В задание на выполнение входит самостоятельное построение демонстрационного приложения в IDE C++Builder 6.0 игры в кубик

Файл точки входа приложения PlayDice.cpp

Файл точки входа приложения PlayDice.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
USEFORM("Interface.cpp", MainForm);
USEFORM("UAbout.cpp", AboutBox);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        try
        {
                 Application->Initialize();
                 Application->CreateForm(__classid(TMainForm), MainForm);
                 Application->CreateForm(__classid(TAboutBox), AboutBox);
                 Application->Run();
        }
        catch (Exception exception)
        {
                 Application->ShowException(exception);
        }
        return 0;
}
//---------------------------------------------------------------------------

Файл объявления интерфейса пользователя - Interface.h

Файл объявления интерфейса пользователя - Interface.h
//  Файл Interface.h
//---------------------------------------------------------------------------
  
#ifndef InterfaceH
#define InterfaceH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Buttons.hpp>
#include <ComCtrls.hpp>
#include <ExtCtrls.hpp>
#include <Menus.hpp>
#include <ToolWin.hpp>
  
#include "Game.h" // Подключение объявлений
#include <jpeg.hpp>
//---------------------------------------------------------------------------
class TMainForm : public TForm
{
__published:  // IDE-managed Components
// Объявления интерфейса
        TGroupBox *PlayerGroupBox;
        TLabel *L3;
        TLabel *L2;
        TEdit *PlayerCurrentScores;
        TEdit *PlayerSumScores;
        TGroupBox *PartnerGroupBox;
        TLabel *L6;
        TLabel *L5;
        TEdit *PartnerCurrentScores;
        TEdit *PartnerSumScores;
        TGroupBox *DiceGroupBox;
        TImage *Image;
        TMainMenu *MainMenu;
        TMenuItem *N1;
        TMenuItem *N2;
        TMenuItem *NewGameItem;
        TMenuItem *GameExitItem;
        TMenuItem *N3;
        TMenuItem *UseDiceItem;
        TMenuItem *NextItem;
        TToolBar *ToolBar;
        TSpeedButton *NewGameItemBtn; //phonerng.bmp
        TSpeedButton *GameExitItemBtn;//dooropen.bmp
        TSpeedButton *StepItemBtn;    //arrow3r.bmp
        TPanel *PanelInfo;
        TLabel *PlayCount;
        TLabel *Balance;
        TLabel *L1;
        TEdit *PlayerVictoryCount;
        TEdit *PartnerVictoryCount;
        TButton *PlayerStep;
        TButton *PartnerStep;
        TLabel *L4;
        TLabel *ActivePlayer;
        TLabel *Label1;
        TButton *Step;
        TButton *Button1;
        TButton *PartyBtn;
        TLabel *GameFinishScores;
        TButton *ClearImageBtn;
        TPopupMenu *PopupMenu;
        TMenuItem *About;
        void __fastcall GameExitItemClick(TObject *Sender);
        void __fastcall PartnerStepClick(TObject *Sender);
        void __fastcall NewGameItemBtnClick(TObject *Sender);
        void __fastcall StepClick(TObject *Sender);
        void __fastcall PartyBtnClick(TObject *Sender);
        void __fastcall ClearImageBtnClick(TObject *Sender);
        void __fastcall FormClose(TObject *Sender, TCloseAction Action);
        void __fastcall AboutClick(TObject *Sender);
private:  // User declarations
        TReferee Referee; // Включаемый объект Судья
/*
        TMessage message;
          Не нужно, т.к. не используем
        явный вызов функции обработки нашего
        сообщения ShowInfo(message);
*/
        TJPEGImage *diceImage; // Для контейнера Jpg-файла
        TPlayer *ptrMember;
        void ShowInfo(TMessage );// Объявление обработчика сообщения
        void ShowDice(); // Вводится для модульности кода
public:    // User declarations
        __fastcall TMainForm(TComponent* Owner);// Объявление конструктора
        BEGIN_MESSAGE_MAP // Карта сообщений программиста
          MESSAGE_HANDLER(MY_SHOW, TMessage, ShowInfo)
        END_MESSAGE_MAP(TForm)
};
//---------------------------------------------------------------------------
extern PACKAGE TMainForm *MainForm;
//---------------------------------------------------------------------------
#endif

Файл реализации интерфейса пользователя - Interface.cpp

Файл реализации интерфейса пользователя - Interface.cpp
// Файл Interface.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Interface.h"
#include "UAbout.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

// Одну закомментировать
#define PATH "Pictures\\"
//#define PATH ""

TMainForm *MainForm;
//---------------------------------------------------------------------------
// Конструктор Приложения
__fastcall TMainForm::TMainForm(TComponent* Owner)
        : TForm(Owner)
{
 diceImage = new TJPEGImage(); // Перед Referee.NewGame()
 if(!diceImage){//Проверка удачного выделения памяти
   ShowMessage("Не могу создать объект под изображение кубика!");
   Close();
 }
// Image->Picture = (TPicture *) diceImage;
 Referee.NewGame();
// Обнулить кубик
 diceImage->LoadFromFile(AnsiString(PATH) + "0.jpg");
 Image->Picture = (TPicture *) diceImage;
}
//---------------------------------------------------------------------------

// Выполняет функции деструктора при завершении приложения
void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction Action)
{
 if(diceImage){ // Безопасная технология освобождения указателя
   delete diceImage;
   diceImage = NULL; // При завершении приложения излишне
 }
}
//---------------------------------------------------------------------------

// Выход
void __fastcall TMainForm::GameExitItemClick(TObject *Sender)

{
// Close();
 Perform(WM_CLOSE, 0, 0); // По стандартному Сообщению
}
//---------------------------------------------------------------------------

// Выводит информацию о состоянии игры
void TMainForm::ShowInfo(TMessage a)
{
// Переключение интерфейса игрока
 if(Referee.GetActiveMember() == PLAYER){
   ActivePlayer->Caption = "Бросает Игрок";
   PlayerGroupBox->Enabled = true;
   PartnerGroupBox->Enabled = false;
   PlayerGroupBox->Font->Style =
                   TFontStyles()<< fsBold;
   PartnerGroupBox->Font->Style = TFontStyles();
 }
 else{
   ActivePlayer->Caption = "Бросает Партнер";
   PartnerGroupBox->Enabled = true;
   PlayerGroupBox->Enabled = false;
   PartnerGroupBox->Font->Style = TFontStyles()<< fsBold;
   PlayerGroupBox->Font->Style = TFontStyles();
 }
 
 PlayerCurrentScores->Text = IntToStr(Referee.Player.GetCurrentScores());
 PlayerSumScores->Text = IntToStr(Referee.Player.GetSumScores());
 PartnerCurrentScores->Text = IntToStr(Referee.Partner.GetCurrentScores());
 PartnerSumScores->Text = IntToStr(Referee.Partner.GetSumScores());
 PlayCount->Caption = IntToStr(Referee.GetPlayCount());
 ShowDice();
 PlayerVictoryCount->Text = IntToStr(Referee.Player.GetVictoryCount());
 PartnerVictoryCount->Text = IntToStr(Referee.Partner.GetVictoryCount());
// Balance->Caption = "Счет  " + PlayerVictoryCount->Text
//                    + " : "  + PartnerVictoryCount->Text;
 Balance->Caption = "Счет  " + IntToStr(Referee.Player.GetVictoryCount())
                    + " : " + IntToStr(Referee.Partner.GetVictoryCount());
 GameFinishScores->Caption = "Партия до "
                              + IntToStr(GAME_FINISH_SCORES);                      
}
//---------------------------------------------------------------------------

// Выводит графический рисунок сторон кубика
void TMainForm::ShowDice()
{
 AnsiString fileName = PATH;
 fileName += IntToStr(Referee.Dice.GetDiceValue());
 fileName += ".jpg";
 try{ // Обработка исключений
   // Image->Picture->LoadFromFile(fileName);
   diceImage->LoadFromFile(fileName);
// Явное преобразование типа указателя
   Image->Picture = (TPicture *) diceImage;
 }
 catch(...){//Хоть и один оператор, фигурные скобки обязательны
   ShowMessage("Не могу найти изображение кубика - файл " + fileName);
 }
}
//---------------------------------------------------------------------------

// Обрабатывает команду передачи хода
void __fastcall TMainForm::PartnerStepClick(TObject *Sender)
{
 Referee.Move();
// Обнулить кубик
 diceImage->LoadFromFile(AnsiString(PATH) + "0.jpg");
 Image->Picture = (TPicture *) diceImage;
}
//---------------------------------------------------------------------------

// Новая игра
void __fastcall TMainForm::NewGameItemBtnClick(TObject *Sender)
{
 Referee.NewGame();
// Обнулить кубик
 diceImage->LoadFromFile(AnsiString(PATH) + "0.jpg");
 Image->Picture = (TPicture *) diceImage;
}
//---------------------------------------------------------------------------

// Ход бросанием кубика
void __fastcall TMainForm::StepClick(TObject *Sender)
{
// Создадим указатель на текущего игрока
 TPlayer *ptrMember; // Локальная адресная переменная
// Передается указателю адрес активного игрока
 if(Referee.GetActiveMember() == PLAYER)
   ptrMember = Referee.Player;
 else
   ptrMember = Referee.Partner;

 TMainForm::ptrMember = ptrMember;// Адресная переменная  области
                                 // видимости содержащего класса
 Referee.Dice.Action();//судья бросается кубик
 if(Referee.Dice.GetDiceValue() == 1){// Неудачный ход
   ptrMember->AddCurrentScores(-ptrMember->GetCurrentScores());
   Referee.Move();
   return;
 }
// Ход активного игрока удачный - увеличить текущие очки
 ptrMember->AddCurrentScores(Referee.Dice.GetDiceValue());
/*
 Заменено введением указателя ptrMember
 if(Referee.GetActiveMember() == PLAYER)
   Referee.Player.AddCurrentScores(Referee.Dice.GetDiceValue());
 else
   Referee.Partner.AddCurrentScores(Referee.Dice.GetDiceValue());
*/
// Проверка на конец очередного тайма
 if(Referee.GameFinish()){
// Активный участник первым закончил. Он и победил.
   ptrMember->AddVictoryCount();// Увеличиваем счетчик побед
   Beep(); // Звукнули
   Referee.NewGame();
   ShowMessage("Новая Игра!"); // Сообщили
 }
 else // Тайм продолжается, обновить информацию интерфейса
   Perform(MY_SHOW, 0, 0);// Посылка нашего
                          // сообщения интерфейсу
}
//---------------------------------------------------------------------------

// Сдаюсь - признаю другого победителем
void __fastcall TMainForm::PartyBtnClick(TObject *Sender)
{
 if(Referee.GetActiveMember() == PLAYER)
   Referee.Partner.AddVictoryCount();
 else
   Referee.Player.AddVictoryCount();
 Referee.NewGame();
// Обнулить кубик
 diceImage->LoadFromFile(AnsiString(PATH) + "0.jpg");
 Image->Picture = (TPicture *) diceImage;
}
//---------------------------------------------------------------------------

// Сбросим значения кубика
void __fastcall TMainForm::ClearImageBtnClick(TObject *Sender)
{
 try{ // Обработка исключений
   diceImage->LoadFromFile(AnsiString(PATH) + "0.jpg");
   Image->Picture = (TPicture *) diceImage;
 }
 catch(...){//Хоть и один оператор, фигурные скобки обязательны
   ShowMessage("Не могу найти изображение кубика - файл \" 0.jpg! \" ");
   // \" - экраны служебных для функции символов
 }
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::AboutClick(TObject *Sender)
{
 AboutBox->ShowModal();
}
//---------------------------------------------------------------------------

Файл объявления классов участников игры Game.h

Файл объявления классов участников игры Game.h
//  Файл Game.h
//---------------------------------------------------------------------------

#ifndef GameH
#define GameH
#include <stdlib.h>
//---------------------------------------------------------------------------

#define MY_SHOW WM_USER //Макроопределение сообщения
const int GAME_FINISH_SCORES = 120;// Глобальная константа
enum TActiveMember{PLAYER, PARTNER};
//---------------------------------------------------------------------------
class TDice // класс Кубик
{
   int Value;
 public:
   TDice(); // инициализировать при создании
   int GetDiceValue(){return Value;}// дать значение
   void Action(); // бросить
};
//---------------------------------------------------------------------------

class TPlayer // класс Игрок
{
 private:
   int CurrentScores;   // текущие очки
   int SumScores;       // суммарные очки
   int VictoryCount;    // число выигранных партий
 public:
   TPlayer();
   void Init(){CurrentScores = SumScores = 0;}
   int GetCurrentScores(){return CurrentScores;}
   int GetSumScores(){return SumScores;}
   void AddVictoryCount(){VictoryCount++;}
   int GetVictoryCount(){return VictoryCount;}
   void AddCurrentScores(int Scores)
                   {CurrentScores += Scores;}
   void AddSumScores()
                   {SumScores += CurrentScores;
                    CurrentScores = 0;}
};
//---------------------------------------------------------------------------


class TReferee // класс Судья
{
 private:
   TActiveMember activeMember;
   int PlayCount;
 public:
   TReferee(){PlayCount = 0;}
   TPlayer Player, Partner; //создание игроков
   TDice Dice;              //кубик
   void NewGame();          //новая игра
   void Move();             //передача хода
   bool GameFinish();       //проверка на конец партии
   int GetActiveMember(){return activeMember;}
   int GetPlayCount(){return PlayCount;}
};
//---------------------------------------------------------------------------
#endif

Файл реализации методов Game.cpp

Файл реализации методов Game.cpp
//  Файл Game.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Game.h" // Подключение объявлений

//---------------------------------------------------------------------------

#pragma package(smart_init)
//---------------------------------------------------------------------------

TDice::TDice() // конструктор по умолчанию
{
 randomize();  // инициализация random()
 Value = 0;
}
//---------------------------------------------------------------------------
void TDice::Action()
{
 Value = random(6) + 1;
}
//---------------------------------------------------------------------------

TPlayer::TPlayer()
{
 VictoryCount = 0;
 Init();
}

//---------------------------------------------------------------------------

//новая игра
void TReferee::NewGame()
{
 PlayCount++; 
 Player.Init();
 Partner.Init();
 Dice.Action(); // Бросить кубик
 if(Dice.GetDiceValue() <= 3) // первым ходит игрок
   activeMember = PLAYER;
 else
   activeMember = PARTNER;
 SendMessage(FindWindow("TMainForm","Игра в кубик"),
             MY_SHOW, 0, 0);
}
//---------------------------------------------------------------------------

// Передача хода
void TReferee::Move()
{
 if(GetActiveMember() == PLAYER){
   Player.AddSumScores();
   activeMember = PARTNER;
 }
 else{
   Partner.AddSumScores();
   activeMember = PLAYER;
 }
 SendMessage(FindWindow("TMainForm","Игра в кубик"),
             MY_SHOW, 0, 0); 
}
//---------------------------------------------------------------------------


bool TReferee::GameFinish()  //проверка на конец партии
{
 int PlayerBalance = Player.GetSumScores();
 PlayerBalance += Player.GetCurrentScores();
 int PartnerBalance = Partner.GetSumScores();
 PartnerBalance += Partner.GetCurrentScores();
 return PlayerBalance >= GAME_FINISH_SCORES
     || PartnerBalance >= GAME_FINISH_SCORES;
}
//---------------------------------------------------------------------------

Заголовочный файл UAbout.h

Заголовочный файл UAbout.h
//---------------------------------------------------------------------------

#ifndef UAboutH
#define UAboutH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Graphics.hpp>
//---------------------------------------------------------------------------
class TAboutBox : public TForm
{
__published:  // IDE-managed Components
        TImage *Image;
        TLabel *Label1;
        TLabel *Label2;
        TLabel *Label3;
        TLabel *Label4;
        TLabel *Label5;
private:  // User declarations
public:    // User declarations
        __fastcall TAboutBox(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TAboutBox *AboutBox;
//---------------------------------------------------------------------------
#endif

Файл реализации UAbout.cpp

Файл реализации UAbout.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "UAbout.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TAboutBox *AboutBox;
//---------------------------------------------------------------------------
__fastcall TAboutBox::TAboutBox(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

Главное окно

Окно About

Страницы:

Реализация в IDE C++Builder 6

Файлы к данной лабораторной работе, Вы можете скачать здесь.

В задание на выполнение входит самостоятельное построение демонстрационного приложения в IDE C++Builder 6.0 игры в кубик

Файл точки входа приложения PlayDice.cpp

Файл точки входа приложения PlayDice.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
USEFORM("Interface.cpp", MainForm);
USEFORM("UAbout.cpp", AboutBox);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        try
        {
                 Application->Initialize();
                 Application->CreateForm(__classid(TMainForm), MainForm);
                 Application->CreateForm(__classid(TAboutBox), AboutBox);
                 Application->Run();
        }
        catch (Exception exception)
        {
                 Application->ShowException(exception);
        }
        return 0;
}
//---------------------------------------------------------------------------

Файл объявления интерфейса пользователя - Interface.h

Файл объявления интерфейса пользователя - Interface.h
//  Файл Interface.h
//---------------------------------------------------------------------------
  
#ifndef InterfaceH
#define InterfaceH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Buttons.hpp>
#include <ComCtrls.hpp>
#include <ExtCtrls.hpp>
#include <Menus.hpp>
#include <ToolWin.hpp>
  
#include "Game.h" // Подключение объявлений
#include <jpeg.hpp>
//---------------------------------------------------------------------------
class TMainForm : public TForm
{
__published:  // IDE-managed Components
// Объявления интерфейса
        TGroupBox *PlayerGroupBox;
        TLabel *L3;
        TLabel *L2;
        TEdit *PlayerCurrentScores;
        TEdit *PlayerSumScores;
        TGroupBox *PartnerGroupBox;
        TLabel *L6;
        TLabel *L5;
        TEdit *PartnerCurrentScores;
        TEdit *PartnerSumScores;
        TGroupBox *DiceGroupBox;
        TImage *Image;
        TMainMenu *MainMenu;
        TMenuItem *N1;
        TMenuItem *N2;
        TMenuItem *NewGameItem;
        TMenuItem *GameExitItem;
        TMenuItem *N3;
        TMenuItem *UseDiceItem;
        TMenuItem *NextItem;
        TToolBar *ToolBar;
        TSpeedButton *NewGameItemBtn; //phonerng.bmp
        TSpeedButton *GameExitItemBtn;//dooropen.bmp
        TSpeedButton *StepItemBtn;    //arrow3r.bmp
        TPanel *PanelInfo;
        TLabel *PlayCount;
        TLabel *Balance;
        TLabel *L1;
        TEdit *PlayerVictoryCount;
        TEdit *PartnerVictoryCount;
        TButton *PlayerStep;
        TButton *PartnerStep;
        TLabel *L4;
        TLabel *ActivePlayer;
        TLabel *Label1;
        TButton *Step;
        TButton *Button1;
        TButton *PartyBtn;
        TLabel *GameFinishScores;
        TButton *ClearImageBtn;
        TPopupMenu *PopupMenu;
        TMenuItem *About;
        void __fastcall GameExitItemClick(TObject *Sender);
        void __fastcall PartnerStepClick(TObject *Sender);
        void __fastcall NewGameItemBtnClick(TObject *Sender);
        void __fastcall StepClick(TObject *Sender);
        void __fastcall PartyBtnClick(TObject *Sender);
        void __fastcall ClearImageBtnClick(TObject *Sender);
        void __fastcall FormClose(TObject *Sender, TCloseAction Action);
        void __fastcall AboutClick(TObject *Sender);
private:  // User declarations
        TReferee Referee; // Включаемый объект Судья
/*
        TMessage message;
          Не нужно, т.к. не используем
        явный вызов функции обработки нашего
        сообщения ShowInfo(message);
*/
        TJPEGImage *diceImage; // Для контейнера Jpg-файла
        TPlayer *ptrMember;
        void ShowInfo(TMessage );// Объявление обработчика сообщения
        void ShowDice(); // Вводится для модульности кода
public:    // User declarations
        __fastcall TMainForm(TComponent* Owner);// Объявление конструктора
        BEGIN_MESSAGE_MAP // Карта сообщений программиста
          MESSAGE_HANDLER(MY_SHOW, TMessage, ShowInfo)
        END_MESSAGE_MAP(TForm)
};
//---------------------------------------------------------------------------
extern PACKAGE TMainForm *MainForm;
//---------------------------------------------------------------------------
#endif

Файл реализации интерфейса пользователя - Interface.cpp

Файл реализации интерфейса пользователя - Interface.cpp
// Файл Interface.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Interface.h"
#include "UAbout.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

// Одну закомментировать
#define PATH "Pictures\\"
//#define PATH ""

TMainForm *MainForm;
//---------------------------------------------------------------------------
// Конструктор Приложения
__fastcall TMainForm::TMainForm(TComponent* Owner)
        : TForm(Owner)
{
 diceImage = new TJPEGImage(); // Перед Referee.NewGame()
 if(!diceImage){//Проверка удачного выделения памяти
   ShowMessage("Не могу создать объект под изображение кубика!");
   Close();
 }
// Image->Picture = (TPicture *) diceImage;
 Referee.NewGame();
// Обнулить кубик
 diceImage->LoadFromFile(AnsiString(PATH) + "0.jpg");
 Image->Picture = (TPicture *) diceImage;
}
//---------------------------------------------------------------------------

// Выполняет функции деструктора при завершении приложения
void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction Action)
{
 if(diceImage){ // Безопасная технология освобождения указателя
   delete diceImage;
   diceImage = NULL; // При завершении приложения излишне
 }
}
//---------------------------------------------------------------------------

// Выход
void __fastcall TMainForm::GameExitItemClick(TObject *Sender)

{
// Close();
 Perform(WM_CLOSE, 0, 0); // По стандартному Сообщению
}
//---------------------------------------------------------------------------

// Выводит информацию о состоянии игры
void TMainForm::ShowInfo(TMessage a)
{
// Переключение интерфейса игрока
 if(Referee.GetActiveMember() == PLAYER){
   ActivePlayer->Caption = "Бросает Игрок";
   PlayerGroupBox->Enabled = true;
   PartnerGroupBox->Enabled = false;
   PlayerGroupBox->Font->Style =
                   TFontStyles()<< fsBold;
   PartnerGroupBox->Font->Style = TFontStyles();
 }
 else{
   ActivePlayer->Caption = "Бросает Партнер";
   PartnerGroupBox->Enabled = true;
   PlayerGroupBox->Enabled = false;
   PartnerGroupBox->Font->Style = TFontStyles()<< fsBold;
   PlayerGroupBox->Font->Style = TFontStyles();
 }
 
 PlayerCurrentScores->Text = IntToStr(Referee.Player.GetCurrentScores());
 PlayerSumScores->Text = IntToStr(Referee.Player.GetSumScores());
 PartnerCurrentScores->Text = IntToStr(Referee.Partner.GetCurrentScores());
 PartnerSumScores->Text = IntToStr(Referee.Partner.GetSumScores());
 PlayCount->Caption = IntToStr(Referee.GetPlayCount());
 ShowDice();
 PlayerVictoryCount->Text = IntToStr(Referee.Player.GetVictoryCount());
 PartnerVictoryCount->Text = IntToStr(Referee.Partner.GetVictoryCount());
// Balance->Caption = "Счет  " + PlayerVictoryCount->Text
//                    + " : "  + PartnerVictoryCount->Text;
 Balance->Caption = "Счет  " + IntToStr(Referee.Player.GetVictoryCount())
                    + " : " + IntToStr(Referee.Partner.GetVictoryCount());
 GameFinishScores->Caption = "Партия до "
                              + IntToStr(GAME_FINISH_SCORES);                      
}
//---------------------------------------------------------------------------

// Выводит графический рисунок сторон кубика
void TMainForm::ShowDice()
{
 AnsiString fileName = PATH;
 fileName += IntToStr(Referee.Dice.GetDiceValue());
 fileName += ".jpg";
 try{ // Обработка исключений
   // Image->Picture->LoadFromFile(fileName);
   diceImage->LoadFromFile(fileName);
// Явное преобразование типа указателя
   Image->Picture = (TPicture *) diceImage;
 }
 catch(...){//Хоть и один оператор, фигурные скобки обязательны
   ShowMessage("Не могу найти изображение кубика - файл " + fileName);
 }
}
//---------------------------------------------------------------------------

// Обрабатывает команду передачи хода
void __fastcall TMainForm::PartnerStepClick(TObject *Sender)
{
 Referee.Move();
// Обнулить кубик
 diceImage->LoadFromFile(AnsiString(PATH) + "0.jpg");
 Image->Picture = (TPicture *) diceImage;
}
//---------------------------------------------------------------------------

// Новая игра
void __fastcall TMainForm::NewGameItemBtnClick(TObject *Sender)
{
 Referee.NewGame();
// Обнулить кубик
 diceImage->LoadFromFile(AnsiString(PATH) + "0.jpg");
 Image->Picture = (TPicture *) diceImage;
}
//---------------------------------------------------------------------------

// Ход бросанием кубика
void __fastcall TMainForm::StepClick(TObject *Sender)
{
// Создадим указатель на текущего игрока
 TPlayer *ptrMember; // Локальная адресная переменная
// Передается указателю адрес активного игрока
 if(Referee.GetActiveMember() == PLAYER)
   ptrMember = Referee.Player;
 else
   ptrMember = Referee.Partner;

 TMainForm::ptrMember = ptrMember;// Адресная переменная  области
                                 // видимости содержащего класса
 Referee.Dice.Action();//судья бросается кубик
 if(Referee.Dice.GetDiceValue() == 1){// Неудачный ход
   ptrMember->AddCurrentScores(-ptrMember->GetCurrentScores());
   Referee.Move();
   return;
 }
// Ход активного игрока удачный - увеличить текущие очки
 ptrMember->AddCurrentScores(Referee.Dice.GetDiceValue());
/*
 Заменено введением указателя ptrMember
 if(Referee.GetActiveMember() == PLAYER)
   Referee.Player.AddCurrentScores(Referee.Dice.GetDiceValue());
 else
   Referee.Partner.AddCurrentScores(Referee.Dice.GetDiceValue());
*/
// Проверка на конец очередного тайма
 if(Referee.GameFinish()){
// Активный участник первым закончил. Он и победил.
   ptrMember->AddVictoryCount();// Увеличиваем счетчик побед
   Beep(); // Звукнули
   Referee.NewGame();
   ShowMessage("Новая Игра!"); // Сообщили
 }
 else // Тайм продолжается, обновить информацию интерфейса
   Perform(MY_SHOW, 0, 0);// Посылка нашего
                          // сообщения интерфейсу
}
//---------------------------------------------------------------------------

// Сдаюсь - признаю другого победителем
void __fastcall TMainForm::PartyBtnClick(TObject *Sender)
{
 if(Referee.GetActiveMember() == PLAYER)
   Referee.Partner.AddVictoryCount();
 else
   Referee.Player.AddVictoryCount();
 Referee.NewGame();
// Обнулить кубик
 diceImage->LoadFromFile(AnsiString(PATH) + "0.jpg");
 Image->Picture = (TPicture *) diceImage;
}
//---------------------------------------------------------------------------

// Сбросим значения кубика
void __fastcall TMainForm::ClearImageBtnClick(TObject *Sender)
{
 try{ // Обработка исключений
   diceImage->LoadFromFile(AnsiString(PATH) + "0.jpg");
   Image->Picture = (TPicture *) diceImage;
 }
 catch(...){//Хоть и один оператор, фигурные скобки обязательны
   ShowMessage("Не могу найти изображение кубика - файл \" 0.jpg! \" ");
   // \" - экраны служебных для функции символов
 }
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::AboutClick(TObject *Sender)
{
 AboutBox->ShowModal();
}
//---------------------------------------------------------------------------

Файл объявления классов участников игры Game.h

Файл объявления классов участников игры Game.h
//  Файл Game.h
//---------------------------------------------------------------------------

#ifndef GameH
#define GameH
#include <stdlib.h>
//---------------------------------------------------------------------------

#define MY_SHOW WM_USER //Макроопределение сообщения
const int GAME_FINISH_SCORES = 120;// Глобальная константа
enum TActiveMember{PLAYER, PARTNER};
//---------------------------------------------------------------------------
class TDice // класс Кубик
{
   int Value;
 public:
   TDice(); // инициализировать при создании
   int GetDiceValue(){return Value;}// дать значение
   void Action(); // бросить
};
//---------------------------------------------------------------------------

class TPlayer // класс Игрок
{
 private:
   int CurrentScores;   // текущие очки
   int SumScores;       // суммарные очки
   int VictoryCount;    // число выигранных партий
 public:
   TPlayer();
   void Init(){CurrentScores = SumScores = 0;}
   int GetCurrentScores(){return CurrentScores;}
   int GetSumScores(){return SumScores;}
   void AddVictoryCount(){VictoryCount++;}
   int GetVictoryCount(){return VictoryCount;}
   void AddCurrentScores(int Scores)
                   {CurrentScores += Scores;}
   void AddSumScores()
                   {SumScores += CurrentScores;
                    CurrentScores = 0;}
};
//---------------------------------------------------------------------------


class TReferee // класс Судья
{
 private:
   TActiveMember activeMember;
   int PlayCount;
 public:
   TReferee(){PlayCount = 0;}
   TPlayer Player, Partner; //создание игроков
   TDice Dice;              //кубик
   void NewGame();          //новая игра
   void Move();             //передача хода
   bool GameFinish();       //проверка на конец партии
   int GetActiveMember(){return activeMember;}
   int GetPlayCount(){return PlayCount;}
};
//---------------------------------------------------------------------------
#endif

Файл реализации методов Game.cpp

Файл реализации методов Game.cpp
//  Файл Game.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Game.h" // Подключение объявлений

//---------------------------------------------------------------------------

#pragma package(smart_init)
//---------------------------------------------------------------------------

TDice::TDice() // конструктор по умолчанию
{
 randomize();  // инициализация random()
 Value = 0;
}
//---------------------------------------------------------------------------
void TDice::Action()
{
 Value = random(6) + 1;
}
//---------------------------------------------------------------------------

TPlayer::TPlayer()
{
 VictoryCount = 0;
 Init();
}

//---------------------------------------------------------------------------

//новая игра
void TReferee::NewGame()
{
 PlayCount++; 
 Player.Init();
 Partner.Init();
 Dice.Action(); // Бросить кубик
 if(Dice.GetDiceValue() <= 3) // первым ходит игрок
   activeMember = PLAYER;
 else
   activeMember = PARTNER;
 SendMessage(FindWindow("TMainForm","Игра в кубик"),
             MY_SHOW, 0, 0);
}
//---------------------------------------------------------------------------

// Передача хода
void TReferee::Move()
{
 if(GetActiveMember() == PLAYER){
   Player.AddSumScores();
   activeMember = PARTNER;
 }
 else{
   Partner.AddSumScores();
   activeMember = PLAYER;
 }
 SendMessage(FindWindow("TMainForm","Игра в кубик"),
             MY_SHOW, 0, 0); 
}
//---------------------------------------------------------------------------


bool TReferee::GameFinish()  //проверка на конец партии
{
 int PlayerBalance = Player.GetSumScores();
 PlayerBalance += Player.GetCurrentScores();
 int PartnerBalance = Partner.GetSumScores();
 PartnerBalance += Partner.GetCurrentScores();
 return PlayerBalance >= GAME_FINISH_SCORES
     || PartnerBalance >= GAME_FINISH_SCORES;
}
//---------------------------------------------------------------------------

Заголовочный файл UAbout.h

Заголовочный файл UAbout.h
//---------------------------------------------------------------------------

#ifndef UAboutH
#define UAboutH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Graphics.hpp>
//---------------------------------------------------------------------------
class TAboutBox : public TForm
{
__published:  // IDE-managed Components
        TImage *Image;
        TLabel *Label1;
        TLabel *Label2;
        TLabel *Label3;
        TLabel *Label4;
        TLabel *Label5;
private:  // User declarations
public:    // User declarations
        __fastcall TAboutBox(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TAboutBox *AboutBox;
//---------------------------------------------------------------------------
#endif

Файл реализации UAbout.cpp

Файл реализации UAbout.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "UAbout.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TAboutBox *AboutBox;
//---------------------------------------------------------------------------
__fastcall TAboutBox::TAboutBox(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

Главное окно

Окно About

Вернуться к учебному плану