推箱子程序设计报告.docx

上传人:b****7 文档编号:24974054 上传时间:2023-06-03 格式:DOCX 页数:30 大小:340.64KB
下载 相关 举报
推箱子程序设计报告.docx_第1页
第1页 / 共30页
推箱子程序设计报告.docx_第2页
第2页 / 共30页
推箱子程序设计报告.docx_第3页
第3页 / 共30页
推箱子程序设计报告.docx_第4页
第4页 / 共30页
推箱子程序设计报告.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

推箱子程序设计报告.docx

《推箱子程序设计报告.docx》由会员分享,可在线阅读,更多相关《推箱子程序设计报告.docx(30页珍藏版)》请在冰豆网上搜索。

推箱子程序设计报告.docx

推箱子程序设计报告

程序设计报告

 

 

通信学院

电子信息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)

//函数目的:

处理主窗口的消息

//注释:

//*************************************************

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 教育学心理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1