NetNado
  Найти на сайте:

Учащимся

Учителям



Пояснительная записка к курсовой работе по курсу "Программирование на языке высокого уровня"



Национальный исследовательский

Томский политехнический университет


Кафедра ИПС

Пояснительная записка к курсовой работе
по курсу "Программирование на языке высокого уровня"

на тему:



Выполнил:


студент группы 8В83

Колчанов А.В.


Проверил:


доцент кафедры ИПС, Рейзлин В.И.




«Zuma 2010 Delux»

Томск 2010


содержание

Выполнил: 1

студент группы 8В83 1

Колчанов А.В. 1

Проверил: 1

доцент кафедры ИПС, Рейзлин В.И. 1

Томск 2010 2

ТЕХНИЧЕСКОЕ ЗАДАНИЕ 4

1.ВВЕДЕНИЕ 4

2.ОСНОВАНИЕ ДЛЯ РАЗРАБОТКИ 4

3.НАЗНАЧЕНИЕ РАЗРАБОТКИ 4

4.ТРЕБОВАНИЯ К РАЗРАБОТКЕ 4

5.ТРЕБОВАНИЯ К ПРОГРАММНОЙ ДОКУМЕНТАЦИИ 5

ВВЕДЕНИЕ 6

1.Постановка задачи 7

2.ПРОЕКТ ПРОГРАММЫ 7

3.Описание интерфейса и инструкция пользователя
8


4.заключение 8

список литературы 8

ТЕХНИЧЕСКОЕ ЗАДАНИЕ




  1. ВВЕДЕНИЕ




1.1. Наименование продукта


«Zuma 2010 Delux».

1.2. Краткая характеристика области применения


Программа ориентирована на широкий круг пользователей и позволяет ощутить восторг от перекладывания кубиков и их уничтожения.

  1. ОСНОВАНИЕ ДЛЯ РАЗРАБОТКИ




2.1. Документ, на основании которого ведётся разработка


Задание на курсовой проект по дисциплине «Программирование на языке высокого уровня».

2.2. Организация, утвердившая документ


Научный исследовательский Томский политехнический университет.

  1. НАЗНАЧЕНИЕ РАЗРАБОТКИ



Программа относится к разряду развлекательных.

  1. ТРЕБОВАНИЯ К РАЗРАБОТКЕ




4.1. Требования к функциональным характеристикам


Программа должна осуществлять передвижение кубиков по горизонтали и вертикали и уничтожение цепочек одинакового цвета.

Программа должна иметь простой дружественный графический интерфейс.

4.2. Требования к составу и параметрам технических средств


Для функционирования игры необходим компьютер IBM PC совместимый и следующие технические средства:

  • процессор Intel Pentium 4 или совместимый;

  • объем свободной оперативной памяти 256 Мб;

  • объем необходимой памяти на жестком диске 100 Кб;

  • стандартный VGA-монитор или совместимый;

  • мышь и клавиатура;



4.3. Требования к информационной и программной совместимости


Программная система должна функционировать под операционной системой Microsoft Windows XP или выше.

  1. ТРЕБОВАНИЯ К ПРОГРАММНОЙ ДОКУМЕНТАЦИИ



Предварительный состав программной документации:

  • «Техническое задание», текст программы с комментариями, описание алгоритма и программы.

  • «Руководство пользователя».

ВВЕДЕНИЕ



Данная курсовая работа является примером реализации задачи перемещения графических объектов по экрану с помощью мыши, написанной с применением объектно-ориентированного программирования на языке высокого уровня С++.
C++ (Си++) — компилируемый статически типизированный язык программирования общего назначения. Поддерживает разные парадигмы программирования, но, в сравнении с его предшественником — языком Си, — наибольшее внимание уделено поддержке объектно-ориентированного и обобщённого программирования.
Название «C++» происходит от Си (C), в котором унарный оператор ++ обозначает инкремент переменной.
В 1990-х годах язык стал одним из наиболее широко применяемых языков программирования общего назначения.
При создании C++ стремились сохранить совместимость с языком Си. Большинство программ на Си будут исправно работать и с компилятором C++. C++ имеет синтаксис, основанный на синтаксисе Си.
  1. Постановка задачи



