Игра Tetris (язык программирования C++)

Разработка на языке С++ c использованием объектно-ориентированного программирования и отладка программы, которая осуществляет выполнение игры "TETRIS". Описание программных модулей. Инструкция пользователю. Методика и результаты тестирования программы.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 30.05.2014
Размер файла 47,0 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Введение

Созданием языков программирования занимаются в большинстве случаев очень квалифицированные люди, часто группы программистов, а иногда даже международные коллективы. Однако подавляющее большинство языков программирования умирало, едва родившись. Лишь к немногим из них был проявлен интерес, и буквально единицы получили действительно широкое распространение. К таким «счастливым» языкам принадлежит язык Си, разработанный Денисом Ритчи. Серьезное влияние на него оказали предшествующие языки BCPL и Би (B).

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

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

Среди преимуществ языка С++ можно отметить переносимость программ, написанных на языке С++, на компьютеры различной архитектуры и из одной операционной системы в другую с незначительными изменениями (или вообще без них), лаконичность записи алгоритмов, логическую стройность и удобочитаемость программ, возможность получить эффективный код программ, сравнимых по скорости с программами, написанными на ассемблере. Главное удобство языка С++ состоит в том, что он является одновременно и языком высокого уровня, имеющим полный набор конструкций структурного программирования, поддерживающим модульность, блочную структуру программ, возможность раздельной компиляции модулей, и в тоже самое время язык С++ имеет набор низкоуровневых средств, позволяющих добраться до каждого бита памяти.

К достоинствам языка С++ можно отнести и его высокую эффективность, так как его структура позволяет наилучшим образом использовать возможности современных персональных компьютеров.

Гибкость и универсальность языка С++ обеспечивают его широкое распространение среди программистов-профессионалов. Его можно использовать для решения практически всех типов задач.

Данный программный продукт игровая программа «TETRIS», написана на языке С++ с целью показать некоторые его основные свойства.

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

В курсовой работе требуется написать на языке С++ c использованием объектно-ориентированного программирования и отладить программу, осуществляющую выполнение игры «TETRIS». Исходный код программы разбит на 2 файла.

Необходимо разработать алгоритм, осуществляющий передвижение фигур по экрану сверху вниз, координацию их местоположения в соответствии с действиями играющего.

Фигуры состоят из квадратов одинакового размера, набор их конечен, последовательность появления фигур должна быть случайной, причем появления фигур должны быть равновероятными. Игрок должен укладывать фигуры на дно ящика с наибольшей плотностью (количество незаполненных квадратов должно быть минимальным). При этом слой, полностью заполненный квадратами, должен автоматически изыматься из ящика. Квадраты фигур не должны налагаться друг на друга. Поворот фигуры вокруг своей оси должен осуществляться таким образом, чтобы не были задеты другие фигуры, стенки, дно ящика.

Объектно-ориентированный анализ и проектирование системы на языке UML

Диаграмма вариантов использования

Рис. 1

Диаграммы классов

Диаграммы последовательности

1 2 3 4 5 1 2 3 4 5 6

1 - Генерация новой фигуры;

2 - Сдвиг фигуры влево;

3 - Сдвиг фигуры вправо;

4 - Поворот фигуры вокруг оси вращения;

5 - Быстрое падение;

6 - Удаление заполненной строки.

Диаграмма состояний

Программная реализация на языке С++. Краткая характеристика инструментальной программной среды

Для написания игровой программы «TETRIS» был выбран язык C++, т.к. в последнее время он является одним из наиболее распространенных языков объектно-ориентированного программирования.

Интегрированная среда разработки Visual C++ 6.0 представляет собой программный комплекс, который объединяет в себе текстовый редактор, ориентированный на создание программ на языке С++, редактор ресурсов, вьювер классов и т.д.

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

Структура программы

Исходный текст программы хранится в двух файлах: resource.h и tetris.cpp.

Resource.h: описание идентификаторов пунктов меню.

Tetris.cpp: описание и реализация классов shape и tetriswnd.

Входные данные:

Клавиши left, right, up, down;

Уровень игры (level1, level2, level3).

Выходными данными является информация, выводимая на экран в графическом режиме: рисунок ящика, падающие и лежащие на дне фигуры.

Описание реализации программных модулей

В состав программы входят функции отображения на экране движущихся фигурок, параллельного переноса их вправо и влево, поворота вокруг собственной оси, быстрого падения на дно короба и ряд вспомогательных функций (контроль наложения фигур, отображение элементов фигур и т.д.).

