Тетрис

Автор: Пользователь скрыл имя, 06 Апреля 2012 в 10:24, курсовая работа

Краткое описание

В данном документе описывается программа, написанная в соответствии с постановкой задачи на курсовое проектирование по теме "Тетрис" по дисциплине "Объектно-ориентированное программирование". Данная программа осуществляет вывод на экран случайным образом падение различных фигур. Входными данными является управление падающими фигурами.

Назначение программы - развлечение играющих, совершенствование их координации и логического мышления. Программа может применяться в качестве игровой на разных типах персональных компьютеров.

Оглавление

Оглавление

Содержание 2

Аннотация 3

Введение 4

Постановка задачи 5

Метод решения задачи 5

Алгоритм работы программы 6

Алгоритм процедуры обработки сообщения от таймера 7

Проектирование иерархии классов 8

Пример работы программы 11

Выводы по работе 11

Список используемой литературы 12

Приложение 13

Файлы: 1 файл

Курсовая_тетрис.docx

— 128.94 Кб (Скачать)

END_MESSAGE_MAP()

 

TetrisWnd::TetrisWnd()

{

CString s=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW , // Перерисовка окна при изменении по height и width

AfxGetApp()->LoadStandardCursor(IDC_ARROW), // Загрузка стандартного указателя мыши

(HBRUSH)GetStockObject(BLACK_BRUSH), // Цвет фона окна

AfxGetApp()->LoadIcon(IDI_IC));  // Идентификатор ресурса для значка приложения

Create(s,"Tetris");    // Cтрока, отображаемая в заголовке окна.

menu.LoadMenu(IDR_MENU);  // Идентификатор ресурса для меню

SetMenu(&menu);  // Устанавливаем и перерисовываем меню окна

speed=300;   // Скорость падения фигуры

srand(time(0));  // При команде rand генерировать разные числа (для фигур)

ClearStock();  // Очистить игровое поле

}

 

/////////////////////////////////////////////////////////////////

// Класс приложения. Должен существовать только один  экземпляр этого класса.

// Функция InitInstance() вызывается при запуске приложения.

class MyApp : public CWinApp

{public:

virtual BOOL InitInstance()

{

// Создание главного  окна приложения и его отображение.

// Член MyApp::m_pMainWnd - это  указатель на объект главного  окна.

m_pMainWnd = new TetrisWnd;

m_pMainWnd->ShowWindow(SW_SHOWNORMAL);

return TRUE;

}

};

// Создание одного  и только одного экземпляра  приложения

MyApp app;

 

//////////////////////////////////////////////////////////////////

// Задание характеристик  главного окна

BOOL TetrisWnd::PreCreateWindow(CREATESTRUCT& cs)

{

cs.style &= ~WS_MAXIMIZEBOX; // Создает окно, которое НЕ имеет кнопку развертывания окна

cs.style &= ~WS_THICKFRAME;  // Создает окно, которое НЕ имеет рамку изменения размеров

cs.cx = 210;     // Размер окна по X

cs.cy = 450;     // Размер окна по Y

return CFrameWnd::PreCreateWindow(cs); // Применяем характеристики окна перед его созданием

}

 

// Перерисовка окна 

void TetrisWnd::OnPaint()

{

CPaintDC dc(this);  

int i,j;

 

CBrush brush;

brush.CreateSolidBrush(ShapeColor(color));

dc.SelectObject(&brush);

// Заполнение матрицы  форм (фигур) цветом

for(i=0; i<4; i++)

{

for(j=0; j<4; j++)

{

if(shape.cells[i][j]==true)

dc.Rectangle(curX+j*size, curY+i*size, curX+(j+1)*size, curY+(i+1)*size);

}

}

// Заполнение игрового  поля фигурами

for(i=0; i<20; i++)

{

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

{

if(stock[i][j]!=-1)

{

brush.DeleteObject();

brush.CreateSolidBrush(ShapeColor(stock[i][j]));

dc.SelectObject(&brush);

dc.Rectangle(j*size,i*size,(j+1)*size,(i+1)*size);

}

}

}

}

 

// Получить прямоугольник  размещения формы

CRect TetrisWnd::GetRect()

{

CRect r;

r.left=curX-size;

r.right=curX+size*5;

r.top=curY-size;

r.bottom=curY+size*5;

return r;

}

 

// Таймер

void TetrisWnd::OnTimer(UINT nIDEvent)