Написать программу, позволяющую переставлять кубики местами. Применить классы с наследованием. Выполнить переопределение стандартных операций для абстрактных типов данных. Использовать конструкторы, деструкторы. Использовать графический режим.
  1. ПРОЕКТ ПРОГРАММЫ



В данной программе был созданы следующие классы: AbstractFigure, Bonus и Figure. Для работы с объектами класса были созданы следующие функции:

TPoint GetMouseCoord2() //определение абсолютных координат мыши

TPoint GetMouseCoord() //определение фигуры, над которой находится курсор мыши

TPoint GetMouseCoord3(TPoint a) //получение координаты фигуры, находящейся наиболее близко

//к заданным координатам

TPoint GetDelta() //возвращает координаты, насколько курсор мыши

//далеко от ближайшей ячейки влево и вверх

void Initialise() //выделяет память под фигуры

void Draw() //прорисовывает фигуры

void FindAndDestroy() //поиск ряда одинаковых фигур и их уничтожение

bool Gravity() //гравитация

void Initial() //создает фигуры

void Start() //запускает игру

void Exchange(int n, bool hor, bool toad) //передвигает строчку или столбец

void __fastcall TForm1::FormMouseDown() //нажатие кнопки мыши

TForm1::FormMouseMove() //передвижение кнопки мыши

TForm1::FormMouseUp //отпускание кнопки мыши

int GenerateNewFigures() //создание новых фигур
  1. Описание интерфейса и инструкция пользователя


В данной программе разработан простой пользовательский интерфейс. При запуске программы на экране приветственное окно, в котором можно прочитать название программы и имя автора. Для начала игры следует нажать кнопку Start.

Появляется прямоугольное поле с квадратными фигурами размера 10x10. Пользователь может передвигать строчку или столбец фигур. Задача игрока – образовать цепочку из 3 или более фигур одного цвета.

  1. заключение



Выполнение данной работы – это итог обучению по дисциплине «Программирование на языке высокого уровня». Были использованы все знания и технологии C++, а также изучены новые.

При написании программы потребовались знания и умения с выводом графики, классами, динамической памятью, API-функций Windows.

Выполнение курсовой работы помогло закрепить материал и навыки, полученный на лекциях и лабораторных работах, помогло систематизировать знание языка и научится применять их к конкретным задачам.

список литературы





  1. MSDN msdn.microsoft.com

  2. «Исходники.ру» http://sources.ru/

  3. «Компьютерная графика» compgraphics.info



Приложение


Листинг программы:

#include

#pragma hdrstop
#include "Unit2.h"

#include "Unit1.h"

#include "conio.h"

#include "iostream.h"

#include "math.h"

#include "windows.h"
//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"
//Объявления констант

#define width 50 //ширина фигуры

#define height 50 //высота фигуры

#define space 10 //пустое место

TForm1 *Form1;
bool dragging=false;

TPoint position;

long score=0;//очки
int x0,y0;

int path=0;

int dx=0; int dy=0;

TPoint delta;//насколько курсор мыши отстает от ячеек
TPoint __fastcall TForm1::GetMouseCoord21()

{

TPoint a = TPoint(ScreenToClient(Mouse->CursorPos).x,ScreenToClient(Mouse->CursorPos).y);

return a;

}
//определение абсолютных координат мыши

TPoint GetMouseCoord2()

{

TPoint a = Form1->GetMouseCoord21();

return Form1->GetMouseCoord21();

}
//определение фигуры, над которой находится курсор мыши

TPoint GetMouseCoord()