В соответствии с принципами объектно-ориентированного программирования данные в программе организованы в несколько классов:

class Shape // фигура

{

public:

boolcells[4][4];

ShapeTypecurType;

voidNewShape( ShapeType );

voidRotate();

voidClearShape( bool c[4][4] );

А также класс приложения TetrisWnd.

Инструкция пользователя

Запуск программы осуществляется командой tetris из каталога, содержащего файлы tetris.exe. Управление игрой осуществляется клавишами, представленными в таблице:

Название клавиши

Выполняемая функция

Стрелка вправо

Сдвиг фигуры вправо

Стрелка влево

Сдвиг фигуры влево

Стрелка вверх

Поворот фигуры вокруг собственной оси по часовой стрелке

Стрелка вниз

Падение фигуры до дна ящика

Методика и результаты тестирования программы

программирование игра тестирование пользователь

Утверждение о работоспособности программы осуществляется на основе следующих фактов:

1. независание фигуры при падении;

2. падение фигуры до дна ящика;

3. невыход фигуры за границы ящика;

4. сдвиг фигуры и поворот её на расстоянии от стенок;

5. неналожение фигуры при достижении лежащих на дне ящика других фигур;

6. изъятие слоя, не содержащего пустых ячеек (все ячейки заполнены квадратами фигур);

7. окончание игры при заполнении ящика или по команде игрока.

Надежное функционирование программы обеспечивается проверкой наложения при перемещении фигур и ограничением, накладываемым на набор входных данных (коды нажатых клавиш игнорируются, если эти клавиши не являются управляющими в игре).

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

1. Т.Павловская «С++: Учебник»

2. Б.Карпов, Т.Баранова «С++: Специальный справочник»

3. Г.Шилдт «Полный справочник по С»

4. И. Труб «Объектно-ориентированное моделирование на С++»

5. С. Холзнер «Visual C++ 6», учебный курс.

Приложение

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

Файл RESOURCE.H

//{{NO_DEPENDENCIES}}

// Microsoft Developer Studio generated include file.

// Used by Tetris.rc

//

#define IDR_MENU1 101

#define IDR_MENU 101

#define IDI_IC 102

#define IDD_ABOUT 105

#define ID_GAME_NEW 40001

#define ID_GAME_EXIT 40002

#define ID_HELP_ABOUT 40003

#define ID_LEVEL_LEVEL1 40007

#define ID_LEVEL_LEVEL2 40008

#define ID_LEVEL_LEVEL3 40009

// Next default values for new objects

//

#ifdef APSTUDIO_INVOKED

#ifndef APSTUDIO_READONLY_SYMBOLS

#define _APS_NEXT_RESOURCE_VALUE 107

#define _APS_NEXT_COMMAND_VALUE 40010

#define _APS_NEXT_CONTROL_VALUE 1003

#define _APS_NEXT_SYMED_VALUE 101

#endif

#endif

Файл Tetris.cpp

#include<afxwin.h>

#include<stdio.h>

#include<time.h>

#include"resource.h"

enum ShapeType { line, square, rightL, leftL, pyramide, leftZ, rightZ};//The

type of shape:

#define size 20//size of shape square

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

// class Shape

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

class Shape

{

public:

boolcells[4][4]; // 4x4 matrix that conatains the shape

ShapeTypecurType; // current type of shape

voidNewShape( ShapeType );

voidRotate();

voidClearShape( bool c[4][4] ); // clear the 4x4 matrix

};

void Shape::ClearShape( bool c[4][4] )

{

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

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

c[i][j]=false;

}

void Shape::NewShape( ShapeType type )

{

ClearShape(cells);

int i;

curType=type;

switch(type)

{

case line:for(i=0; i<4; i++)

cells[0][i]=true;

break;

case square:for(i=0; i<2; i++)

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

cells[i][j]=true;

break;

case leftL:for(i=0; i<3; i++)

cells[0][i]=true;

cells[1][2]=true;

break;

case rightL:for(i=0; i<3; i++)

cells[0][i]=true;

cells[1][0]=true;

break;

case pyramide:for(i=0; i<3; i++)

cells[1][i]=true;

cells[0][1]=true;

break;

case leftZ:cells[0][0]=true; cells[1][0]=true;

cells[1][1]=true; cells[2][1]=true;

break;

case rightZ:cells[0][1]=true; cells[1][0]=true;

cells[1][1]=true; cells[2][0]=true;

break;

}

}

void Shape::Rotate()

{

switch(curType)

{

case line:

{

int k;

if(cells[0][0]==true)

{

ClearShape(cells);

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

cells[k][1]=true;

}

else

{

ClearShape(cells);

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

cells[0][k]=true;

}

}

case square: return;

}

bool tempShape[4][4];

ClearShape(tempShape);

for(int j=3-1, c=0; j>=0 ; j--, c++)

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

tempShape[c][i]=cells[i][j];

ClearShape(cells);

for(int f=0; f<3; f++)

for(int d=0; d<3; d++)

cells[f][d]=tempShape[f][d];

}

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

// Tetris window class

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

class TetrisWnd : public CFrameWnd

{

public:

TetrisWnd();

void NewShape(); // appearance of new shape at the top

COLORREF ShapeColor(int color); // some reserved colors

void SetLevel(int);

bool CheckLeft(); // check the possibility to move on the left

bool CheckRight(); // check the possibility to move on the right

void ShowTitle(); // show the window title

void CheckForLine(); // check for the completed line

bool IsAtBottom(); // check the possibility to move on the bottom

void ClearStock(); // clear the field

CRect GetRect(); // get the rectangle of shape's placement

int color; // current color

private:

CMenumenu;

Shapeshape;

shortstock[20][10];

intcurY;

intcurX;

boolbGame;

intscore;

intlevel;

boollevel1;

boollevel2;

boollevel3;

protected:

//{{AFX_VIRTUAL(TetrisWnd)

protected:

virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

//}}AFX_VIRTUAL

protected:

//{{AFX_MSG(TetrisWnd)

afx_msg void OnPaint();

afx_msg void OnTimer(UINT nIDEvent);

afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);

afx_msg void OnGameNew();

afx_msg void OnGameExit();

afx_msg void OnClose();

afx_msg void OnLevelLevel1();

afx_msg void OnUpdateLevelLevel1(CCmdUI* pCmdUI);

afx_msg void OnLevelLevel2();

afx_msg void OnUpdateLevelLevel2(CCmdUI* pCmdUI);

afx_msg void OnLevelLevel3();

afx_msg void OnUpdateLevelLevel3(CCmdUI* pCmdUI);

afx_msg void OnHelpAbout();

//}}AFX_MSG

//{{AFX_DATA_MAP(TetrisWnd)

//}}AFX_DATA_MAP

//{{AFX_DATA(TetrisWnd)

//}}AFX_DATA

DECLARE_MESSAGE_MAP()

};

