Автор: Пользователь скрыл имя, 06 Апреля 2012 в 10:24, курсовая работа
В данном документе описывается программа, написанная в соответствии с постановкой задачи на курсовое проектирование по теме "Тетрис" по дисциплине "Объектно-ориентированное программирование". Данная программа осуществляет вывод на экран случайным образом падение различных фигур. Входными данными является управление падающими фигурами.
Назначение программы - развлечение играющих, совершенствование их координации и логического мышления. Программа может применяться в качестве игровой на разных типах персональных компьютеров.
Оглавление
Содержание 2
Аннотация 3
Введение 4
Постановка задачи 5
Метод решения задачи 5
Алгоритм работы программы 6
Алгоритм процедуры обработки сообщения от таймера 7
Проектирование иерархии классов 8
Пример работы программы 11
Выводы по работе 11
Список используемой литературы 12
Приложение 13
END_MESSAGE_MAP()
TetrisWnd::TetrisWnd()
{
CString s=AfxRegisterWndClass(CS_
AfxGetApp()->
(HBRUSH)GetStockObject(BLACK_
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_
return TRUE;
}
};
// Создание одного и только одного экземпляра приложения
MyApp app;
//////////////////////////////
// Задание характеристик главного окна
BOOL TetrisWnd::PreCreateWindow(
{
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(
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(
dc.SelectObject(&brush);
dc.Rectangle(j*size,i*size,(j+
}
}
}
}
// Получить прямоугольник размещения формы
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]=
}
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]!
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]!
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]!
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; // Выбор цвета фигуры
}