{

TPoint point;

point.x = -1; point.y = -1;
TPoint a = GetMouseCoord2();
point.x = a.y/(height+space);

point.y = a.x/(width+space);
return point;

}
//получение координаты фигуры, находящейся наиболее близко

//к заданным координатам

TPoint GetMouseCoord3(TPoint a)

{

TPoint mouse = GetMouseCoord2();
TPoint r;
if (((mouse.y-delta.y)%(height+space)>=0)&&((mouse.y-delta.y)%(height+space)<(height+space)*0.5))

r.x=(mouse.y-delta.y)/(height+space); else

r.x=(mouse.y-delta.y)/(height+space) + 1;
if (((mouse.x-delta.x)%(width+space)>=0)&&((mouse.x-delta.x)%(width+space)<(width+space)*0.5))

r.y=(mouse.x-delta.x)/(width+space); else

r.y=(mouse.x-delta.x)/(width+space) + 1;
if ((mouse.y-delta.y)<0) r.x=0;

if ((mouse.x-delta.x)<0) r.y=0;
return r;

}
//возвращает координаты, насколько курсор мыши

//далеко от ближайшей ячейки влево и вверх

TPoint GetDelta()

{

TPoint mouse = GetMouseCoord2();

TPoint r;

r.x = mouse.x % (width+space);

r.y = mouse.y % (height+space);

return r;

}
class AbstractFigure

{

public:

int x,y;

int color;

bool exist;

bool del;

};

class Bonus : public AbstractFigure

{

public:

int time;

Bonus(int Time)

{

time=Time;

}

};
class Figure : public AbstractFigure

{

public:

Figure()

{

exist=true;

del=false;

}

Figure(int Color)

{

color = Color;

exist=true;

del=false;

}

void exchange(Figure f1)

{

int _int;

long _long;

bool _bool;
_long=color;

color=f1.color;

f1.color=_long;
_bool=exist;

exist=f1.exist;

f1.exist=_bool;
_bool=del;

del=f1.del;

f1.del=_bool;

}

int GetColor(){return color;}

};
Figure **f;

Bonus bonus(5);
void Initialise()

{

f=new Figure *[10];
for (int i = 0; i < 10; i++)

{

f[i]=new Figure[10];

}

}
void Draw()