BEGIN_MESSAGE_MAP(TetrisWnd,CFrameWnd)

//{{AFX_MSG_MAP(TetrisWnd)

ON_WM_PAINT()

ON_WM_TIMER()

ON_WM_KEYDOWN()

ON_COMMAND(ID_GAME_NEW, OnGameNew)

ON_COMMAND(ID_GAME_EXIT, OnGameExit)

ON_WM_CLOSE()

ON_COMMAND(ID_LEVEL_LEVEL1, OnLevelLevel1)

ON_UPDATE_COMMAND_UI(ID_LEVEL_LEVEL1, OnUpdateLevelLevel1)

ON_COMMAND(ID_LEVEL_LEVEL2, OnLevelLevel2)

ON_UPDATE_COMMAND_UI(ID_LEVEL_LEVEL2, OnUpdateLevelLevel2)

ON_COMMAND(ID_LEVEL_LEVEL3, OnLevelLevel3)

ON_UPDATE_COMMAND_UI(ID_LEVEL_LEVEL3, OnUpdateLevelLevel3)

ON_COMMAND(ID_HELP_ABOUT, OnHelpAbout)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

TetrisWnd::TetrisWnd()

{

CString s=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,

AfxGetApp()->LoadStandardCursor(IDC_ARROW),

(HBRUSH)GetStockObject(BLACK_BRUSH),

AfxGetApp()->LoadIcon(IDI_IC));

Create(s,"Tetris");

menu.LoadMenu(IDR_MENU);

SetMenu(&menu);

level=700;

SetLevel(1);

srand(time(0));

ClearStock();

}

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

class MyApp : public CWinApp

{

public:

virtual BOOL InitInstance()

{

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;

cs.cy = 450;

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("You are lost !\rYour score is : "+s);

}

CFrameWnd::OnTimer(nIDEvent);

}

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

