在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例C/C++游戏开发 → <赞>c++ 推箱子 游戏开发示例

<赞>c++ 推箱子 游戏开发示例

C/C++游戏开发

下载此实例
  • 开发语言:C/C++
  • 实例大小:3.21M
  • 下载次数:36
  • 浏览次数:506
  • 发布时间:2019-04-11
  • 实例类别:C/C++游戏开发
  • 发 布 人:maye
  • 文件格式:.zip
  • 所需积分:2
 相关标签: 推箱子

实例介绍

【实例简介】

在推箱子游戏的基础上增加如下功能:

1:对于撞墙要有撞墙方向提醒

2:对于撞箱子,也要进行提醒

3:游戏可回退一步

4:把通关数至少增加到10关(不能有同样地图的“关”)


【实例截图】

from clipboard


 from clipboard


from clipboard

from clipboard


from clipboard



【核心代码】

#include <windows.h>
#include "BoxGame.h"
#include <commctrl.h>
#pragma comment(lib,"comctl32.lib")
#include <stdio.h>
#define NLEVEL 10

HINSTANCE hInst;
HWND hdlgSelect; // 选择关卡对话框句柄
HWND hLevelCombo; // 输入的关卡
HWND hwnd;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 	//窗口函数说明
BOOL CALLBACK DlgHelpProc(HWND, UINT, WPARAM, LPARAM); // 处理帮助对话框
BOOL CALLBACK DlgSelectProc(HWND, UINT, WPARAM, LPARAM); // 处理选择关卡对话框
void IniMap(int GameMap[][9], int GameMapOri[][8][9], int level); // 初始化地图