{

TRect t;

//background

t.left=0;

t.top=0;

t.right=Form1->Width;

t.bottom=Form1->Height;
//рисуем фон

Form1->Image1->Canvas->CopyRect(TRect(0,0,6000,6000),Form1->Image2- >Canvas,TRect(0,0,6000,6000));
Form1->Image1->Canvas->Brush->Style=bsSolid;
for (int i = 0; i < 10; i++)

{ Form1->Image1->Canvas->Brush->Style=bsSolid;

for (int j = 0; j < 10; j++)

{

if (!f[i][j].exist) continue;

if (!dragging)

{

t.left=f[i][j].y*width+(f[i][j].y)*space;

t.top=f[i][j].x*height+f[i][j].x*space;

t.right=f[i][j].y*width+(f[i][j].y)*space+width;

t.bottom=f[i][j].x*height+f[i][j].x*space+height;

}else

{

if (!(((path==1)&&(f[i][j].x==position.x))||((path==2)&&(f[i][j].y==position.y))))

{

t.left=f[i][j].y*width+(f[i][j].y)*space;

t.top=f[i][j].x*height+f[i][j].x*space;

t.right=f[i][j].y*width+(f[i][j].y)*space+width;

t.bottom=f[i][j].x*height+f[i][j].x*space+height;

}else //если двигаем

{


if (((path==1)&&(f[i][j].x==position.x))||((path==2)&&(f[i][j].y==position.y)))
{

t.left=f[i][j].y*width+(f[i][j].y)*space+dx;

t.top=f[i][j].x*height+f[i][j].x*space+dy;

t.right=f[i][j].y*width+(f[i][j].y)*space+width+dx;

t.bottom=f[i][j].x*height+f[i][j].x*space+height+dy;
}

}

}

switch (f[i][j].color)

{

case 0:Form1->Image1->Canvas->Brush->Color=clRed; break;

case 1:Form1->Image1->Canvas->Brush->Color=clGreen; break;

case 2:Form1->Image1->Canvas->Brush->Color=clYellow; break;

case 3:Form1->Image1->Canvas->Brush->Color=clGray; break;

case 4:Form1->Image1->Canvas->Brush->Color=clBlue; break;

case 5:Form1->Image1->Canvas->Brush->Color=clWhite; break;

}

if ((bonus.exist)&&(bonus.x==i)&&(bonus.y==j))

{

Form1->Image1->Canvas->Brush->Style= bsSolid;

TPoint p[3];

p[0].x=f[i][j].y*width+(f[i][j].y)*space+dx;

p[0].y=f[i][j].x*height+f[i][j].x*space+dy;
p[1].x=f[i][j].y*width+(f[i][j].y)*space+dx;

p[1].y=f[i][j].x*height+f[i][j].x*space+height+dy;
p[2].x=f[i][j].y*width+(f[i][j].y)*space+width+dx;

p[2].y=f[i][j].x*height+f[i][j].x*space+height+dy;

Form1->Image1->Canvas->Ellipse(f[i][j].y*width+(f[i][j].y)*space+dx,

f[i][j].x*height+f[i][j].x*space+dy,

f[i][j].y*width+(f[i][j].y)*space+width+dx,

f[i][j].x*height+f[i][j].x*space+height+dy);
Form1->Image1->Canvas->RoundRect(t,(t.left+t.right)/2,(t.top+t.bottom)/2);

}else

{

if (f[i][j].del)

Form1->Image1->Canvas->Brush->Style=bsDiagCross;

else

Form1->Image1->Canvas->Brush->Style=bsSolid;

Form1->Image1->Canvas->FillRect(t);

}

}

}

//следующий код необходим, чтобы убрать мерцание экрана при перерисовке
HRGN rgn;

rgn = CreateRectRgn(0,0,6000,6000);

SelectClipRgn(Form1->Image1->Canvas->Handle, rgn);

Form1->Canvas->CopyRect(TRect(0,0,6000,6000),Form1->Image1->Canvas,TRect(0,0,6000,6000));
DeleteObject(rgn);
Form1->StaticText2->Caption=score;

}
//поиск ряда одинаковых фигур и их уничтожение

void FindAndDestroy()

