推箱子程序设计报告.docx
- 文档编号:24974054
- 上传时间:2023-06-03
- 格式:DOCX
- 页数:30
- 大小:340.64KB
推箱子程序设计报告.docx
《推箱子程序设计报告.docx》由会员分享,可在线阅读,更多相关《推箱子程序设计报告.docx(30页珍藏版)》请在冰豆网上搜索。
推箱子程序设计报告
程序设计报告
推
箱
子
通信学院
电子信息1204工程班
1207050420
郝国成
一.设计思路
推箱子游戏是一款很有趣味的游戏,其开发过程有一定的技巧和方法,其中涉及到二维数组、键盘操作以及图形化函数等方面的知识。
设计推箱子这个游戏,目的是将箱子推到指定的空位,以完成游戏。
首先,要在窗口上,绘制地图,画出墙和草地。
然后,要保证人和箱子可以移动,这个就用到了caseWM_KEYDOWN函数去控制了。
下来,就是要制定游戏规则,根据游戏规则,箱子可以在空地之间、目的地之间、空地和目的地之间来回移动,。
最后,把全部箱子移动到指定位置才算完成本次游戏,因此箱子每移动一次都必须判断全部箱子当前位置是否到达指定坐标。
而且,只要游戏没有结束,就没有时间的限制。
大体思路确定以后就是要去怎么做,怎么去实现自己的想法。
我是采用二维数组绘制地图的原理,把资源图片一张张绘制到窗口DC上,然后记录人物资源的坐标,通过方向键响应,改变人物坐标,达到控制人物移动的目的。
箱子也同样是这个道理。
想好思路以后,就是动手写代码。
这期间我又认识了好多新的Windows的函数,不断的修改,使我更能深刻理解到WIN32的作用,收获很大。
二.部分代码
//推箱子.cpp:
Definestheentrypointfortheapplication.
#include"stdafx.h"
#include"resource.h"
//#include"mmsystem.h"//导入声音头文件
//#pragmacomment(lib,"winmm.lib")//导入声音头文件库
#defineMAX_LOADSTRING100
#definewidth48
#defineheigth48
typedefstruct
{
intx;
inty;
}point;
charmap1[10][10]=//地图二维数组
{
"####",
"###@#",
"#b#",
"######",
"###*#",
"##b*#",
"#b*#",
"########",
""
};
charmap2[10][10]=//地图二维数组
{
"nnnn#####",
"nnnn#@#",
"###n#bb#",
"#*#n#b#",
"#*######",
"#*##n",
"###n",
"#####",
"nnn#####",
""
};
staticintbStarted=0;
inta=0;
intaimnum_qj=0;
intaimnum=0;
intboxoknum_qj=0;
charmap_mid[10][10];
charmap[10][10];
pointman_mid;
RECTmap_bg[10][10];
RECTManDes;
voidDrawMap(HWNDhWnd,char**Dmap,intm,intn);//加载地图
voidDrawPicture(HWNDhWnd,HBITMAPhBmp,RECTspot);
voidkeydown_up(HWNDhWnd);
voidkeydown_left(HWNDhWnd);
voidkeydown_down(HWNDhWnd);
voidkeydown_right(HWNDhWnd);
voidup_result();
voidleft_result();
voidright_result();
voiddown_result();
LPCTSTRszFileName0="man.bmp";
//HBITMAPhBmp_man=(HBITMAP)LoadImage(NULL,szFileName0,IMAGE_BITMAP,0,0,
//LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
HBITMAPhBmp_man=(HBITMAP)LoadImage(NULL,szFileName0,IMAGE_BITMAP,0,0,
LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
LPCTSTRszFileName1="box.bmp";
HBITMAPhBmp_box=(HBITMAP)LoadImage(NULL,szFileName1,
IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|
LR_LOADFROMFILE);
LPCTSTRszFileName2="wall.bmp";
HBITMAPhBmp_wall=(HBITMAP)LoadImage(NULL,szFileName2,
IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|
LR_LOADFROMFILE);
LPCTSTRszFileName3="aim.bmp";
HBITMAPhBmp_aim=(HBITMAP)LoadImage(NULL,szFileName3,
IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|
LR_LOADFROMFILE);
LPCTSTRszFileName4="ground.bmp";
HBITMAPhBmp_ground=(HBITMAP)LoadImage(NULL,szFileName4,
IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|
LR_LOADFROMFILE);
//GlobalVariables:
HINSTANCEhInst;//currentinstance
TCHARszTitle[MAX_LOADSTRING];//Thetitlebartext
TCHARszWindowClass[MAX_LOADSTRING];//Thetitlebartext
//Fowarddeclarationsoffunctionsincludedinthiscodemodule:
ATOMMyRegisterClass(HINSTANCEhInstance);
BOOLInitInstance(HINSTANCE,int);
LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);
INT_PTRCALLBACKAbout(HWND,UINT,WPARAM,LPARAM);
LRESULTCALLBACKStart(HWND,UINT,WPARAM,LPARAM);
INT_PTRCALLBACKHelp(HWND,UINT,WPARAM,LPARAM);
intAPIENTRYWinMain(HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPSTRlpCmdLine,
intnCmdShow)
{
//TODO:
Placecodehere.
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
MSGmsg;
HACCELhAccelTable;
//Initializeglobalstrings
LoadString(hInstance,IDS_APP_TITLE,szTitle,MAX_LOADSTRING);
LoadString(hInstance,IDC_MY,szWindowClass,MAX_LOADSTRING);
MyRegisterClass(hInstance);
//Performapplicationinitialization:
if(!
InitInstance(hInstance,nCmdShow))
{
returnFALSE;
}
hAccelTable=LoadAccelerators(hInstance,(LPCTSTR)IDC_MY);
//Mainmessageloop:
while(GetMessage(&msg,NULL,0,0))
{
if(!
TranslateAccelerator(msg.hwnd,hAccelTable,&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
returnmsg.wParam;
}
//
//FUNCTION:
MyRegisterClass()
//
//PURPOSE:
Registersthewindowclass.
//
//COMMENTS:
//
//Thisfunctionanditsusageisonlynecessaryifyouwantthiscode
//tobecompatiblewithWin32systemspriortothe'RegisterClassEx'
//functionthatwasaddedtoWindows95.Itisimportanttocallthisfunction
//sothattheapplicationwillget'wellformed'smalliconsassociated
//withit.
//
ATOMMyRegisterClass(HINSTANCEhInstance)
{
//wcex.lpfnWndProc=(WNDPROC)WndProc;
//wcex.hIcon=LoadIcon(hInstance,(LPCTSTR)IDI_PUSHBOX);
//wcex.lpszMenuName=(LPCSTR)IDC_PUSHBOX;
//wcex.hIconSm=LoadIcon(wcex.hInstance,(LPCTSTR)IDI_SMALL);
WNDCLASSEXwcex;
wcex.cbSize=sizeof(WNDCLASSEX);
wcex.style=CS_HREDRAW|CS_VREDRAW;
//wcex.style=CS_DBLCLKS|CS_OWNDC|CS_HREDRAW|CS_VREDRAW;
wcex.lpfnWndProc=WndProc;
wcex.cbClsExtra=0;
wcex.cbWndExtra=0;
wcex.hInstance=hInstance;
wcex.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDC_MY));
wcex.hCursor=LoadCursor(NULL,IDC_ARROW);
wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName=MAKEINTRESOURCE(IDC_MY);
wcex.lpszClassName=szWindowClass;
wcex.hIconSm=LoadIcon(wcex.hInstance,MAKEINTRESOURCE(IDI_SMALL));
returnRegisterClassEx(&wcex);
returnRegisterClassEx(&wcex);
}
//
//FUNCTION:
InitInstance(HANDLE,int)
//
//PURPOSE:
Savesinstancehandleandcreatesmainwindow
//
//COMMENTS:
//
//Inthisfunction,wesavetheinstancehandleinaglobalvariableand
//createanddisplaythemainprogramwindow.
//
BOOLInitInstance(HINSTANCEhInstance,intnCmdShow)
{
HWNDhWnd;
hInst=hInstance;//Storeinstancehandleinourglobalvariable
hWnd=CreateWindow(szWindowClass,szTitle,WS_OVERLAPPEDWINDOW,
300,30,680,600,NULL,NULL,hInstance,NULL);
if(!
hWnd)
{
returnFALSE;
}
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
returnTRUE;
}
//
//FUNCTION:
WndProc(HWND,unsigned,WORD,LONG)
//
//PURPOSE:
Processesmessagesforthemainwindow.
//
//WM_COMMAND-processtheapplicationmenu
//WM_PAINT-Paintthemainwindow
//WM_DESTROY-postaquitmessageandreturn
//
//
LRESULTCALLBACKWndProc(HWNDhWnd,UINTmsg,WPARAMwParam,LPARAMlParam)
{
intwmId,wmEvent;
PAINTSTRUCTps;
HDChdc;
//TCHARszHello[MAX_LOADSTRING];
//LoadString(hInst,IDS_HELLO,szHello,MAX_LOADSTRING);
intwinnum=0;
inti,j;
for(i=0;i<10;i++)//设置矩形数组,为画图作准备
for(j=0;j<10;j++)
{
map_bg[i][j].left=i*width;
map_bg[i][j].top=j*heigth;
map_bg[i][j].right=(i+1)*width;
map_bg[i][j].bottom=(j+1)*heigth;
}
switch(msg)
{
caseWM_COMMAND:
wmId=LOWORD(wParam);
wmEvent=HIWORD(wParam);
//分析菜单选项
switch(wmId)
{
caseIDM_ABOUT:
DialogBox(hInst,MAKEINTRESOURCE(IDD_ABOUTBOX),hWnd,(DLGPROC)About);
break;
caseIDM_HELP:
//帮助对话框
DialogBox(hInst,MAKEINTRESOURCE(IDM_HELP),hWnd,(DLGPROC)Help);
break;
caseIDM_start:
//菜单开始选项
winnum=0;
aimnum_qj=0;
for(i=0;i<10;i++)
for(j=0;j<10;j++)
{
map[i][j]=map1[i][j];
}
DrawMap(hWnd,(char**)map1,10,10);//加载原始地图
aimnum=aimnum_qj;
memcpy(map_mid,map1,sizeof(map1));//将原始地图复制到运行中的地图
for(i=0;i<10;i++)
for(j=0;j<10;j++)
if(map_mid[i][j]=='@')
{
map_mid[i][j]='';
}
//PlaySound(TEXT("音乐名"),NULL,SND_SYNC);//开始音乐
bStarted=1;
break;
caseIDM_EXIT:
DestroyWindow(hWnd);
break;
default:
returnDefWindowProc(hWnd,msg,wParam,lParam);
}
break;
caseWM_KEYDOWN:
//相应方向键
switch(wParam)
{
caseVK_UP:
//PlaySound(TEXT("声音名"),NULL,SND_SYNC);//按键音
keydown_up(hWnd);
break;
caseVK_LEFT:
//PlaySound(TEXT("声音名"),NULL,SND_SYNC);//按键音
keydown_left(hWnd);
break;
caseVK_RIGHT:
//PlaySound(TEXT("声音名"),NULL,SND_SYNC);
keydown_right(hWnd);
break;
caseVK_DOWN:
//PlaySound(TEXT("声音名"),NULL,SND_SYNC);
keydown_down(hWnd);
break;
}
caseWM_PAINT:
hdc=BeginPaint(hWnd,&ps);//系统重绘
if(bStarted)
{
boxoknum_qj=0;
DrawMap(hWnd,(char**)map_mid,10,10);
DrawPicture(hWnd,hBmp_man,ManDes);
if((boxoknum_qj==aimnum)&&(winnum==0)&&(a==0))//判断结束
{
winnum=1;
if(IDYES==MessageBox(hWnd,TEXT("你赢了!
是否进入下一关?
"),TEXT("恭喜:
"),MB_YESNO))
{
winnum=0;
a++;
aimnum_qj=0;
for(i=0;i<10;i++)
for(j=0;j<10;j++)
{
map[i][j]=map2[i][j];
}
DrawMap(hWnd,(char**)map,10,10);//加载原始地图
aimnum=aimnum_qj;
memcpy(map_mid,map2,sizeof(map2));//将原始地图复制到运行中的地图
/*for(i=0;i<10;i++)
for(j=0;j<10;j++)
if(map_mid[i][j]=='@')
{
map_mid[i][j]='';
}
hdc=BeginPaint(hWnd,&ps);//系统重绘
boxoknum_qj=0;
DrawMap(hWnd,(char**)map_mid,10,10);
DrawPicture(hWnd,hBmp_man,ManDes);
if((boxoknum_qj==aimnum)&&(winnum==0))//判断结束
{
winnum=1;
MessageBox(hWnd,TEXT("你赢了!
"),TEXT("恭喜:
"),MB_SYSTEMMODAL|MB_OK);
}
EndPaint(hWnd,&ps);*/
}
}
elseif((boxoknum_qj==aimnum)&&(winnum==0)&&(a==1))//判断结束
{
MessageBox(hWnd,TEXT("哈哈!
你通关了!
"),TEXT("恭喜:
"),MB_SYSTEMMODAL|MB_OK);
}
}
EndPaint(hWnd,&ps);
break;
caseWM_DESTROY:
PostQuitMessage(0);
break;
caseWM_CLOSE:
if(IDYES==MessageBox(hWnd,"你确定要退出","结束",MB_YESNO))
{
DestroyWindow(hWnd);
}
break;
default:
returnDefWindowProc(hWnd,msg,wParam,lParam);
}
return0;
}
//Mesagehandlerforaboutbox.
//****************************************************
//函数名称:
LRESULTCALLBACKAbout(HWND,UINT,WPARAM,LPARAM)
//函数目的:
处理主窗口的消息
//注释:
//*************************************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 箱子 程序设计 报告