{ // Перемещение фигуры вниз

if(nIDEvent==1 && bGame==true)

{

if(IsAtBottom()) // Проверка возможности движения вниз

{

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

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

{

if(shape.cells[i][j]==true)

stock[curY/20+i][curX/20+j]=color;

}

NewShape();

if(IsAtBottom())

{

bGame=false; 

}

InvalidateRect(GetRect());  // Включает указанный прямоугольник в область обновления окна

CheckForLine(); // Проверка на завершенную (заполненную) линию

return;

}

curY+=20;

InvalidateRect(GetRect());  // Включает указанный прямоугольник в область обновления окна

else if(bGame==false)

{

KillTimer(1);

CString s;

s.Format("%d",score);  // Вывести результат

MessageBox("Вы проиграли !\rВаш результат : "+s);

}

 

CFrameWnd::OnTimer(nIDEvent);

}

 

// Обработчик нажатия  клавиши

void TetrisWnd::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)

{

switch(nChar)

{

case VK_UP:   shape.Rotate(); break; // Повернуть фигуру

case VK_LEFT:  if(CheckLeft()) return; curX-=20; break; // Переместить влево

case VK_RIGHT:  if(CheckRight()) return; curX+=20; break; // Переместить вправо

case VK_DOWN:  KillTimer(1); SetTimer(1,20,NULL); break; // Опустить вниз

}

InvalidateRect(GetRect());  // Включает указанный прямоугольник в область обновления окна

 

CFrameWnd::OnKeyDown(nChar, nRepCnt, nFlags);

}

 

// Новая игра

void TetrisWnd::OnGameNew()

{

ClearStock(); // Очистить игровое поле 

score=0;  // Подсчет счета

bGame=true;  // True - есть место для падение фигур. False - нет

NewShape();  // Создание новой формы наверху

Invalidate(); // Отрисовать компонент

}

 

// Очистить игровое  поле 

void TetrisWnd::ClearStock()

{

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

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

stock[i][j]=-1;

}

 

// Проверка возможности  двигать фигуру вниз

bool TetrisWnd::IsAtBottom()

{

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

{

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

{

if(shape.cells[i][j]==true)

{

if((curY/20+i)>=19 || stock[curY/20+i+1][curX/20+j]!=-1)

return true;

}

}

}

return false;

}

 

// Проверка на  завершенную (заполненную) линию

void TetrisWnd::CheckForLine()

{

int i,j,k,c=0;

bool flag;

 

for(i=0; i<20; i++)

{

flag=true;

 

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

flag &= (stock[i][j]!=-1);

 

if(flag==true && j!=0)

{

c++;

score++;

for(k=i; k>0; k--)

{

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

{

stock[k][j]=stock[k-1][j];

}

}

}

}

for(k=0; k<c; k++)

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

stock[k][j]=-1;

 

Invalidate(); // Отрисовать компонент

}

 

// Проверка возможности  переместиться вправо

bool TetrisWnd::CheckRight()

{

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

{

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

{

if(shape.cells[i][j]==true)

{

if((curX/20+j)>=9 || stock[curY/20+i][curX/20+j+1]!=-1)

return true;

}

}

}

return false;

}

 

// Проверка возможности  переместиться влево

bool TetrisWnd::CheckLeft()

{

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

{

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

{

if(shape.cells[i][j]==true)

{

if((curX/20+j)<=0 || stock[curY/20+i][curX/20+j-1]!=-1)

return true;

}

}

}

return false;

}

 

////////////////////////////////////////////////////////////////////////////////

// Команды главного меню

////////////////////////////////////////////////////////////////////////////////

void TetrisWnd::OnGameExit()

{

OnClose();  // Выход из игры

}

 

void TetrisWnd::OnClose()

{

KillTimer(1); // Уничтожаем событие таймеpа

CFrameWnd::OnClose(); // Завершение процесса

}

 

void TetrisWnd::OnHelpAbout()

{

CDialog dlg(IDD_ABOUT);

dlg.DoModal(); // Вызов справки

}

/////////////////////////////////////////////////////////////////////////////////

// Зарезервированные цвета фигур

COLORREF TetrisWnd::ShapeColor(int color)

{

switch(color)

{

case 0: return RGB(255,0,0); // Красный

case 1: return RGB(0,255,0); // Зеленый

case 2: return RGB(0,0,255); // Синий

case 3: return RGB(255,0,255); // Пурпурный

case 4: return RGB(0,255,255); // Голубой

case 5: return RGB(255,255,0); // Желтый

}

return RGB(255,255,255);

}

 

// Создание новой формы вверху окна

void TetrisWnd::NewShape()

{

KillTimer(1);

SetTimer(1,speed,NULL);

curY=0;  // Координаты положения новой

curX=60; // созданной фигуры

ShapeType t=ShapeType(rand()%7); // Случайная генерация формы фигуры

shape.NewShape(t);

color=rand()%6;  // Выбор цвета фигуры

}

 


Информация о работе Тетрис