Опубликован: 17.08.2010 | Доступ: свободный | Студентов: 999 / 59 | Оценка: 4.11 / 3.89 | Длительность: 29:38:00
Самостоятельная работа 11:

Игра в кубик

Аннотация: Реализация в IDE C++Builder 6. Файл точки входа приложения PlayDice.cpp. Файл объявления интерфейса пользователя - Interface.h. Файл реализации интерфейса пользователя - Interface.cpp. Файл объявления классов участников игры Game.h. Файл реализации методов Game.cpp. Заголовочный файл UAbout.h. Файл реализации UAbout.cpp. Главное окно. Окно 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();
}
//---------------------------------------------------------------------------
Александр Даниленко
Александр Даниленко
Стоит Windows 8 Pro, Visual Studio 2010 Express Edition .