基本信息
源码名称:<赞>c++ 推箱子 游戏开发示例
源码大小:3.21M
文件格式:.zip
开发语言:C/C++
更新时间:2019-04-11
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
在推箱子游戏的基础上增加如下功能:
1:对于撞墙要有撞墙方向提醒
2:对于撞箱子,也要进行提醒
3:游戏可回退一步
4:把通关数至少增加到10关(不能有同样地图的“关”)
#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 }