Разделы презентаций


Основы программирования Лабораторная работа №8

Содержание

Делаем игру на основе 2D массива

Слайды и текст этой презентации

Слайд 1Основы программирования Лабораторная работа №8
Визуализация двухмерного массива.
Игра на основе двухмерного

массива.
(FOR запрещен к использованию!)

Власенко О.Ф.

Основы программирования Лабораторная работа №8Визуализация двухмерного массива. Игра на основе двухмерного массива.(FOR запрещен к использованию!)Власенко О.Ф.

Слайд 2Делаем игру на основе 2D массива

Делаем игру на основе 2D массива

Слайд 3Кодируем состояние игры в 2D массиве
#define N 10
#define M 15

int

a[N][M] = {
{ 3, 0, 1, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0 },
{ 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 2, 0, 0, 0 },

{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0 },
{ 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0 },
{ 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0 }
};

int steps = 0;
int gold = 0;

Коды ячеек
// 0 - свободно
// 1 - золото
// 2 - стена
// 3 - игрок

Кодируем состояние игры в 2D массиве#define N 10#define M 15int a[N][M] = {{ 3, 0, 1, 0,

Слайд 4Код функции WndProc
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,

LPARAM lParam)
{
switch (message)
{

case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);

DrawField(hdc);

EndPaint(hWnd, &ps);
}
break;

