推箱子实验报告.docx
《推箱子实验报告.docx》由会员分享,可在线阅读,更多相关《推箱子实验报告.docx(33页珍藏版)》请在冰豆网上搜索。
推箱子实验报告
程
序
设
计
实
践
实
验
报
告
姓名:
xx
专业班级:
xxxxxxxxxx
学号:
xxxxxxxxxx
项目:
推箱子
指导老师:
xx
目录
内容页码
封面————————————1
一、游戏设计思想——————3
二、游戏整体设计——————4
三、游戏程序实现——————12
四、问题与解决方法—————25
五、心得体会————————28
1、游戏设计思想
1、游戏的功能确定
本游戏共一关,包括游戏的初始化,按键处理,判断胜利条件,开始及退出功能。
(1)初始化包括屏幕初始化和关卡的初始化,屏幕初始化高,宽都为600。
(2)按键处理包括移动推箱子的人和移动箱子,包括上下左右,通过小人推动箱子从而到达目的地。
(3)开始游戏点击start,结束点击x或者exit。
2、对功能模块设计
本设计共5个模块,分别是初始化模块,移动箱子模块,加载图画模块,功能控制模块,移动小人模块等。
(1)初始化模块
初始化模块包括屏幕初始化和游戏的初始化,屏幕初始化用于输出提示信息。
(2)图画模块
该模块主要画墙,在空地上画箱子,在目的地上画箱子,人和目的地。
(3)移动箱子模块
这个模块用于移动箱子,包括目的地之间、空地之间和目的地与空地之间的箱子移动。
(4)移动小人模块
该模块用于控制小人移动从而推动箱子达到目的地。
(5)功能控制模块
该模块包括几个函数的集合,包括指定位置判断,输出信息功能。
2、游戏整体设计
1、游戏流程图
否
是
否
是
模块功能图:
2、关键动能模块介绍
(1)准备模块
包括头文件,全局变量,预编译处理等等。
#include"stdafx.h"
#include"resource.h"
#definewidth48//指定图像宽高
#defineheigth48
defineMAX_LOADSTRING100
(2)初始化模块
包括初始化全局变量,初始化窗口,为以后做准备
//全局变量:
HINSTANCEhInst;//当前实例
TCHARszTitle[MAX_LOADSTRING];//标题栏文本
TCHARszWindowClass[MAX_LOADSTRING];//主窗口类名
//此代码模块中包含的函数前相声明:
ATOMMyRegisterClass(HINSTANCEhInstance);
BOOLInitInstance(HINSTANCE,int);
LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);
INT_PTRCALLBACKAbout(HWNDhDlg,UINTmessage,WPARAMwParam,LPARAMlParam);
LRESULTCALLBACKstart(HWND,UINT,WPARAM,LPARAM);
INT_PTRCALLBACKHelp(HWNDhDlg,UINTmessage,WPARAMwParam,LPARAMlParam);
intAPIENTRY_tWinMain(HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPSTRlpCmdLine,
intnCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
//TODO:
在此放置代码:
MSGmsg;
HACCELhAccelTable;
//初始化全局字符
LoadString(hInstance,IDS_APP_TITLE,szTitle,MAX_LOADSTRING);
LoadString(hInstance,IDM_me,szWindowClass,MAX_LOADSTRING);
MyRegisterClass(hInstance);
//执行应用程序初始化:
if(!
InitInstance(hInstance,nCmdShow))
{
returnFALSE;
}
hAccelTable=LoadAccelerators(hInstance,(LPCTSTR)IDM_me);
//主消息循环:
while(GetMessage(&msg,NULL,0,0))
{
if(!
TranslateAccelerator(msg.hwnd,hAccelTable,&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
returnmsg.wParam;
}
ATOMMyRegisterClass(HINSTANCEhInstance)
{
WNDCLASSEXwcex;
wcex.cbSize=sizeof(WNDCLASSEX);
wcex.style=CS_HREDRAW|CS_VREDRAW;
wcex.lpfnWndProc=(WNDPROC)WndProc;
wcex.cbClsExtra=0;
wcex.cbWndExtra=0;
wcex.hInstance=hInstance;
wcex.hIcon=LoadIcon(hInstance,(LPCTSTR)IDI_MY);
wcex.hCursor=LoadCursor(NULL,IDC_ARROW);
wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName=MAKEINTRESOURCE(IDM_me);
wcex.lpszClassName=szWindowClass;
wcex.hIconSm=LoadIcon(wcex.hInstance,(LPCTSTR)IDI_MY);
returnRegisterClassEx(&wcex);
}
BOOLInitInstance(HINSTANCEhInstance,intnCmdShow)
{
HWNDhWnd;
hInst=hInstance;//将实例句柄存储在全局变量中
hWnd=CreateWindow(szWindowClass,szTitle,WS_OVERLAPPEDWINDOW,
250,40,6,NULL,NULL,hInstance,NULL);
if(!
hWnd)
{
returnFALSE;
}
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
returnTRUE;
}
(3)地图模块
包括地图二维数组,点击开始之后的加载位图,加载原始地图
,离开时的消息响应
charmap[10][10]=//地图二维数组
{"",
"########",
"####@##",
"##b##",
"######",
"###*#",
"##b*#",
"#b*#",
"########",
""
};
staticintbStarted=0;
inta=0;
intaimnum_qj=0;
intaimnum=0;
intboxoknum_qj=0;
charmap_mid[10][10];
pointman_mid;
RECTmap_bg[10][10];
RECTManDes;//为减少系统开销,将五幅位图一次加载进内存,等到程序结束时释放。
LPCTSTRszFileName0="man.bmp";
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);
LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,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(message)
{
caseWM_COMMAND:
wmId=LOWORD(wParam);
wmEvent=HIWORD(wParam);
//分析菜单选项
switch(wmId)
{
caseIDM_ABOUT:
DialogBox(hInst,(LPCTSTR)IDD_ABOUTBOX,hWnd,(DLGPROC)About);
break;
caseIDM_START:
{winnum=0;
aimnum_qj=0;
for(i=0;i<10;i++)
for(j=0;j<10;j++)
{
map[i][j]=map[i][j];
}
DrawMap(hWnd,(char**)map,10,10);//加载原始地图
aimnum=aimnum_qj;
memcpy(map_mid,map,sizeof(map));//将原始地图复制到运行中的地图
for(i=0;i<10;i++)
for(j=0;j<10;j++)
if(map_mid[i][j]=='@')
{
map_mid[i][j]='';
}
//Pla
bStarted=1;}
break;
caseIDM_EXIT:
if(IDYES==MessageBox(hWnd,"您真的要退出吗?
","关闭",MB_YESNO))
{
DestroyWindow(hWnd);
}
break;
break;
default:
returnDefWindowProc(hWnd,message,wParam,lParam);
}
break;
(4)操作模块
包括响应方向键及系统重绘,判断是否结束及结束对话框
//响应方向键.
caseWM_KEYDOWN:
switch(wParam)
{
caseVK_UP:
keydown_up(hWnd);
break;
caseVK_LEFT:
keydown_left(hWnd);
break;
caseVK_RIGHT:
keydown_right(hWnd);
break;
caseVK_DOWN:
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))//判断结束
{
winnum=1;
MessageBox(hWnd,TEXT("恭喜你赢了!
"),TEXT("Nice"),MB_SYSTEMMODAL|MB_OK);
}
}
EndPaint(hWnd,&ps);
break;
caseWM_DESTROY:
PostQuitMessage(0);
break;
caseWM_CLOSE:
if(IDYES==MessageBox(hWnd,"您真的要退出吗?
","关闭",MB_YESNO))
{
DestroyWindow(hWnd);
}
break;
三、游戏程序实现
以下为原程序代码:
#include"stdafx.h"
#include"resource.h"
#definewidth48//指定图像宽高
#defineheigth48
#defineMAX_LOADSTRING100
typedefstruct
{
intx;
inty;
}point;
charmap[10][10]=//地图二维数组
{"",
"########",
"####@##",
"##b##",
"######",
"###*#",
"##b*#",
"#b*#",
"########",
""
};
staticintbStarted=0;
inta=0;
intaimnum_qj=0;
intaimnum=0;
intboxoknum_qj=0;
charmap_mid[10][10];
pointman_mid;
RECTmap_bg[10][10];
RECTManDes;//为减少系统开销,将五幅位图一次加载进内存,等到程序结束时释放。
LPCTSTRszFileName0="man.bmp";
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);
//全局变量:
HINSTANCEhInst;//当前实例
TCHARszTitle[MAX_LOADSTRING];//标题栏文本
TCHARszWindowClass[MAX_LOADSTRING];//主窗口类名
//此代码模块中包含的函数前相声明:
ATOMMyRegisterClass(HINSTANCEhInstance);
BOOLInitInstance(HINSTANCE,int);
LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);
INT_PTRCALLBACKAbout(HWNDhDlg,UINTmessage,WPARAMwParam,LPARAMlParam);
LRESULTCALLBACKstart(HWND,UINT,WPARAM,LPARAM);
INT_PTRCALLBACKHelp(HWNDhDlg,UINTmessage,WPARAMwParam,LPARAMlParam);
intAPIENTRY_tWinMain(HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPSTRlpCmdLine,
intnCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
//TODO:
在此放置代码:
MSGmsg;
HACCELhAccelTable;
//初始化全局字符
LoadString(hInstance,IDS_APP_TITLE,szTitle,MAX_LOADSTRING);
LoadString(hInstance,IDM_me,szWindowClass,MAX_LOADSTRING);
MyRegisterClass(hInstance);
//执行应用程序初始化:
if(!
InitInstance(hInstance,nCmdShow))
{
returnFALSE;
}
hAccelTable=LoadAccelerators(hInstance,(LPCTSTR)IDM_me);
//主消息循环:
while(GetMessage(&msg,NULL,0,0))
{
if(!
TranslateAccelerator(msg.hwnd,hAccelTable,&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
returnmsg.wParam;
}
ATOMMyRegisterClass(HINSTANCEhInstance)
{
WNDCLASSEXwcex;
wcex.cbSize=sizeof(WNDCLASSEX);
wcex.style=CS_HREDRAW|CS_VREDRAW;
wcex.lpfnWndProc=(WNDPROC)WndProc;
wcex.cbClsExtra=0;
wcex.cbWndExtra=0;
wcex.hInstance=hInstance;
wcex.hIcon=LoadIcon(hInstance,(LPCTSTR)IDI_MY);
wcex.hCursor=LoadCursor(NULL,IDC_ARROW);
wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName=MAKEINTRESOURCE(IDM_me);
wcex.lpszClassN