推箱子程序设计与报告Word文档格式.docx
《推箱子程序设计与报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《推箱子程序设计与报告Word文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
图素材图片集合
这个程序是一个益智类的游戏,是一个单机游戏,人物通过推动箱子到达目的地以在游戏中取胜,同一时刻只能有一位玩家进行游戏。
图英雄榜
图关于游戏
游戏流程
系统流程图:
游戏开始
选择关卡
图选择关卡截图
游戏开局出现如图1,然后进行难度的选择,再是关卡的选择,然后就可以游戏了,游戏完成之后会自动切换下一关,游戏者可手动选择结束游戏。
Win32API简介
Win32API即为Microsoft32位平台的应用程序编程接口(ApplicationProgrammingInterface)。
所有在Win32平台上运行的应用程序都可以调用这些函数。
使用Win32API,应用程序可以充分挖掘Windows的32位操作系统的潜力。
Mircrosoft的所有32位平台都支持统一的API,包括函数、结构、消息、宏及接口。
使用Win32API不但可以开发出在各种平台上都能成功运行的应用程序,而且也可以充分利用每个平台特有的功能和属性。
在具体编程时,程序实现方式的差异依赖于相应平台的底层功能的不同。
最显著的差异是某些函数只能在更强大的平台上实现其功能。
例如,安全函数只能在WindowsNT操作系统下使用。
另外一些主要差别就是系统限制,比如值的范围约束,或函数可管理的项目个数等等。
Win32API函数分类
标准Win32API函数可以分为以下几类:
1、窗口管理
2、窗口通用控制
3、Shell特性
4、图形设备接口
5、系统服务
6、国际特性
7、网络服务
函数原型的一些定义
LRESULTCALLBACKWindowProc(
HWNDhwnd,//handletowindow
UINTuMsg,//messageidentifier
WPARAMwParam,//firstmessageparameter
LPARAMlParam//secondmessageparameter
);
//窗口过程函数原型
BOOLInitWindowsClass(HINSTANCEhInstance);
//初始化窗口类
BOOLInitWindows(HINSTANCEhInstance,intnCmdShow);
//初始化窗口
BOOLCALLBACKDlgProc(HWNDhdlg,UINTmessage,WPARAMwParam,LPARAMlParam);
//对话框过程函数
voidShow_Image(HBITMAPbmap,inti,intj);
//显示单张图片
voidDraw_Map();
//作图的函数
voidShow_Map();
//显示地图
voidGet_Poision(Poision&
poision);
//人物在哪里的定位
创建窗口函数
voidmain()
{
PlaySound("
E:
\\"
NULL,SND_FILENAME|SND_ASYNC);
}
BOOLInitWindows(HINSTANCEhInstance,intnCmdShow)
{hWnd=CreateWindow("
joe"
"
推箱子"
WS_OVERLAPPEDWINDOW,450,200,325,372,NULL,NULL,hInstance,NULL);
if(!
hWnd)
returnFALSE;
SetTimer(hWnd,1,1,NULL);
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
hInst=hInstance;
returnTRUE;
地图的输出
voidShow_Map()
inti,j;
for(i=0;
i<
10;
i++)//1表示墙0表示通路2表示箱子3表示人4表示目的地
for(j=0;
j<
j++)if(Map[i][j]==1)
Show_Image(hBm_wall,32*j,32*i);
elseif(Map[i][j]==2)Show_Image(hBm_box,32*j,32*i);
elseif(Map[i][j]==3)Show_Image(hBm_people,32*j,32*i);
elseif(Map[i][j]==4)Show_Image(hBm_dirtion,32*j,32*i);
elseif(Map[i][j]==0)Show_Image(hBm_floor,32*j,32*i);
人物的定位
poision)
inti=0,j=0;
boolflag=FALSE;
=0,=0;
i++)
{for(j=0;
j++){
if(Map[i][j]==3)
=i;
=j;
flag=TRUE;
break;
if(flag==TRUE)
地图的编写
intMap4[10][10]={1,1,1,1,1,0,0,0,0,0,//1示箱子3表示人4表示目的地1,3,0,0,1,0,0,0,0,0,1,0,2,2,1,0,0,1,1,1,1,0,2,0,1,0,0,1,4,1,1,1,1,0,1,1,1,1,4,1,0,1,1,0,0,0,0,0,4,1,0,1,0,0,0,1,0,0,0,1,0,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0,0,1,0,1,1,1,1,1,0,0,0,0};
intMap5[10][10]={1,1,1,1,1,1,1,1,1,1,//1箱子3表示人4表示目的地1,0,0,0,1,0,0,0,0,1,1,0,3,0,1,4,0,0,4,1,1,0,2,0,1,0,0,1,0,1,1,0,1,0,0,0,0,0,0,1,1,0,0,2,0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1};
intMap1[10][10]={1,1,1,1,1,1,1,1,1,1,//1箱子3表示人4表示目的地1,0,0,0,1,0,0,0,0,1,1,0,3,0,1,4,0,0,4,1,1,0,2,0,1,0,0,1,0,1,1,0,1,0,0,0,0,0,0,1,1,0,0,2,0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,1,
表示墙0表示通路2表
表示墙0表示通路2表示
1,0,0,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1};
intMap2[10][10]={1,1,1,1,1,1,1,1,1,1,//1箱子3表示人4表示目的地1,0,0,0,1,0,0,0,0,1,1,0,3,0,0,0,0,0,0,1,1,0,2,0,1,1,0,0,0,1,1,0,0,0,4,1,0,0,0,1,1,0,0,2,1,1,0,0,0,1,1,0,0,0,0,0,1,4,0,1,1,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1};
intMap3[10][10]={1,1,1,1,1,1,1,1,1,1,//1箱子3表示人4表示目的地1,0,0,0,1,0,0,0,0,1,1,0,3,0,0,0,0,2,0,1,1,0,0,0,0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,1,1,0,2,0,0,0,0,0,0,1,1,0,0,1,0,0,1,4,0,1,1,0,1,4,0,0,0,1,0,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1};
intMap[10][10]={0,1,1,1,1,1,1,1,0,0,//1箱子3表示人4表示目的地0,1,1,1,1,1,1,1,0,0,0,1,0,0,0,0,0,1,1,1,1,1,2,1,1,1,0,0,0,1,1,0,3,0,2,0,0,2,0,1,1,0,0,0,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,1,1,0,4,4,1,0,2,0,1,1,1,1,4,4,1,0,0,0,1,0,0,1,1,1,1,1,1,1,1,0};
通过调用playsound实现背景音乐
caseIDM_TOOL:
五心得体会
通过一个学期的学习实践,我掌握了一些比较基础的编程方法。
在实际操作上有了很大程度的提高,在听课以及与同学交流的过程中,受益匪浅,感悟颇多。
看似简单的编程游戏背后,确实异常复杂的算法。
在网上参考了一些类似的逻辑算法和代码,并在前人的基础上进行拓展与改编。
同时也让我更认识到了自身学习的不足之处,也更进一步产生了对游戏开发的兴趣。
游戏开发是一个创新的过程,由于能力欠缺,仅仅做了一个众所周知的经典项目。
希望日后能力提高了,能做出更加复杂,细致的好游戏。
第六章程序全文
#include<
>
#include<
#include"
"
>
#pragmacomment(lib,"
)
全局变量的一些定义
HMENUhmenu,haddmenu;
HWNDhWnd;
HDChdc,hDCMem;
BITMAPbm;
HBITMAPhBm_people,hBm_box,hBm_wall,hBm_dirtion,hBm_floor;
HINSTANCEhInst;
intCount=0;
charlpszMenuName[]="
Menu"
;
charlpszClassName[]="
typedefstruct
intHang;
intLie;
}Poision;
Poisionpoision;
intchoose=1;
/*@@@@@@函@数@原@型@的一些定义@@@@@@@@@@@@@*/
//对话框过程函数
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
/*WinMain函数*/
/********************
intWINAPIWinMain(
HINSTANCEhInstance,//handletocurrentinstanceHINSTANCEhPrevInstance,//handletopreviousinstanceLPSTRlpCmdLine,//commandline
intnCmdShow//showstate
MSGMessage;
HACCELhAccel;
InitWindowsClass(hInstance))returnFALSE;
//
InitWindows(hInstance,nCmdShow))returnFALSE;
hAccel=LoadAccelerators(hInstance,lpszMenuName);
/*while(GetMessage(&
Message,NULL,0,0))
{if(!
TranslateAccelerator(hWnd,hAccel,&
Message)){
TranslateMessage(&
Message);
DispatchMessage(&
return;
初始化窗口类
创建窗口
加载加速键资源*/
/**********************/
/*初始化类函数*/
BOOLInitWindowsClass(HINSTANCEhInstance)
WNDCLASSWndClass;
=0;
=(HBRUSH)GetStockObject(DKGRAY_BRUSH);
=LoadCursor(NULL,IDC_ARROW);
=LoadIcon(NULL,"
boxprogram"
=hInstance;
=WindowProc;
=lpszClassName;
=lpszMenuName;
//加载窗口类菜单
=CS_HREDRAW|CS_VREDRAW;
hBm_floor=LoadBitmap(hInstance,"
FLOOR"
hBm_people=LoadBitmap(hInstance,"
PEOPLE"
hBm_box=LoadBitmap(hInstance,"
BOX"
hBm_dirtion=LoadBitmap(hInstance,"
DIRTION"
hBm_wall=LoadBitmap(hInstance,"
WALL"
if(!
RegisterClass(&
WndClass))
MessageBeep(0);
returnTRUE;
//箱子
//墙
地板
小人
目的地
/*创建窗口函数*/
推箱子
SetTimer(hWnd,1,1,NULL);
ShowWindow(hWnd,nCmdShow);
}/**********************//*窗口过程函数*//**********************/
LRESULTCALLBACKWindowProc(HWNDhwnd,//handletowindowUINTuMsg,//messageidentifier
WPARAMwParam,//firstmessageparameterLPARAMlParam//secondmessageparameter
PAINTSTRUCTps;
//定义指向柏涵绘图信息的结构体变量
switch(uMsg)
caseWM_PAINT:
if(Count==2){
You
Count=0;
MessageBox(hwnd,"
Congratulations,success!
win"
MB_OK);
if(choose==1)
j++)
Map[i][j]=Map2[i][j];
InvalidateRect(hWnd,NULL,1);
//刷新整个界面}
elseif(choose==2)
Map[i][j]=Map3[i][j];
/*elseif(choose==3)
i++)for(j=0;
Map[i][j]=Map4[i][j];
*/
hdc=BeginPaint(hwnd,&
ps);
SetMapMode(hdc,MM_TEXT);
Show_Map();
EndPaint(hwnd,&
return0;
caseWM_CREATE:
//hdc=GetDC(hwnd);
//获取设备环境句柄hDCMem=CreateCompatibleDC(hdc);
//内存设备环境句柄//ReleaseDC(hwnd,hdc);
//释放设备环境句柄return0;
caseWM_COMMAND:
switch(LOWORD(wParam))
caseIDM_EXIT:
SendMessage(hwnd,WM_DESTROY,0,0);
break;
caseIDM_RESTART:
switch(choose)
case1:
j++)Map[i][j]=Map1[i][j];
case2:
case3:
case4:
case5:
j++)Map[i][j]=Map3[i][j];
InvalidateRect(hwnd,NULL,1);
//刷新整个界面
caseIDM_HELP:
DialogBox(hInst/*当前窗口的实例句柄*/,"
About"
hWnd,(DLGPROC)DlgProc);
caseWM_TIMER:
if(wParam==1)
charbuffer[100];
SYSTEMTIMEtmp;
char*WeekName[7]={"
星期日"
星期一"
星期二"
星期三"
星期四"
星期五"
星期六"
};
GetLocalTime(&
tmp);
sprintf(buffer,"
%04d年%02d月%02d日%02d:
%02d:
%02d%s%04d"
,WeekName[],;
SetWindowText(hWnd,buffer);
}break;
caseIDM_RANGE:
DialogBox(hInst,"
Range"
caseIDM_CHOOSE:
CHOOSE"
caseWM_KEYDOW