{

bool b;

long color;

int n=0;//кол-во фигур одинакового цвета
//по горизонтали

for (int j = 0; j < 10; j++)

{

if (n>1)

{

score+=(n-1);

//выключаем

for (int k = 9; k >= 9-n; k--)

{

f[j-1][k].del=true;

}
Draw();

Sleep(100);
for (int k = 9; k >= 9-n; k--)

{

f[j-1][k].exist=false;
if ((bonus.x==j-1)&&(bonus.y==k))

{

score+=20;

bonus.exist=false;

}

}

}

n=0;

color=-1;

for (int i = 0; i < 10; i++)

{

if (!f[j][i].exist)

{

if (n>1)

{

score+=(n-1);

//выключаем

for (int k = i-1; k >= i-1-n; k--)

{

f[j][k].del=true;

}
Draw();

Sleep(100);
for (int k = i-1; k >= i-1-n; k--)

{

f[j][k].exist=false;
if ((bonus.x==j)&&(bonus.y==k))

{

score+=20;

bonus.exist=false;

}

}

}

color=-1;

n=0;

continue;

}

if (color==f[j][i].color)

{

n++;

}else

{

if (n>1)

{

score+=(n-1);

//выключаем

for (int k = i-1; k >= i-1-n; k--)

{

f[j][k].del=true;

}
Draw();

Sleep(100);
for (int k = i-1; k >= i-1-n; k--)

{

f[j][k].exist=false;
if ((bonus.x==j)&&(bonus.y==k))

{

score+=20;

bonus.exist=false;

}

}

}

n=0;

}

color = f[j][i].color;

}

}
if (n>1)

{

score+=(n-1);

//выключаем

for (int k = 9; k >= 9-n; k--)

{

f[9][k].del=true;

}
Draw();

Sleep(100);

for (int k = 9; k >= 9-n; k--)

{

f[9][k].exist=false;
if ((bonus.x==9)&&(bonus.y==k))

{

score+=20;

bonus.exist=false;

}

}

}

n=0;

//по вертикали

for (int j = 0; j < 10; j++)

{

if (n>1)

{

score+=(n-1);

//выключаем

for (int k = 9; k >= 9-n; k--)

{

f[k][j-1].del=true;

}
Draw();

Sleep(100);
for (int k = 9; k >= 9-n; k--)

{

f[k][j-1].exist=false;
if ((bonus.x==k)&&(bonus.y==j-1))

{

score+=20;

bonus.exist=false;

}

}

}

n=0;

color=-1;

for (int i = 0; i < 10; i++)

{

if (!f[i][j].exist)

{

if (n>1)

{

score+=(n-1);

//выключаем
for (int k = i-1; k >= i-1-n; k--)

{

f[k][j].del=true;
if ((bonus.x==k)&&(bonus.y==j))

{

score+=20;

bonus.exist=false;

}

}
Draw();

Sleep(100);

for (int k = i-1; k >= i-1-n; k--)

{

f[k][j].exist=false;
if ((bonus.x==k)&&(bonus.y==j))

{

score+=20;

bonus.exist=false;

}

}

}

color=-1;

n=0;

continue;

}

if (color==f[i][j].color)

{

n++;

}else

{

if (n>1)

{

score+=(n-1);

//выключаем
for (int k = i-1; k >= i-1-n; k--)

{

f[k][j].del=true;

}
Draw();

Sleep(100);

for (int k = i-1; k >= i-1-n; k--)

{

f[k][j].exist=false;
if ((bonus.x==k)&&(bonus.y==j))

{

score+=20;

bonus.exist=false;

}

}

}

n=0;

}

color = f[i][j].color;

}

}
if (n>1)

{

score+=(n-1);

//выключаем
for (int k = 9; k >= 9-n; k--)

{

f[k][9].del=true;

}
Draw();

Sleep(100);

for (int k = 9; k >= 9-n; k--)

{

f[k][9].exist=false;
if ((bonus.x==k)&&(bonus.y==9))

{

score+=20;

bonus.exist=false;

}

}

}


}
//Функция Gravity()

bool Gravity()

{

bool r=false;

for (int k = 0; k < 2; k++)

for (int i = 8; i >=0; i--)

{

for (int j = 0; j < 10; j++)

{

if (!f[i+1][j].exist)

{

//поменять
f[i+1][j].exchange(f[i][j]);

f[i][j].exist=false;

r=true;
}
}

Draw();

}
return r;//возвращает 1, если были перемещения

}
void Initial()

{

Randomize();

for (int i = 0; i < 10; i++) {

for (int j = 0; j < 10; j++) {

f[i][j].x=i;

f[i][j].y=j;
f[i][j].color=Random(5);

f[i][j].exist=true;

}

}

}
void Start()

{

Initial();

}
//передвигает строчку или столбец

void Exchange(int n, bool hor, bool toad)

{

Figure d;

if (hor)

{

if (!toad)

{

d= f[n][9];

for (int i = 9; i >0 ; i--)

f[n][i].exchange(f[n][i-1]);

f[n][0].exchange(d);

}else

{

d= f[n][0];

for (int i = 0; i <9 ; i++)

f[n][i].exchange(f[n][i+1]);

f[n][9].exchange(d);

}

}else

{

if (!toad)

{

d= f[0][n];

for (int i = 0; i <9 ; i++)

f[i][n].exchange(f[i+1][n]);

f[9][n].exchange(d);

}else

{

d= f[9][n];

for (int i = 9; i >0 ; i--)

f[i][n].exchange(f[i-1][n]);

f[0][n].exchange(d);

}

}

}
//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

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

