Министерство образования и науки РФ
Новосибирский государственный технический университет
Кафедра Автоматики Курсовая работа
по дисциплине программирование
Группа: АА-86
Студент: Сапрыкин О.Н.
Проверил:
Ханин А.Г.
Новосибирск
2010
Курсовой проект
Проекты обязаны быть реализованы с использованием классов или готовых пакетов, построенных на основе объектно-ориентированного программирования. В зависимости от техники, к которой имеется доступ, в качестве таких пакетов могут быть использованы TVISION для Borland C++, Object Windows Library 1.0 или Object Windows Library 2.0 для Borland C++ или Visual C++ 6.0. Программа может выполнять любые функции, но студенты должны показать в ней умение пользоваться достаточно сложными библиотеками классов. В качестве таких программ могут быть предложены различные игры,
Объем программ должен быть таким, чтобы можно было показать овладение технологией объектно-ориентированного программирования, умение использовать библиотеки классов. Объем работы не ограничен сверху и определяется способностями и возможностями студентов по использованию вычислительной техники.
Примерные задания на курсовое проектирование.
Разработать графическую игру.
Разработать пользовательский интерфейс к файловой системе, включая манипулирование, просмотр и редактирование текстовых файлов.
Разработать программу визуализации табличных данных.
Разработать HTML-редактор с подсветкой тегов.
Разработать редактор электронных таблиц.
Разработать программу графического оформления текстовых объявлений.
Предпочтение отдается реальной тематике, определяемой интересами студента и согласуемой с преподавателем.
Правила игры:
На игровой доске (поле размером 10:10) игроки начинают ходить, при каждом ходе все соседние фишки становятся такого же цвета, что и ходивший игрок. Выигрывает тот игрок, который имеет большее количество закрашенных фишек.
Реализация:
В своей игре я использую объекты. Фишки реализуются в объекте, клетки игровой доски тоже реализуются объектом, сама доска является потомком клетки и имеет свойства доски.
Для того чтобы создать игровую доску, я сначала создаю клетку в классе “TCells - Клетка”, которая имеет свой размер. В классе “TDoska-доска”, который является производным от класса “TCells - Клетка” я рисую игровую доску с помощью функции draw, в которую ничего не передается. Эта игровая доска размером 10:10, зеленого цвета. Также мне нужно создать объекты, которыми я буду ходить – фишки. Их я создаю в базовом классе “TFishka”. Полями этого класса являются: массив размером 10:10 для хранения положений фишек, массив размером 10:10 для хранения цветов фишек на доске, целые параметры: x, y, size, count_1, count_2 – координаты фишки, размер, счет первого и второго игрока соответственно.
Методы класса: конструктор для создания поля зеленого цвета с неустановленными фишками; функция void draw для рисования одной фишки с установленными координатами; функция init, в которую передаются координаты фишки походившего игрока, ее цвет и номер игрока. Эта функция закрашивает соседние фишки, если они еще не установлены. Функция Game_over, для проверки на окончание игры. Игра оканчивается, когда все фишки установлены. Потом сравнивается счет игроков и выводится сообщение о победителе.
Листинг программы:
Unit1.cpp
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TFishka f;
TDoska doska;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//----------- обработчик прорисовки формы -----------------------------------------void __fastcall TForm1::FormPaint(TObject *Sender)
{
doska.draw();
}
//----------------------------------------------------------------
//Ход первого игрока
void __fastcall TForm1::Button1Click(TObject *Sender) {
//Запись ходов
Label9->Caption=Label9->Caption+"Игрок1: X="+Edit1->Text+ "Y="+Edit2->Text+"\t";
f.init(StrToInt(Edit1->Text),StrToInt(Edit2->Text),clBlue,1);
f.draw(); //Прорисовываем фишку
f.count_1++;
Edit5->Text=IntToStr(f.count_1);//Выводим очки
//Выключаем интерфейс
Button1->Enabled=false;
Edit1->Enabled=false;
Edit1->Text="";
Edit2->Enabled=false;
Edit2->Text="";
//Включаем интерфейс второго игрока
if (Button2->Enabled==false)
{ Button2->Enabled=true;
Edit3->Enabled=true;
Edit4->Enabled=true;
}
else
{
Button2->Enabled=false;
}
f.Game_over();// Проверяем условие конца игры
}
//-------------------------------------------------------------------//Ход второго игрока
void __fastcall TForm1::Button2Click(TObject *Sender) {
//Запись ходов
Label9->Caption=Label9->Caption+"Игрок2: X="+Edit3->Text+" Y="+Edit4->Text+"\n";
f.init(StrToInt(Edit3->Text),StrToInt(Edit4->Text),clRed,2);
f.draw(); //Прорисовываем фишку
f.count_2++;
Edit6->Text=IntToStr(f.count_2); //Выводим очки
//Выключаем интерфейс
Button2->Enabled=false;
Edit3->Enabled=false;
Edit3->Text="";
Edit4->Enabled=false;
Edit4->Text="";
//Включаем интерфейс первого игрока
if (Button1->Enabled==false)
{
Button1->Enabled=true;
Edit1->Enabled=true;
Edit2->Enabled=true;
}
else
{Button1->Enabled=false;}
f.Game_over(); // Проверяем условие конца игры
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender) //Каждые 10 мс
{
f.draw_greed();//прорисовываем поле
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)//При создании формы
{
//Выводим счет игроков
Edit5->Text=IntToStr(f.count_1);
Edit6->Text=IntToStr(f.count_2);
}
//Выключаем интерфейс второго игрока, чтобы начал ходить первый
Edit3->Enabled=false;
Edit4->Enabled=false;
}
Unit.h
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TGroupBox *GroupBox1;
TGroupBox *GroupBox2;
TGroupBox *GroupBox3;
TEdit *Edit1;
TEdit *Edit2;
TEdit *Edit3;
TEdit *Edit4;
TLabel *Label1;
TLabel *Label2;
TLabel *Label3;
TLabel *Label4;
TLabel *Label5;
TLabel *Label6;
TButton *Button1;
TButton *Button2;
TLabel *Label7;
TLabel *Label8;
TEdit *Edit5;
TEdit *Edit6;
TShape *Shape1;
TShape *Shape2;
TTimer *Timer1;
TGroupBox *GroupBox4;
TLabel *Label9;
void __fastcall FormPaint(TObject *Sender);
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
void __fastcall Timer1Timer(TObject *Sender);
void __fastcall FormCreate(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
class TCells // Класс клетка
{
public:
int size; // Размер клеток
void init(_size){size=_size;} //Устанавливает размер клеток
};
class TDoska:public TCells // Класс доска. Производный от класса клетка.
{
public:
TDoska() //Устанавливаем размер клетки 40
{
init(40);
}
void draw() //Рисует доску.
{
for (int i=0;i<10;i++)
for (int j=0;j<10;j++)
{
Form1->Canvas->Brush->Color=clLime; // Выбираем цвет
Form1->Canvas->Ellipse(i*size,j*size,(i+1)*size,(j+1)*size);//Рисуем круг
}
}
};
//---------------------------------------------------------------------------
class TFishka // Класс Фишка.
{
public:
int mas[10][10]; //Массив для хранения положений фишек.
TColor color[10][10]; // Массив для хранения цветов фишек на доске.
int x,y,size; //Координаты фишки и размер.
int count_1,count_2; //Счет игроков.
//-------------
TFishka();
//-------------
void draw_greed() //Рисует доску с фишками
{
int i,j;
for ( i=0;i<10;i++)
for ( j=0;j<10;j++)
{
Form1->Canvas->Brush->Color=color[i][j];
Form1->Canvas->Ellipse(i*size,j*size,(i+1)*size,(j+1)*size);
}
}
//-------------
void draw() //Рисует одну фишку с установленными координатами
{
Form1->Canvas->Brush->Color=color[x][y];
Form1->Canvas-> Ellipse(x*size,y*size,(x+1)*size,(y+1)*size);
}
//-------------
void init(int x, int y, TColor _c, int __gamer);
//-------------
void Game_over() //Проверка на окончание игры
{
int i,j,t1,t2,_gamer;
t1=100;_gamer=0;t2=0;
//Проход по массиву
for (i=0;i<10;i++)
for (j=0;j<10;j++)
if (mas[i][j]==1){t2++;//Если фишка установлена, t2=t2+1
}
//Если все фишки установлены
if (t2==t1)
{
//Сравниваем счет игроков
if (count_1>count_2){_gamer=1;}
else {_gamer=2;}
Form1->Button1->Enabled=false; //выключаем интерфейс
Form1->Button2->Enabled=false;
//Выводим сообщение
ShowMessage("Game Over!!! Выиграл игрок ["+IntToStr(_gamer)+"]");
}
}
//-------------
};
//------------------------------------------------------------------------------
void TFishka::init(int x, int y, TColor _c, int __gamer)
{
int temp; // Счетчик
temp=0;
//Если фишка не установлена, то устанавливаем ее
if (mas[x][y]==0) {color[x][y]=_c; mas[x][y]=1; temp++;}
if (mas[x+1][y]==0) {color[x+1][y]=_c; mas[x+1][y]=1; temp++;}
if (mas[x-1][y]==0) {color[x-1][y]=_c; mas[x-1][y]=1; temp++;}
if (mas[x][y+1]==0) {color[x][y+1]=_c; mas[x][y+1]=1; temp++;}
if (mas[x][y-1]==0) {color[x][y-1]=_c; mas[x][y-1]=1; temp++;}
if (mas[x+1][y-1]==0) {color[x+1][y-1]=_c; mas[x+1][y-1]=1; temp++;}
if (mas[x+1][y+1]==0) {color[x+1][y+1]=_c; mas[x+1][y+1]=1; temp++;}
if (mas[x-1][y-1]==0) {color[x-1][y-1]=_c; mas[x-1][y-1]=1; temp++;}
if (mas[x-1][y+1]==0) {color[x-1][y+1]=_c; mas[x-1][y+1]=1; temp++;}
switch(__gamer)
{
case 1 : count_1+=temp;break; //Начисляем очки первому игроку.
case 2 : count_2+=temp;break; //Начисляем очки второму игроку.
}
}
//------------------------------------------------------------------------------
TFishka::TFishka() // Конструктор, который создает
{
for (int i=0;i<10;i++)
for (int j=0;j<10;j++)
{color[i][j]=clLime; //поле зеленого цвета
mas[i][j]=0;} //с неустановленными фишками
count_1=0;
count_2=0;
size=40;
}
Project1.cpp
#include <vcl.h>
#pragma hdrstop
USEFORM("Unit1.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}