//游戏地图
// 0:墙   1:路   2:人   3:终点   4:箱子   5:人在终点上   6:箱子在终点上
char remind[10] = { '\0' };
int GameMap[8][9] = { 0 };
int FormerMap[8][9] = { 0 };
int countMap[NLEVEL] = { 5,4,3,5,3,3,3,4,4,5 };
int GameMapOri[NLEVEL][8][9] = { 
					{0, 0, 0, 0, 0, 0, 0, 0, 0,
					 0, 0, 0, 0, 0, 0, 0, 0, 0,
					 0, 0, 0, 0, 1, 1, 1, 1, 0,
					 0, 0, 3, 1, 4, 0, 0, 1, 0,
					 0, 3, 3, 4, 1, 4, 1, 2, 0,
					 0, 3, 3, 1, 4, 1, 4, 1, 0,
					 0, 0, 0, 0, 0, 0, 1, 1, 0,
					 0, 0, 0, 0, 0, 0, 0, 0, 0,},

					{0, 0, 0, 0, 0, 0, 0, 0, 0,
					 0, 0, 0, 3, 3, 0, 0, 0, 0,
					 0, 0, 0, 1, 3, 0, 0, 0 ,0,
					 0, 0, 1, 1, 4, 3, 0, 0, 0,
					 0, 0, 1, 4, 1, 1, 0, 0, 0,
					 0, 1, 1, 0, 4, 4, 1, 0, 0,
					 0, 1, 1, 2, 1, 1, 1, 0, 0,
					 0, 0, 0, 0, 0, 0, 0, 0, 0},

					{0, 0, 0, 0, 0, 0, 0, 0, 0,
					 0, 1, 1, 1, 0, 3, 1, 0, 0,
					 0, 3, 1, 1, 4, 1, 1, 0 ,0,
					 0, 0, 4, 0, 0, 1, 1, 0, 0,
					 0, 1, 1, 0, 0, 4, 0, 0, 0,
					 0, 1, 1, 2, 1, 1, 1, 0, 0,
					 0, 1, 3, 0, 1, 1, 1, 0, 0,
					 0, 0, 0, 0, 0, 0, 0, 0, 0},

					{0, 0, 0, 0, 0, 0, 0, 0, 0,
					 0, 1, 1, 1, 0, 0, 0, 0, 0,
					 0, 1, 0, 1, 0, 1, 1 ,1 ,0,
					 0, 1, 4, 1, 1, 1, 4, 1, 0,
					 0, 3, 3, 0, 4, 0, 4, 1, 0,
					 0, 3, 2, 4, 1, 1, 1, 1, 0,
					 0, 3, 3, 1, 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, 1, 2, 3, 3, 3, 0, 0,
					 0, 0, 1, 1, 1, 0, 0 ,0 ,0,
					 0, 0, 0, 4, 1, 1, 1, 1, 0,
					 0, 1, 1, 1, 0, 4, 0, 1, 0,
					 0, 1, 4, 1, 0, 1, 1, 1, 0,
					 0, 1, 1, 1, 0, 0, 0, 0, 0,
					 0, 0, 0, 0, 0, 0, 0, 0, 0},

					 {0, 2, 1, 1, 1, 0, 0, 0, 0,
					 0, 1, 4, 4, 0, 1, 0, 0, 0,
					 0, 1, 4, 1, 0, 1, 0, 3, 0,
					 0, 0, 0, 1, 0, 0, 0, 3, 0,
					 0, 0, 0, 1, 1, 1, 1, 3, 0,
					 0, 0, 1, 1, 1, 0, 1, 1, 0,
					 0, 0, 1, 1, 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, 2, 1, 0, 0, 0, 0, 0,
					 0, 0, 1, 4, 1, 1, 0 ,0 ,0,
					 0, 0, 0, 1, 0, 1, 0, 0, 0,
					 0, 3, 0, 1, 0, 1, 1, 0, 0,
					 0, 3, 4, 1, 1, 0, 1, 0, 0,
					 0, 3, 1, 1, 1, 4, 1, 0, 0,
					 0, 0, 0, 0, 0, 0, 0, 0, 0},

					{0, 0, 0, 0, 0, 0, 0, 0, 0,
					 0, 0, 1, 1, 1, 1, 1, 0, 0,
					 0, 0, 4, 0, 0, 0, 1 ,1 ,1,
					 0, 1, 2, 1, 4, 1, 1, 4, 1,
					 0, 1, 3, 3, 0, 1, 4, 1, 0,
					 0, 0, 3, 3, 0, 1, 1, 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, 1, 1, 1, 1, 1, 0, 0, 0,
					 0, 1, 4, 4, 4, 0, 0 ,0 ,0,
					 0, 1, 1, 0, 3, 3, 0, 0, 0,
					 0, 0, 1, 1, 3, 3, 4, 1, 0,
					 0, 0, 1, 2, 1, 1, 1, 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, 1, 1, 0, 1, 2, 0,
					 0, 0, 1, 1, 1, 0, 1 ,1 ,0,
					 0, 0, 4, 1, 4, 1, 4, 1, 0,
					 0, 0, 1, 4, 0, 0, 1, 1, 0,
					 0, 0, 1, 4, 1, 0, 1, 1, 0,
					 3, 3, 3, 3, 3, 1, 1, 0, 0,
					 0, 0, 0, 0, 0, 0, 0, 0, 0} };
void RectCopy(int a[8][9], int b[8][9])
{
	for (int i = 0; i < 8;   i)
		for (int j = 0; j < 9;   j)
			a[i][j] = b[i][j];
}
int x1 = 0, y1 = 0, x2 = 0, y2 = 0, x3 = 0, y3 = 0;
int formerx, formery;
int mx = 0, my = 0;
int level = 0; // 当前关卡数
BOOL isPlay = FALSE; // 是否正在进行游戏