void __fastcall TForm1::Button2Click(TObject *Sender)

{

Initial();

Draw();

}

//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key;, TShiftState Shift)
{

TPoint a = GetMouseCoord3(position);

Figure t;

switch (Key)

{

case 37:FindAndDestroy();

case 38: Draw(); break;

case 39: t=f[0][0]; f[0][0]=f[9][9]; f[9][9]=t; break;

case 40: Initial(); Draw();break;

}

}

//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)

{

Initialise();

}

//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,

int X, int Y)

{

dragging=true;

TPoint p;

p = GetMouseCoord2();
//координаты курсора

x0=p.x;

y0=p.y;

//смещение

dx=dy=0;

//направление

path=0;


//координаты активной фигуры

p = GetMouseCoord();

if ((p.x==-1)||(p.y==-1)) {

dragging=false;

return;

}
position=p;
//насколько курсор мыши отстает от координат ближайшей ячейки

//используется в GetMouseCoord3()

delta = GetDelta();
Draw();

}

//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y)

{

if (!dragging) {

return;

}
TPoint mouse = GetMouseCoord2();

if (path==0)//направление не определено

if (abs(mouse.x-x0)>=abs(mouse.y-y0))//по х больше

path = 1;

else

path=2;
//направление известно

switch (path)

{

case 1: dx = mouse.x-x0; break;

case 2: dy = mouse.y-y0; break;

}
Draw();

}

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

int GenerateNewFigures()

{

for (int k = 0; k < 10; k++)

for (int i = 0; i < 10; i++)

{

if (!f[0][i].exist)

{

f[0][i].color=Random(5);

f[0][i].exist=true;

f[0][i].del=false;

Draw();

Gravity();

}

}

}

void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,

int X, int Y)

{

dragging=false; //отпускаем кнопку мыши

TPoint a = GetMouseCoord3(position);//получили фигуру, на которой остановили мышь
if (path==1) //если по горизонтали

{

if (a.y>position.y)

{
for (int i = position.y; i < a.y; i++)

Exchange(position.x,1,0);

bonus.y= a.y;

}else

{

for (int i = position.y; i > a.y; i--)

Exchange(position.x,1,1);
bonus.y= a.y;
}

}else if (path==2)//по вертикали

{

if (a.x>position.x)

{

for (int i = position.x; i < a.x; i++)

Exchange(position.y,0,1);

bonus.x= a.x;

}else

{

for (int i = position.x; i > a.x; i--)

Exchange(position.y,0,0);

bonus.x= a.x;

}

}
path=0;

dx=dy=0;

Draw();
FindAndDestroy();

// while (Gravity())

// {

// FindAndDestroy();

// Draw();

// }

Gravity();
// FindAndDestroy();

Draw();
GenerateNewFigures();

}

//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)

{

Draw();

}

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

void __fastcall TForm1::Timer1Timer(TObject *Sender)

{

Form1->Timer2->Enabled=true;

Form1->Timer1->Enabled=false;

bonus.x=Random(10);

bonus.y=Random(10);

bonus.exist=true;

Draw();

}

//---------------------------------------------------------------------------
void __fastcall TForm1::Timer2Timer(TObject *Sender)

{

// bonus.x=Random(10);

// bonus.y=Random(10);

bonus.exist=false;

Draw();

Form1->Timer1->Enabled=true;

Form1->Timer2->Enabled=false;

}

//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn1Click(TObject *Sender)

{

Form1->Close();

}

//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn2Click(TObject *Sender)

{

Panel2->Visible=false;

Start();

}

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


страница 1


скачать

Другие похожие работы: