Разработка интерактивного Win32-приложения в среде Microsoft Visual Studio

Знакомство с этапами и особенностями создания программы с помощью среды программирования MS Visual Studio C++ и с использованием библиотеки Microsoft Foundational Classes. Общая характеристика приложения, повторяющего общеизвестную игру "Колонки".

Рубрика Программирование, компьютеры и кибернетика
Вид контрольная работа
Язык русский
Дата добавления 16.09.2014
Размер файла 1,8 M

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

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

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

Разработка интерактивного Win32-приложения в среде Microsoft Visual Studio

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

Создание программы с использованием среды программирования MS Visual Studio C++ с использованием библиотеки Microsoft Foundational Classes (MFC).

Необходимо разработать алгоритм программы, которая выполняет перемещение фигур по экрану сверху вниз, координацию их местонахождения в соответствии с действиями играющего. Фигуры состоят из квадратов одинакового размера, набор фигур - конечный, последовательность выпадения фигур - случайная. Игрок должен вкладывать фигуры так, чтобы складывались рядом квадраты одинаковых цветов. При этом образованная из квадратов одинакового цвета фигура, должна автоматически исчезать. Результат - исполняемое приложение, повторяющее общеизвестную игру “Колонки”.

2.Описание интерфейса

игра программа microsoft

После запуска программы на экране появляется игровое поле с фигурой.

Рис.

Вверху экрана - игра. Игра содержит такие пункты:

* новая

* выход

Рис.

Имеется возможность выбрать уровень игры

Первый

Второй

Третий

Рис.

При проигрыше появляется информация о счёте.

Рис.

При составлении из кубиков одинакового цвета фигуры - фигура исчезает, баллы засчитываются в счёт.

Реализация в VS C++

#include<afxwin.h>

#include<stdio.h>

#include<time.h>

#include"resource.h"

#define size 20

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

// class Shape

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

class Shape

{

public:

bool cells[3][3]; // матрица сохраняет значение произведения для подвижного объекта

void NewShape(); // конструктор создает наш прямоугольник

void ClearShape(bool c[3][3]); // очищает матрицу cells[3][3]

};

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

{

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

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

c[i][j] = false;

}

void Shape::NewShape()

{

ClearShape(cells);

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

cells[i][0] = true;

}

//

class TetrisWnd : public CFrameWnd

{

public:

TetrisWnd();

void NewShape(); //создает новый объект родительского класса наверху окна типа стартует

COLORREF ShapeColor(int color); // мы имеем 5 цветов эта функция возвращает rgb цвет соответственно от номера

void SetLevel(int); //изменение уровня

bool CheckLeft(); // проверка можно сместить влево

bool CheckRight(); // проверка можно сместить вправо

void ShowTitle(); // show the window title

void CheckForLine(); // проверяет 3 одинаковые элементы стоят в ряд

bool IsAtBottom(); // проверка нет ли дна

void MoveUp(); //сдвигает элементы вверх

void MoveDown();//сдвигает элементы вниз

void ClearStock(); // очищает сохранены цвета

CRect GetRect(); // возвращает прямоугольник для функции стандартной нужно

private:

CMenu menu;

Shape shape;

short stock[20][10]; //сохраняет цвета неподвижных элементов очень важен массив цветов

int curY; //координаты подвижного прямоугольника

int curX;

bool bGame; //в игре или нет

int score;

int level;

bool level1;

bool level2;

bool level3;

int color[3]; // сохраняет номера цветов

protected:

protected:

virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

protected:

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

DECLARE_MESSAGE_MAP()

};

BEGIN_MESSAGE_MAP(TetrisWnd, CFrameWnd)

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)

END_MESSAGE_MAP()

TetrisWnd::TetrisWnd()

{

CString s = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,

AfxGetApp()->LoadStandardCursor(IDC_ARROW),

(HBRUSH)GetStockObject(BLACK_BRUSH),

AfxGetApp()->LoadIcon(IDI_ICON1));

Create(s, "Колонки");

menu.LoadMenu(IDR_MENU1);

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 = 220; //размеры окна

cs.cy = 460;

return CFrameWnd::PreCreateWindow(cs);

}

void TetrisWnd::MoveUp()

{

int c = color[0];

color[0] = color[1];

color[1] = color[2];

color[2] = c;

}

void TetrisWnd::MoveDown()

{

int c = color[2];

color[2] = color[1];

color[1] = color[0];

color[0] = c;

}

void TetrisWnd::OnPaint() //перерисовки элементов самая главная процедура

{

CPaintDC dc(this);

CBrush brush;

for (int i = 0; i < 3; i++) //рисует новый подвижной элемент в соответствии с координатами

{

brush.CreateSolidBrush(ShapeColor(color[i]));

dc.SelectObject(&brush);

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

{

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

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

}

brush.DeleteObject();

}

for (int i = 0; i < 20; i++) ///так как stock [i] [j] сохраняется все элементы то нам нужно их перерисовать

{

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

{

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

{

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

dc.SelectObject(&brush);

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

brush.DeleteObject();

}

}

}

}

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) //+ Нам нужно каждый раз следить или элемент может двигаться или ли сложилось 3 элемента в ряд

{

CPaintDC dc(this);

CBrush brush;

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

{

if (IsAtBottom()) //если элемент остановился

{

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

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

{

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

stock[curY / size + i][curX / 20 + j] = (color[i]); //сохраняем его цвета в массив неподвижных объектов есть stock чтобы позже его нарисовать

}

NewShape(); //создание нового подвижного объекта

if (IsAtBottom())

{

bGame = false;

}

InvalidateRect(GetRect());

CheckForLine(); //проверяем в 3 в ряд не собрались

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_CONTROL:

case VK_UP: MoveUp(); break;

case VK_LEFT: if (CheckLeft()) return; curX -= 20; break;

case VK_RIGHT: if (CheckRight()) return; curX += 20; break;

case VK_DOWN: MoveDown(); break;

case VK_SPACE: 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 < 3; i++)

{

for (int j = 0; j < 3; 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 = false;

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

if (stock[i][j] == stock[i][j + 1] && stock[i][j + 1] == stock[i][j + 2] && stock[i][j] != -1 && stock[i][j + 1] != -1 && stock[i][j + 2] != -1) flag = true;

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;

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

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

{

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

{

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

stock[k][j] = -1;

}

}

Invalidate();

}

void TetrisWnd::ShowTitle() //вывод результата

{

CString title;

title.Format("Колонки : %d", score);

SetWindowText(title);

}

bool TetrisWnd::CheckRight()

{

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

{

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

{

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

{

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

return true;

}

}

}

return false;

}

bool TetrisWnd::CheckLeft()

{

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

{

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

{

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

{

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

return true;

}

}

}

return false;

}

//системные функции

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, 0, 255);

case 2: return RGB(0, 255, 0);

case 3: return RGB(8, 232, 222);

case 4: return RGB(112, 41, 99);

}

return RGB(255, 255, 255);

}

void TetrisWnd::NewShape()

{

KillTimer(1);

SetTimer(1, level, NULL);

curY = 0;

curX = 60;

shape.NewShape();

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

color[i] = (rand() %4);

do

{

color[2] = (rand() % 4);

} while (color[2] == color[1]);

}

Выводы

В данной курсовой работе была выполнена поставленная задача - создание исполняемого приложения, повторяющего общеизвестную игру “Колонки”. При помощи этой программы можно приятно провести время, совершенствовать координацию и развивать логическое мышление. Программа не занимает много места, не требовательна к установленному программному обеспечению.

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

...

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

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