//------------ 以下初始化窗口类----------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int	nCmdShow)
{

	MSG Msg;
	WNDCLASS wndclass;
	HACCEL hAccel; // ---加速键资源---
	char lpszMenuName[] = "GameMenu"; // ----菜单名称----
	char lpszClassName[] = "BoxGame";
	char lpszTitle[] = "BoxGame";

	//窗口类的定义
	wndclass.style = 0;
	wndclass.lpfnWndProc = WndProc;
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.hInstance = hInstance; ;
	wndclass.hIcon = LoadIcon(hInstance, "BoxIcon");
	wndclass.hCursor = LoadCursor(hInstance, "BoxCursor");
	wndclass.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(236, 240, 77)); //窗口背景为黄色(路的颜色)
	wndclass.lpszMenuName = NULL;//lpszMenuName ;			
	wndclass.lpszClassName = lpszClassName;

	//--------------- 以下进行窗口类的注册 -----------------
	if (!RegisterClass(&wndclass))
	{
		MessageBeep(0);
		return FALSE;
	}

	//创建窗口
	hwnd = CreateWindow(
		lpszClassName,
		lpszTitle,
		WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX,//WS_OVERLAPPEDWINDOW,	
		CW_USEDEFAULT,
		0,
		558,
		580,			//窗口的高和宽
		NULL,
		NULL,
		hInstance,
		NULL);
	hInst = hInstance; //--------
	ShowWindow(hwnd, nCmdShow);
	UpdateWindow(hwnd);

	//-----加载加速键资源-----
	hAccel = LoadAccelerators(hInstance, lpszMenuName);
	while (GetMessage(&Msg, NULL, 0, 0)) {
		// 截获非模态对话框消息并发往处理函数
		if (!IsDialogMessage(hdlgSelect, &Msg)) {
			//在消息循环中截获加速键消息
			if (!TranslateAccelerator(hwnd, hAccel, &Msg)) {
				TranslateMessage(&Msg);
				DispatchMessage(&Msg);
			}
		}
	}

	return Msg.wParam;
}
//窗口函数
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM  wParam, LPARAM lParam)
{
	HDC hDC;
	HDC hdcmem;			//内存设备环境句柄	
	HBITMAP hBm;		//位图句柄
	BITMAP bm;			//BITMAP结构
	PAINTSTRUCT PtStr;
	HBRUSH hBrush;
	HMENU hMenu;
	int count;
	HWND hToolbar;
	TBBUTTON tbb[4];
	LPNMHDR lpnmhdr;
	LPTOOLTIPTEXT lpttext;
	switch (message) {
	case WM_CREATE:
		if (isPlay) {
			HINSTANCE hThisInstance = GetModuleHandle(NULL);
			IniMap(GameMap, GameMapOri, level);
			// 加载菜单
			hMenu = LoadMenu(hThisInstance, "GAMEMENU");
			SetMenu(hwnd, hMenu);
			// 创建工具条图像列表	
			HIMAGELIST  hImgList = ImageList_Create(15, 15, ILC_COLOR32 | ILC_MASK, 0, 0);
			// 打开位图,将其加进图像列表
			int ImgID[4];
			HBITMAP hBitmap = NULL;
			hBitmap = LoadBitmap(hThisInstance, MAKEINTRESOURCE(IDB_RESTART));
			ImgID[0] = ImageList_Add(hImgList, hBitmap, NULL);
			hBitmap = LoadBitmap(hThisInstance, MAKEINTRESOURCE(IDB_NEXT));
			ImgID[1] = ImageList_Add(hImgList, hBitmap, NULL);
			hBitmap = LoadBitmap(hThisInstance, MAKEINTRESOURCE(IDB_PREV));
			ImgID[2] = ImageList_Add(hImgList, hBitmap, NULL);
			hBitmap = LoadBitmap(hThisInstance, MAKEINTRESOURCE(IDB_SET));
			ImgID[3] = ImageList_Add(hImgList, hBitmap, NULL);
			// 创建工具条
			hToolbar = CreateWindowEx(0, TOOLBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE | TBSTYLE_TOOLTIPS, 0, 0, 0, 0, hwnd, (HMENU)IDR_TOOLBAR, hThisInstance, NULL);
			SendMessage(hToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
			SendMessage(hToolbar, TB_SETIMAGELIST, 0, (LPARAM)hImgList); // 为工具栏设置图像列表				
			ZeroMemory(tbb, sizeof(tbb));
			tbb[0].iBitmap = ImgID[0];
			tbb[0].fsState = TBSTATE_ENABLED;
			tbb[0].fsStyle = TBSTYLE_BUTTON;
			tbb[0].idCommand = IDM_RESTART;
			tbb[1].iBitmap = ImgID[1];
			tbb[1].fsState = TBSTATE_ENABLED;
			tbb[1].fsStyle = TBSTYLE_BUTTON;
			tbb[1].idCommand = IDM_NEXT;
			tbb[2].iBitmap = ImgID[2];
			tbb[2].fsState = TBSTATE_ENABLED;
			tbb[2].fsStyle = TBSTYLE_BUTTON;
			tbb[2].idCommand = IDM_PREV;
			tbb[3].iBitmap = ImgID[3];
			tbb[3].fsState = TBSTATE_ENABLED;
			tbb[3].fsStyle = TBSTYLE_BUTTON;
			tbb[3].idCommand = IDM_SELECT;
			SendMessage(hToolbar, TB_ADDBUTTONS, sizeof(tbb) / sizeof(TBBUTTON), (LPARAM)&tbb);
		}
		break;
	case WM_NOTIFY:
		// 鼠标移动到工具条上方时,显示提示信息
		lpnmhdr = (LPNMHDR)lParam;
		if (lpnmhdr->code == TTN_GETDISPINFO) {
			lpttext = (LPTOOLTIPTEXT)lParam;
			switch (lpttext->hdr.idFrom) {
			case IDM_RESTART:
				lpttext->lpszText = "重新开始";
				break;
			case IDM_NEXT:
				lpttext->lpszText = "下一关";
				break;
			case IDM_PREV:
				lpttext->lpszText = "上一关";
				break;
			case IDM_SELECT:
				lpttext->lpszText = "选择关卡";
				break;
			}
		}
		break;
		//处理菜单消息	   
	case WM_COMMAND:
		switch (LOWORD(wParam)) {
		case IDM_RESTART:
			// 重新开始游戏
			IniMap(GameMap, GameMapOri, level); // 初始化地图
			InvalidateRect(hwnd, NULL, 1); // 绘制地图
			break;
		case IDM_NEXT:
			// 下一关
			level  ;
			if (level > NLEVEL - 1) {
				MessageBox(hwnd, "没有下一关!", "提醒", MB_OK);
				level--;
			}
			else {
				IniMap(GameMap, GameMapOri, level);
				InvalidateRect(hwnd, NULL, 1);
			}
			break;
		case IDM_PREV:
			// 上一关
			level--;
			if (level < 0) {
				MessageBox(hwnd, "没有上一关!", "提醒", MB_OK);
				level  ;
			}
			else {
				IniMap(GameMap, GameMapOri, level);
				InvalidateRect(hwnd, NULL, 1);
			}
			break;
		case IDM_SELECT:
			// 选择“选择关卡”菜单时,弹出非模式对话框,选择关卡
			hdlgSelect = CreateDialog(hInst, "DLGSELECT", hwnd, (DLGPROC)DlgSelectProc);
			break;
		case IDM_EXIT:
			SendMessage(hwnd, WM_DESTROY, 0, 0); // 选择“退出”菜单项时,向应用程序发出WM_DESTROY消息
			break;
		case IDM_HELP:
			// 选择“帮助”菜单时,弹出模式对话框,介绍游戏操作方法
			DialogBox(hInst, "DLGHELP", hwnd, (DLGPROC)DlgHelpProc);
			break;
		case IDM_GOBACK:
			RectCopy(GameMap, FormerMap);
			InvalidateRect(hwnd, NULL, 1);
		}


		break;

		//当前地图的绘制, 每一块的大小为 60*60, 整块地图 8*9
		// 0:墙   1:路   2:人   3:终点   4:箱子   5:人在终点上   6:箱子在终点上
	case WM_PAINT:
		if (isPlay) {
			hDC = BeginPaint(hwnd, &PtStr);
			SetViewportOrgEx(hDC, 0, 30, NULL); // 设置视口原点
			count = 0;

			for (int i = 0; i < 8; i  )
			{
				for (int j = 0; j < 9; j  )
				{
					int left = j * 60;
					int top = i * 60;

					if (GameMap[i][j] == 0)  //墙为灰色
					{
						hBrush = CreateSolidBrush(RGB(88, 88, 88));
						SelectObject(hDC, hBrush);
						RoundRect(hDC, left, top, left   60, top   60, 5, 5);
						DeleteObject(hBrush);
					}
					if (GameMap[i][j] == 2 || GameMap[i][j] == 5)  //人为蓝色
					{
						hBrush = CreateSolidBrush(RGB(0, 162, 232));
						SelectObject(hDC, hBrush);
						RoundRect(hDC, left, top, left   60, top   60, 5, 5);
						DeleteObject(hBrush);
						x1 = i;
						y1 = j;
					}
					if (GameMap[i][j] == 3)  //终点为红色
					{
						hBrush = CreateSolidBrush(RGB(237, 28, 36));
						SelectObject(hDC, hBrush);
						RoundRect(hDC, left, top, left   60, top   60, 5, 5);
						DeleteObject(hBrush);
					}
					if (GameMap[i][j] == 4 || GameMap[i][j] == 6)   //箱子为橙色
					{
						hBrush = CreateSolidBrush(RGB(255, 127, 39));
						SelectObject(hDC, hBrush);
						RoundRect(hDC, left, top, left   60, top   60, 5, 5);
						DeleteObject(hBrush);
						if (GameMap[i][j] == 6)
							count  ;
					}
				}
			}

			EndPaint(hwnd, &PtStr);

			//判断游戏是否胜利
			if (count == countMap[level]) {
				MessageBox(NULL, TEXT("恭喜胜利啦!"), TEXT("成功"), MB_OK);
				// 重新开始游戏
				level  ;
				if (level < NLEVEL) {
					IniMap(GameMap, GameMapOri, level);
					count = 0;
					InvalidateRect(hwnd, NULL, 1);
				}
				else {
					MessageBox(NULL, TEXT("游戏结束了o(╯□╰)o"), TEXT("游戏结束"), MB_OK);
					level--;
				}

			}
		}
		else {
			// 加载位图,游戏开始之前载入欢迎画面
			hBm = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_WELCOME));
			GetObject(hBm, sizeof(BITMAP), (LPVOID)&bm);
			hDC = BeginPaint(hwnd, &PtStr);
			hdcmem = CreateCompatibleDC(hDC);
			SelectObject(hdcmem, hBm);
			RECT rect;
			GetClientRect(hwnd, &rect);
			StretchBlt(hDC, 0, 0, rect.right, rect.bottom, hdcmem, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
			SetStretchBltMode(hdcmem, STRETCH_HALFTONE);
			EndPaint(hwnd, &PtStr);
		}
		break;
		//鼠标消息
	case WM_LBUTTONDOWN:
		if (isPlay) {
			//读取鼠标左击的位置
			my = LOWORD(lParam) / 60;
			mx = (HIWORD(lParam) - 30) / 60; // 因为工具栏占了30距离,所以在这里把它减掉 
			//如果鼠标左击位置在当前人的位置的相邻块区,则移动;否则不动
			if (mx == x1 && my == y1 - 1)
			{
				x2 = x1;
				y2 = y1 - 1;
				x3 = x1;
				y3 = y1 - 2;
				strcpy(remind, "无法向左");
			}
			else if (mx == x1 && my == y1   1)
			{
				x2 = x1;
				y2 = y1   1;
				x3 = x1;
				y3 = y1   2;
				strcpy(remind, "无法向右");
			}
			else if (mx == x1 - 1 && my == y1)
			{
				x2 = x1 - 1;
				y2 = y1;
				x3 = x1 - 2;
				y3 = y1;
				strcpy(remind, "无法向上");
			}
			else if (mx == x1   1 && my == y1)
			{
				x2 = x1   1;
				y2 = y1;
				x3 = x1   2;
				y3 = y1;
				strcpy(remind, "无法向下");
			}
			else
			{
				return 0;
			}
			RectCopy(FormerMap, GameMap);
			//如果要移动到的位置是路或终点
			switch (GameMap[x2][y2])
			{
			case 1: GameMap[x2][y2] = 2;
				if (GameMap[x1][y1] == 2)
					GameMap[x1][y1] = 1;
				else if (GameMap[x1][y1] == 5)
					GameMap[x1][y1] = 3;
				InvalidateRect(hwnd, NULL, 1);
				break;
			case 3: GameMap[x2][y2] = 5;
				if (GameMap[x1][y1] == 2)
					GameMap[x1][y1] = 1;
				else if (GameMap[x1][y1] == 5)
					GameMap[x1][y1] = 3;
				InvalidateRect(hwnd, NULL, 1);
				break;
			case 4: if (GameMap[x3][y3] == 1 || GameMap[x3][y3] == 3)
			{
				if (GameMap[x3][y3] == 1)
					GameMap[x3][y3] = 4;
				else if (GameMap[x3][y3] == 3)
					GameMap[x3][y3] = 6;
				GameMap[x2][y2] = 2;
				if (GameMap[x1][y1] == 2)
					GameMap[x1][y1] = 1;
				else if (GameMap[x1][y1] == 5)
					GameMap[x1][y1] = 3;
				InvalidateRect(hwnd, NULL, 1);
			}
					else if (GameMap[x3][y3] == 0)
				MessageBox(hwnd, "箱子撞墙啦", remind, MB_OK);
					else if (GameMap[x3][y3] == 4 || GameMap[x3][y3] == 6)
				MessageBox(hwnd, "箱子撞箱子啦", remind, MB_OK);
				break;
			case 6:if (GameMap[x3][y3] == 1 || GameMap[x3][y3] == 3)
			{
				if (GameMap[x3][y3] == 1)
					GameMap[x3][y3] = 4;
				else if (GameMap[x3][y3] == 3)
					GameMap[x3][y3] = 6;
				GameMap[x2][y2] = 5;
				if (GameMap[x1][y1] == 2)
					GameMap[x1][y1] = 1;
				else if (GameMap[x1][y1] == 5)
					GameMap[x1][y1] = 3;
				InvalidateRect(hwnd, NULL, 1);
			}
				   else if (GameMap[x3][y3] == 0)
				MessageBox(hwnd, "箱子撞墙啦", remind, MB_OK);
				   else if (GameMap[x3][y3] == 4 || GameMap[x3][y3] == 6)
				MessageBox(hwnd, "箱子撞箱子啦", remind, MB_OK);
				break;
			case 0:MessageBox(hwnd, "人撞墙啦", remind, MB_OK);
				break;
			}
		}
		else {
			// 点击屏幕任意位置开始游戏
			isPlay = TRUE;
			SendMessage(hwnd, WM_CREATE, 0, 0);
			InvalidateRect(hwnd, NULL, 1);
		}
		return 0;

		//键盘按下消息
	case WM_KEYDOWN:
		switch (wParam)
		{
		case VK_LEFT:   //向左键按下
			x2 = x1;
			y2 = y1 - 1;
			x3 = x1;
			y3 = y1 - 2;
			strcpy(remind, "无法向左");
			break;
		case VK_RIGHT:  //向右键按下
			x2 = x1;
			y2 = y1   1;
			x3 = x1;
			y3 = y1   2;
			strcpy(remind, "无法向右");
			break;
		case VK_UP:     //向上键按下
			x2 = x1 - 1;
			y2 = y1;
			x3 = x1 - 2;
			y3 = y1;
			strcpy(remind, "无法向上");
			break;
		case VK_DOWN:   //向下键按下
			x2 = x1   1;
			y2 = y1;
			x3 = x1   2;
			y3 = y1;
			strcpy(remind, "无法向下");
			break;
		default: return 0;
		}
		RectCopy(FormerMap, GameMap);
		switch (GameMap[x2][y2])
		{
		case 1: GameMap[x2][y2] = 2;
			if (GameMap[x1][y1] == 2)
				GameMap[x1][y1] = 1;
			else if (GameMap[x1][y1] == 5)
				GameMap[x1][y1] = 3;
			InvalidateRect(hwnd, NULL, 1);
			break;
		case 3: GameMap[x2][y2] = 5;
			if (GameMap[x1][y1] == 2)
				GameMap[x1][y1] = 1;
			else if (GameMap[x1][y1] == 5)
				GameMap[x1][y1] = 3;
			InvalidateRect(hwnd, NULL, 1);
			break;
		case 4: if (GameMap[x3][y3] == 1 || GameMap[x3][y3] == 3)
		{
			if (GameMap[x3][y3] == 1)
				GameMap[x3][y3] = 4;
			else if (GameMap[x3][y3] == 3)
				GameMap[x3][y3] = 6;
			GameMap[x2][y2] = 2;
			if (GameMap[x1][y1] == 2)
				GameMap[x1][y1] = 1;
			else if (GameMap[x1][y1] == 5)
				GameMap[x1][y1] = 3;
			InvalidateRect(hwnd, NULL, 1);
		}
				else if (GameMap[x3][y3] == 0)
			MessageBox(hwnd, "箱子撞墙啦", remind, MB_OK);
				else if (GameMap[x3][y3] == 4 || GameMap[x3][y3] == 6)
			MessageBox(hwnd, "箱子撞箱子啦", remind, MB_OK);
			break;
		case 6:if (GameMap[x3][y3] == 1 || GameMap[x3][y3] == 3)
		{
			if (GameMap[x3][y3] == 1)
				GameMap[x3][y3] = 4;
			else if (GameMap[x3][y3] == 3)
				GameMap[x3][y3] = 6;
			GameMap[x2][y2] = 5;
			if (GameMap[x1][y1] == 2)
				GameMap[x1][y1] = 1;
			else if (GameMap[x1][y1] == 5)
				GameMap[x1][y1] = 3;
			InvalidateRect(hwnd, NULL, 1);
		}
			   else if (GameMap[x3][y3] == 0)
			MessageBox(hwnd, "箱子撞墙啦", remind, MB_OK);
			   else if (GameMap[x3][y3] == 4 || GameMap[x3][y3] == 6)
			MessageBox(hwnd, "箱子撞箱子啦", remind, MB_OK);
			break;
		case 0:MessageBox(hwnd, "人撞墙啦", remind, MB_OK);
			break;
		}
		return 0;

	case WM_DESTROY:
		PostQuitMessage(0);					//调用PostQuitMessage发出WM_QUIT消息

	default:								//缺省时采用系统消息缺省处理函数
		return  DefWindowProc(hwnd, message, wParam, lParam);
	}
	return (0);
}
// 帮助对话框处理程序
BOOL CALLBACK DlgHelpProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) {
	switch (message) {
		//初始化对话框 
	case WM_INITDIALOG:
		return 1;
		//处理对话框消息 
	case WM_COMMAND:
		switch (LOWORD(wParam)) {
		case IDOK:              //关闭对话框  
			EndDialog(hdlg, 0);
			return 1;
		}
		break;
	case WM_CLOSE:
		EndDialog(hdlg, 0);
		return 1;
	}
	return 0;
}
BOOL CALLBACK DlgSelectProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) {
	switch (message) {
		//初始化消息框 
	case WM_INITDIALOG:
		hLevelCombo = CreateWindow("combobox", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST, 100, 35, 70, 500, hdlg, (HMENU)IDC_COMBO, hInst, NULL);
		// 添加NLEVEL个关卡数
		for (int i = 0; i < 10; i  ) {
			char temp[2] = "";
			_itoa_s(i , temp, 2, 12);
			SendMessage(hLevelCombo, CB_ADDSTRING, 0, (LPARAM)temp);
		}
		char buff[2];
		_itoa_s(level , buff, 2, 10);
		SendMessage(hLevelCombo, CB_SELECTSTRING, -1, (LPARAM)buff);
		return 0;
		//处理消息框消息 
	case WM_COMMAND:
		switch (LOWORD(wParam)) {
		case IDOK:
			//获得选择的关卡 
			level = SendMessage(hLevelCombo, CB_GETCURSEL, 0, 0); // 获得编号从0开始
			DestroyWindow(hdlg);
			IniMap(GameMap, GameMapOri, level);
			InvalidateRect(hwnd, NULL, 1);
			return 1;
		}
		break;
	case WM_CLOSE:
		DestroyWindow(hdlg);
		return 1;
	}
	return 0;
}

// 初始化地图
void IniMap(int GameMap[][9], int GameMapOri[][8][9], int level) {
	for (int i = 0; i < 8; i  ) {
		for (int j = 0; j < 9; j  ) {
			GameMap[i][j] = GameMapOri[level][i][j];
		}
	}
	x1 = 0; y1 = 0; x2 = 0; y2 = 0; x3 = 0; y3 = 0; // 初始化坐标
	mx = 0; my = 0; // 初始化mx和my
}

标签: 推箱子

实例下载地址

<赞>c++ 推箱子 游戏开发示例

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警