| Стоит Windows 8 Pro, Visual Studio 2010 Express Edition . |
Опубликован: 17.08.2010 | Доступ: свободный | Студентов: 1001 / 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();
}
//---------------------------------------------------------------------------