Код функции WndProcLRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){	switch (message)	{	case WM_PAINT:	{		PAINTSTRUCT ps;		HDC hdc =

Слайд 5Код функции WndProc
case WM_KEYDOWN:
switch (wParam)
{
case VK_DOWN:
moveDown();
InvalidateRect(hWnd, NULL, TRUE);
break;
case VK_LEFT:
moveToLeft();
InvalidateRect(hWnd, NULL,

TRUE);
break;
case VK_UP:
moveUp();
InvalidateRect(hWnd, NULL, TRUE);
break;
case VK_RIGHT:
moveToRight();
InvalidateRect(hWnd, NULL, TRUE);
break;
}
break;

Код функции WndProccase WM_KEYDOWN:		switch (wParam)		{		case VK_DOWN:			moveDown();			InvalidateRect(hWnd, NULL, TRUE);			break;		case VK_LEFT:			moveToLeft();			InvalidateRect(hWnd, NULL, TRUE);			break;		case VK_UP:			moveUp();			InvalidateRect(hWnd, NULL, TRUE);			break;		case VK_RIGHT:			moveToRight();			InvalidateRect(hWnd, NULL, TRUE);			break;		}		break;

Слайд 6Изменение состояния игры: двигаем игрока влево
void moveToLeft() {
int i, j;
i

= 0;
while (i < N) {
j = 1;
while (j

M) {
if (a[i][j] == 3) {
if (a[i][j - 1] == 0) {
a[i][j - 1] = 3;
a[i][j] = 0;
steps++;
} else if (a[i][j - 1] == 1) {
a[i][j - 1] = 3;
a[i][j] = 0;
steps++;
gold++;
}
}
j++;
}
i++;
}
}
Изменение состояния игры: двигаем игрока влевоvoid moveToLeft() {	int i, j;	i = 0;	while (i < N) {		j =

Слайд 7Изменение состояния игры: двигаем игрока вправо
void moveToRight() {
int i =

0;
while (i < N) {
int j = M - 2;
while

( j >= 0) {
if (a[i][j] == 3) {
if (a[i][j + 1] == 0) {
a[i][j + 1] = 3;
a[i][j] = 0;
steps++;
} else if (a[i][j + 1] == 1) {
a[i][j + 1] = 3;
a[i][j] = 0;
steps++;
gold++;
}
}
j--;
}
i++;
}
}
Изменение состояния игры: двигаем игрока вправоvoid moveToRight() {	int i = 0;	while (i < N) {		int j =

Слайд 8Изменение состояния игры: двигаем игрока вверх
void moveUp() {
int i =

1;
while (i < N) {
int j = 0;
while (j

M) {
if (a[i][j] == 3) {
if (a[i - 1][j] == 0) {
a[i - 1][j] = 3;
a[i][j] = 0;
steps++;
} else if (a[i - 1][j] == 1) {
a[i - 1][j] = 3;
a[i][j] = 0;
steps++;
gold++;
}
}
j++;
}
i++;
}
}
Изменение состояния игры: двигаем игрока вверхvoid moveUp() {	int i = 1;	while (i < N) {		int j =

Слайд 9Изменение состояния игры: двигаем игрока вниз
void moveDown() {
int i =

N;
while (i >= 0) {
int j = 0;
while (j

M) {
if (a[i][j] == 3) {
if (a[i + 1][j] == 0) {
a[i + 1][j] = 3;
a[i][j] = 0;
steps++;
} else if (a[i + 1][j] == 1) {
a[i + 1][j] = 3;
a[i][j] = 0;
steps++;
gold++;
}
}
j++;
}
i--;
}
}
Изменение состояния игры: двигаем игрока внизvoid moveDown() {	int i = N;	while (i >= 0) {		int j =

Слайд 10Отрисовка состояния игры

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,

LPARAM lParam)
{
switch (message)
{
...
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);

DrawField(hdc);

EndPaint(hWnd, &ps);
}
break;
...
return

0;
}
Отрисовка состояния игрыLRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){	switch (message)	{	...	case WM_PAINT:	{		PAINTSTRUCT ps;		HDC hdc =

Слайд 11Отрисовка состояния игры (2)
int sizeX = 36;
int sizeY = 30;

void

DrawField(HDC hdc) {

HBRUSH hBrushEmptyCell; //создаём кисть для пустого поля
hBrushEmptyCell =

CreateSolidBrush(RGB(200, 200, 200)); // серый

HBRUSH hBrushGold; //создаём кисть для поля с золотом
hBrushGold = CreateSolidBrush(RGB(255, 255, 0)); // желтый

HBRUSH hBrushWall; //создаём кисть для стены
hBrushWall = CreateSolidBrush(RGB(0, 0, 0)); // черный

HBRUSH hBrushMan; //создаём кисть для игрока
hBrushMan = CreateSolidBrush(RGB(0, 0, 255)); // синий
Отрисовка состояния игры (2)int sizeX = 36;int sizeY = 30;void DrawField(HDC hdc) {	HBRUSH hBrushEmptyCell; //создаём кисть для

Слайд 12Отрисовка состояния игры (3)
int i, j;
i = 0;
while (i

N) {
j = 0;
while (j < M) {
RECT rect =

{ j * sizeX,i * sizeY, (j + 1) * sizeX,(i + 1) * sizeY };
if (a[i][j] == 0) {
FillRect(hdc, &rect, hBrushEmptyCell);
} else if (a[i][j] == 1) {
FillRect(hdc, &rect, hBrushGold);
} else if (a[i][j] == 2) {
FillRect(hdc, &rect, hBrushWall);
} else if (a[i][j] == 3) {
FillRect(hdc, &rect, hBrushMan);
} else {
// тут никогда не должны оказаться
}
j++;
}
i++;
}
Отрисовка состояния игры (3)int i, j;i = 0;while (i < N) {	j = 0;	while (j < M)

Слайд 13Отрисовка состояния игры (4)
HFONT hFont;
hFont = CreateFont(20,
0, 0, 0, 0,

0, 0, 0,
DEFAULT_CHARSET,
0, 0, 0, 0,
L"Courier New"
);
SelectObject(hdc, hFont);
SetTextColor(hdc, RGB(0, 128,

128));

TCHAR string1[] = _T("сделано ходов:");
TCHAR string2[] = _T("собрано золота:");
TextOut(hdc, 10, sizeY * (N + 1), (LPCWSTR)string1, _tcslen(string1));
TextOut(hdc, 10, sizeY * (N + 1) + 20, (LPCWSTR)string2, _tcslen(string2));
Отрисовка состояния игры (4)HFONT hFont;hFont = CreateFont(20,	0, 0, 0, 0, 0, 0, 0,	DEFAULT_CHARSET,	0, 0, 0, 0,	L

Слайд 14Отрисовка состояния игры (5)
char sSteps[5];
TCHAR tsSteps[5];
sprintf(sSteps, "%d", steps);
OemToChar(sSteps, tsSteps);
TextOut(hdc, 220,

sizeY * (N + 1), (LPCWSTR)tsSteps, _tcslen(tsSteps));

char sGold[5];
TCHAR tsGold[5];
sprintf(sGold, "%d",

gold);
OemToChar(sGold, tsGold);
TextOut(hdc, 220, sizeY * (N + 1) + 20, (LPCWSTR)tsGold, _tcslen(tsGold));

DeleteObject(hFont);
DeleteObject(hBrushEmptyCell);
DeleteObject(hBrushGold);
DeleteObject(hBrushWall);
DeleteObject(hBrushMan);

} // конец функции void DrawField(HDC hdc)
Отрисовка состояния игры (5)char sSteps[5];TCHAR tsSteps[5];sprintf(sSteps,

Слайд 15Вставь в правильное место!!
Чтобы успешно заработали небезопасные функции ввода/вывода, нужно

подключить stdio.h, и определить константу
#define _CRT_SECURE_NO_WARNINGS
в файле stdafx.h

Вставь в правильное место!!Чтобы успешно заработали небезопасные функции ввода/вывода, нужно подключить stdio.h, и определить константу#define _CRT_SECURE_NO_WARNINGS в

Слайд 16Задача 1. Собрать игру из исходников!

Задача 1. Собрать игру из исходников!

Слайд 17Задача 2.
При нажатии клавиши ‘L’ слева от игрока вставить элемент

стены.

Задача 2.При нажатии клавиши ‘L’ слева от игрока вставить элемент стены.

Слайд 18Задача 3.
При нажатии клавиши ‘R’ непосредственно справа от игрока вставить

элемент стены.

Задача 3.При нажатии клавиши ‘R’ непосредственно справа от игрока вставить элемент стены.

Слайд 19Задача 4.
При нажатии клавиши ‘Z’ уничтожить элементы стен начиная справа

от игрока и до правой границы игрового поля.

Задача 4.При нажатии клавиши ‘Z’ уничтожить элементы стен начиная справа от игрока и до правой границы игрового

Слайд 20Задача 5.1*.
При нажатии клавиши ‘A’ уничтожить все элементы стен, которых

непосредственно касается игрок – со всех сторон!

Задача 5.1*.При нажатии клавиши ‘A’ уничтожить все элементы стен, которых непосредственно касается игрок – со всех сторон!

Слайд 21Задача 5.2*.
При нажатии клавиши ‘O’ уничтожить все элементы стен со

всех сторон на расстояние 2!

Задача 5.2*.При нажатии клавиши ‘O’ уничтожить все элементы стен со всех сторон на расстояние 2!

Слайд 22Задача 6*.
При нажатии клавиши ‘D’ в столбце, где больше всего

элементов стен, удалить самый верхний элемент стены.

Задача 6*.При нажатии клавиши ‘D’ в столбце, где больше всего элементов стен, удалить самый верхний элемент стены.

Слайд 23Домашнее задание
Добавить еще 3-5 действий при нажатии на выбранные

вами клавиши!

Домашнее задание Добавить еще 3-5 действий при нажатии на выбранные вами клавиши!

Слайд 24Отчет по лабораторной работе
Стандартный набор!

Распечатки всех задач – 2,3, 4,

5.1, 5.2, Ваших действий.

Блок схемы для Ваших действий.
Усеченная трассировка (для

массива 2 x 3 элемента) для ваших действий.

Вывод!

Отчет по лабораторной работеСтандартный набор!Распечатки всех задач – 2,3, 4, 5.1, 5.2, Ваших действий.Блок схемы для Ваших

Слайд 25Источники информации
Virtual-Key Codes - https://msdn.microsoft.com/ru-ru/library/windows/desktop/dd375731%28v=vs.85%29.aspx

Источники информацииVirtual-Key Codes - https://msdn.microsoft.com/ru-ru/library/windows/desktop/dd375731%28v=vs.85%29.aspx

Обратная связь

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

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

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


Для правообладателей

Яндекс.Метрика