{

switch(nChar)

{

case VK_CONTROL:

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;

SetLevel(1);

NewShape();

ShowTitle();

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++;

ShowTitle();

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();

}

void TetrisWnd::ShowTitle()

{

CString title;

title.Format("Tetris score : %d",score);

SetWindowText(title);

}

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;

}

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

// Menu commands

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

void TetrisWnd::OnGameExit()

{

OnClose();

}

void TetrisWnd::OnClose()

{

KillTimer(1);

CFrameWnd::OnClose();

}

void TetrisWnd::OnLevelLevel1()

{

SetLevel(1);

}

void TetrisWnd::OnUpdateLevelLevel1(CCmdUI* pCmdUI)

{

pCmdUI->SetCheck(level1);

}

void TetrisWnd::OnLevelLevel2()

{

SetLevel(2);

}

void TetrisWnd::OnUpdateLevelLevel2(CCmdUI* pCmdUI)

{

pCmdUI->SetCheck(level2);

}

void TetrisWnd::OnLevelLevel3()

{

SetLevel(3);

}

void TetrisWnd::OnUpdateLevelLevel3(CCmdUI* pCmdUI)

{

pCmdUI->SetCheck(level3);

}

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

void TetrisWnd::SetLevel(int lev)

{

level1=level2=level3=false;

switch(lev)

{

case 1: level=700; level1=true; break;

case 2: level=500; level2=true; break;

case 3: level=300; level3=true; break;

}

}

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,level,NULL);

curY=0;

curX=60;

ShapeType t=ShapeType(rand()%7);

shape.NewShape(t);

color=rand()%6;

}

Размещено на Allbest.ru


Подобные документы

  • Процесс и порядок написания программы, реализующей графическое решение логической задачи (игры). Обзор аналогичных продуктов. Описание и алгоритм решения задачи. Структура программы, ее процедуры и функции. Настройка и руководство для пользователя.

    курсовая работа [35,7 K], добавлен 29.06.2010

  • Разработка программы логической игры в "крестики-нолики" пять в ряд на поле размера 15х15 клеток с применением графики на языке Pascal с использованием объектно-ориентированного программирования. Структура алгоритма программы и описание ее работы.

    курсовая работа [821,5 K], добавлен 13.02.2012

  • Разработка программы с использованием принципов объектно-ориентированного программирования на языке высокого уровня С средствами Microsoft Visual Studio 2010. Построение алгоритма реализации. Класс программы, инструкция по использованию программы.

    курсовая работа [1,0 M], добавлен 26.12.2013

  • Особенности визуальной среды программирования Microsoft Visual Studio 2015 Enterprise. Средства объектно-ориентированного программирования. Этапы проектирования программного комплекса. Отладка и тестирование программы игры "Виселица".

    курсовая работа [2,4 M], добавлен 31.01.2016

  • Особенности разработки приложений для операционной системы с помощью императивного, структурированного, объектно-ориентированного языка программирования Delphi. Формальное начало программы. Выделение конца программного блока. Листинг и описание программы.

    курсовая работа [1,2 M], добавлен 04.08.2014

  • Разработка программы обработки типизированных файлов с кодом на языке Object Pascal, с использованием компонентов Delphi для ввода и вывода данных. Разработка экранных форм и алгоритма программы. Описание программных модулей и инструкция оператору.

    курсовая работа [1,5 M], добавлен 08.02.2011

  • Исследование принципов объектно-ориентированного программирования на базе языка программирования С++. Разработка программного комплекса для ведения учёта памятников города. Описание процессов сортировки, поиска, формирования статистики по памятникам.

    курсовая работа [782,4 K], добавлен 26.05.2014

  • Описание принципа развивающей игры в слова "Виселица". Разработка программы, реализующей задачу данной игры на языке Delphi. Обоснование выбора среды программирования, листинг файла, результаты отладки и тестирования, руководство для пользователя.

    курсовая работа [572,7 K], добавлен 14.07.2012

  • Создание программы, реализующей игру "Линии". Среда разработки программы, описание ее общего вида. Основные алгоритмы программы. Реализация программы в среде разработки Microsoft Visual Studio 2008 на языке объектно-ориентированного программирования С++.

    курсовая работа [639,0 K], добавлен 16.03.2012

  • Понятие объектно-ориентированного программирования, характеристика используемых языков. Практическая разработка средств объектно-ориентированного программирования в задачах защиты информации: программная реализация на языке С++, а также Turbo Pascal.

    курсовая работа [275,9 K], добавлен 22.12.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.