基本信息
源码名称:<赞>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
}