推箱子程序设计与报告

上传人:huo****ian 文档编号:162013115 上传时间:2022-10-17 格式:DOC 页数:23 大小:163.01KB
返回 下载 相关 举报
推箱子程序设计与报告_第1页
第1页 / 共23页
推箱子程序设计与报告_第2页
第2页 / 共23页
推箱子程序设计与报告_第3页
第3页 / 共23页
点击查看更多>>
资源描述
程序设计与实验报告 设计内容:推箱子 姓名 :黄 庭 班级 :电信1101 学号 :1107050123 目 录一引言二需求分析与系统设计三 开发技术四程序中的主要模块五. 心得体会六. 程序全文一 引言在实际编写程序的过程中,产生的一些疑惑与不解,在同学和老师的帮助下圆满解决,对于老师和同学们的帮助,在此我表示衷心的感谢。因为一开始构架的问题造成了一些功能的不能实现。经多方努力仍不能解决,留下遗憾,希望随着日后能力的提高能解决今天留下的问题。二需求分析与系统设计2.1 设计目的通过本学期对游戏程序的研究,我们掌握了运用win32来制作游戏的技术,虽然不娴熟还有待提高,但是一些技术含量较低的小游戏还是很容易让我们掌握的。此次游戏程序设计的目的,主要是通过win32来制作游戏来更好的掌握编程语言。通过win32这个平台,熟习在制作游戏方面所需要的技巧,将自己的游戏尽可能多的运用所学到的技术,并且将在课程上面学到的知识付诸于实践,并从实际操作中,找出自己的不足之处进行弥补。每一次的课程设计,都是一次小小的软件工程,所以需要我们用百分百认真的态度来对待。对于小一点的程序,我们一个人足以应付,但是这并不是说我们可以单独一个人为所欲为,其实质应该是通过课程设计来培养自己独立自主的能力。而对于那些相对于麻烦的程序,便需要我们的协作,这样对我们以后进入企业公司发展打下了更多的基础。2.2 设计要求这次课程设计的要求并不像以往那么紧,老师让给了我们充足的时间来制作游戏,虽然是计划做一款较为大众的经典游戏,并且能力有限,但还是对游戏做出了较高的期望,对于功能做出了较多的设想。例如,背景音乐的播放,时间的显示,自动切换关卡,难度的选择等。2.3 界面设计图2.3.1进入后的主界面图2.3.2素材图片集合这个程序是一个益智类的游戏,是一个单机游戏,人物通过推动箱子到达目的地以在游戏中取胜,同一时刻只能有一位玩家进行游戏。图2.3.4英雄榜图2.3.5关于游戏 图2.3.3选择关卡截图2.4 游戏流程 系统流程图:游戏开始选择关卡选择关卡进行游戏进行游戏自动切换下一关完成游戏完成游戏结束游戏游戏开局出现如图1,然后进行难度的选择,再是关卡的选择,然后就可以游戏了,游戏完成之后会自动切换下一关,游戏者可手动选择结束游戏。三 开发技术3.1 Win32 API 简介 Win32 API即为Microsoft 32位平台的应用程序编程接口(Application Programming Interface)。所有在Win32平台上运行的应用程序都可以调用这些函数。使用Win32 API,应用程序可以充分挖掘Windows的32位操作系统的潜力。 Mircrosoft的所有32位平台都支持统一的API,包括函数、结构、消息、宏及接口。使用 Win32 API不但可以开发出在各种平台上都能成功运行的应用程序,而且也可以充分利用每个平台特有的功能和属性。在具体编程时,程序实现方式的差异依赖于相应平台的底层功能的不同。最显著的差异是某些函数只能在更强大的平台上实现其功能。例如,安全函数只能在Windows NT操作系统下使用。另外一些主要差别就是系统限制,比如值的范围约束,或函数可管理的项目个数等等。 3.2 Win32 API函数分类标准Win32 API函数可以分为以下几类:1、 窗口管理2、 窗口通用控制3、 Shell特性4、 图形设备接口5、 系统服务6、 国际特性7、 网络服务 四程序中的主要模块4.1函数原型的一些定义LRESULT CALLBACK WindowProc( HWND hwnd, / handle to window UINT uMsg, / message identifier WPARAM wParam, / first message parameter LPARAM lParam / second message parameter);/窗口过程函数原型BOOL InitWindowsClass(HINSTANCE hInstance);/初始化窗口类BOOL InitWindows(HINSTANCE hInstance,int nCmdShow);/初始化窗口BOOL CALLBACK DlgProc(HWND hdlg,UINT message,WPARAM wParam,LPARAM lParam);/对话框过程函数void Show_Image(HBITMAP bmap,int i,int j); /显示单张图片void Draw_Map();/作图的函数void Show_Map();/显示地图void Get_Poision(Poision &poision);/人物在哪里的定位4.2创建窗口函数void main()PlaySound(E:2.wav, NULL, SND_FILENAME | SND_ASYNC);BOOL InitWindows(HINSTANCE hInstance,int nCmdShow)hWnd=CreateWindow(joe,推箱子,WS_OVERLAPPEDWINDOW,450,200,325,372,NULL,NULL,hInstance,NULL);if(!hWnd)return FALSE;SetTimer(hWnd, 1, 1, NULL);ShowWindow(hWnd,nCmdShow);UpdateWindow(hWnd);hInst=hInstance;return TRUE;4.3 地图的输出void Show_Map()int i,j;for(i=0;i10;i+)/1表示墙 0表示通路 2表示箱子 3表示人 4表示目的地for(j=0;j10;j+)if(Mapij=1)Show_Image(hBm_wall,32*j,32*i);else if(Mapij=2)Show_Image(hBm_box,32*j,32*i);else if(Mapij=3)Show_Image(hBm_people,32*j,32*i);else if(Mapij=4)Show_Image(hBm_dirtion,32*j,32*i);else if(Mapij=0)Show_Image(hBm_floor,32*j,32*i);4.4人物的定位void Get_Poision(Poision &poision)int i=0,j=0;bool flag=FALSE;poision.Hang=0,poision.Lie=0;for(i=0;i10;i+)for(j=0;j10;j+)if(Mapij=3)poision.Hang=i;poision.Lie=j;flag=TRUE;break;if(flag=TRUE)break;4.5 地图的编写int Map41010=1,1,1,1,1,0,0,0,0,0, /1表示墙 0表示通路 2表示箱子 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 ;int Map51010=1,1,1,1,1,1,1,1,1,1, /1表示墙 0表示通路 2表示箱子 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 ;int Map11010=1,1,1,1,1,1,1,1,1,1, /1表示墙 0表示通路 2表示箱子 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 ;int Map21010=1,1,1,1,1,1,1,1,1,1, /1表示墙 0表示通路 2表示箱子 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 ;int Map31010=1,1,1,1,1,1,1,1,1,1, /1表示墙 0表示通路 2表示箱子 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 ;int Map1010=0,1,1,1,1,1,1,1,0,0, /1表示墙 0表示通路 2表示箱子 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 ;4.6 通过调用playsound 实现背景音乐 case IDM_TOOL:PlaySound(E:2.wav, NULL, SND_FILENAME | SND_ASYNC);五 心得体会 通过一个学期的学习实践,我掌握了一些比较基础的编程方法。在实际操作上有了很大程度的提高,在听课以及与同学交流的过程中,受益匪浅,感悟颇多。 看似简单的编程游戏背后,确实异常复杂的算法。在网上参考了一些类似的逻辑算法和代码,并在前人的基础上进行拓展与改编。同时也让我更认识到了自身学习的不足之处,也更进一步产生了对游戏开发的兴趣。游戏开发是一个创新的过程,由于能力欠缺,仅仅做了一个众所周知的经典项目。希望日后能力提高了,能做出更加复杂,细致的好游戏。第六章 程序全文#include#include#include#includeMenu.h#includeMap.h#include #pragma comment(lib,winmm.lib)/*全局变量的一些定义*/HMENU hmenu,haddmenu;HWND hWnd;HDC hdc,hDCMem;BITMAP bm;HBITMAP hBm_people,hBm_box,hBm_wall,hBm_dirtion,hBm_floor;HINSTANCE hInst;int Count=0;char lpszMenuName=Menu;char lpszClassName=joe;typedef structint Hang;int Lie;Poision;Poision poision;int choose=1;/*/*函数原型的一些定义*/LRESULT CALLBACK WindowProc( HWND hwnd, / handle to window UINT uMsg, / message identifier WPARAM wParam, / first message parameter LPARAM lParam / second message parameter);/窗口过程函数原型BOOL InitWindowsClass(HINSTANCE hInstance);/初始化窗口类BOOL InitWindows(HINSTANCE hInstance,int nCmdShow);/初始化窗口BOOL CALLBACK DlgProc(HWND hdlg,UINT message,WPARAM wParam,LPARAM lParam);/对话框过程函数void Show_Image(HBITMAP bmap,int i,int j); /显示单张图片void Draw_Map();/作图的函数void Show_Map();/显示地图void Get_Poision(Poision &poision);/人物在哪里的定位/*/*/*WinMain函数*/*/int WINAPI WinMain( HINSTANCE hInstance, / handle to current instance HINSTANCE hPrevInstance, / handle to previous instance LPSTR lpCmdLine, / command line int nCmdShow / show state)MSG Message;HACCEL hAccel; if(!InitWindowsClass(hInstance) return FALSE;/初始化窗口类if(!InitWindows(hInstance,nCmdShow) return FALSE;/创建窗口hAccel=LoadAccelerators(hInstance,lpszMenuName);/*加载加速键资源*/while(GetMessage(&Message,NULL,0,0)if(!TranslateAccelerator(hWnd,hAccel,&Message)TranslateMessage(&Message);DispatchMessage(&Message);return Message.wParam;/*/*初始化类函数*/*/BOOL InitWindowsClass(HINSTANCE hInstance)WNDCLASS WndClass;WndClass.cbClsExtra=0;WndClass.cbWndExtra=0;WndClass.hbrBackground=(HBRUSH)GetStockObject(DKGRAY_BRUSH);WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);WndClass.hIcon=LoadIcon(NULL,boxprogram);WndClass.hInstance=hInstance;WndClass.lpfnWndProc=WindowProc;WndClass.lpszClassName=lpszClassName;WndClass.lpszMenuName=lpszMenuName;/加载窗口类菜单WndClass.style=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);return FALSE;return TRUE;/*/*创建窗口函数*/*/void main()PlaySound(E:2.wav, NULL, SND_FILENAME | SND_ASYNC);BOOL InitWindows(HINSTANCE hInstance,int nCmdShow)hWnd=CreateWindow(joe,推箱子,WS_OVERLAPPEDWINDOW,450,200,325,372,NULL,NULL,hInstance,NULL);if(!hWnd)return FALSE;SetTimer(hWnd, 1, 1, NULL);ShowWindow(hWnd,nCmdShow);UpdateWindow(hWnd);hInst=hInstance;return TRUE;/*/*窗口过程函数*/*/LRESULT CALLBACK WindowProc( HWND hwnd, / handle to window UINT uMsg, / message identifier WPARAM wParam, / first message parameter LPARAM lParam / second message parameter)int i=0,j=0;PAINTSTRUCT ps;/定义指向柏涵绘图信息的结构体变量switch(uMsg)case WM_PAINT:if(Count=2)Count=0;MessageBox(hwnd,Congratulations, success!,You win,MB_OK);if(choose=1)for(i=0;i10;i+)for(j=0;j10;j+)Mapij=Map2ij; InvalidateRect(hWnd,NULL,1);/刷新整个界面 else if(choose=2)for(i=0;i10;i+)for(j=0;j10;j+)Mapij=Map3ij;/*else if(choose=3)for(i=0;i10;i+)for(j=0;j10;j+)Mapij=Map4ij;*/hdc=BeginPaint(hwnd,&ps);SetMapMode(hdc,MM_TEXT);Show_Map();EndPaint(hwnd,&ps);return 0;case WM_CREATE: /hdc=GetDC(hwnd);/获取设备环境句柄 hDCMem=CreateCompatibleDC(hdc);/内存设备环境句柄 /ReleaseDC(hwnd,hdc); /释放设备环境句柄return 0;case WM_COMMAND:switch(LOWORD(wParam)case IDM_EXIT:SendMessage(hwnd,WM_DESTROY,0,0);break; case IDM_RESTART:switch(choose)case 1:for(i=0;i10;i+)for(j=0;j10;j+)Mapij=Map1ij;break;case 2:for(i=0;i10;i+)for(j=0;j10;j+)Mapij=Map2ij;break;case 3:for(i=0;i10;i+)for(j=0;j10;j+)Mapij=Map3ij;break;case 4:for(i=0;i10;i+)for(j=0;j10;j+)Mapij=Map3ij;break;case 5:for(i=0;i10;i+)for(j=0;j10;j+)Mapij=Map3ij;break; InvalidateRect(hwnd,NULL,1);/刷新整个界面Show_Map();break;case IDM_HELP:DialogBox(hInst/*当前窗口的实例句柄*/,About,hWnd,(DLGPROC)DlgProc);break; case IDM_TOOL:PlaySound(E:2.wav, NULL, SND_FILENAME | SND_ASYNC); break;case WM_TIMER:if( wParam = 1 )char buffer100;SYSTEMTIME tmp;char *WeekName7 = 星期日,星期一,星期二,星期三,星期四,星期五,星期六;GetLocalTime(&tmp);sprintf(buffer, %04d年%02d月%02d日 %02d:%02d:%02d %s %04d,tmp.wYear, tmp.wMonth, tmp.wDay, tmp.wHour,tmp.wMinute, tmp.wSecond,WeekNametmp.wDayOfWeek, tmp.wMilliseconds);SetWindowText(hWnd, buffer );break;case IDM_RANGE: DialogBox(hInst,Range,hWnd,(DLGPROC)DlgProc);break;case IDM_CHOOSE:DialogBox(hInst,CHOOSE,hWnd,(DLGPROC)DlgProc);break;break;case WM_KEYDOWN:switch(wParam)case VK_RIGHT:Get_Poision(poision);if(Mappoision.Hangpoision.Lie+1=0)Mappoision.Hangpoision.Lie+1=3;/人走过来Mappoision.Hangpoision.Lie=0; /变成路else if(Mappoision.Hangpoision.Lie+1=2)if(Mappoision.Hangpoision.Lie+2=0)Mappoision.Hangpoision.Lie+2=2;Mappoision.Hangpoision.Lie+1=3;Mappoision.Hangpoision.Lie=0;if(Mappoision.Hangpoision.Lie+2=4)Mappoision.Hangpoision.Lie+2=2;Mappoision.Hangpoision.Lie+1=3;Mappoision.Hangpoision.Lie=0;Count+;InvalidateRect(hwnd,NULL,1);/刷新整个界面Show_Map();break;case VK_LEFT:Get_Poision(poision);if(Mappoision.Hangpoision.Lie-1=0)Mappoision.Hangpoision.Lie-1=3;/箱子走过来Mappoision.Hangpoision.Lie=0; /人过来,身后变成路else if(Mappoision.Hangpoision.Lie-1=2)if(Mappoision.Hangpoision.Lie-2=0)Mappoision.Hangpoision.Lie-2=2;Mappoision.Hangpoision.Lie-1=3;Mappoision.Hangpoision.Lie=0;if(Mappoision.Hangpoision.Lie-2=4)Mappoision.Hangpoision.Lie-2=2;Mappoision.Hangpoision.Lie-1=3;Mappoision.Hangpoision.Lie=0;Count+;InvalidateRect(hwnd,NULL,1);/刷新整个界面Show_Map();break;case VK_UP:Get_Poision(poision);if(Mappoision.Hang-1poision.Lie=0)Mappoision.Hang-1poision.Lie=3;/箱子走过来Mappoision.Hangpoision.Lie=0; /人过来,身后变成路else if(Mappoision.Hang-1poision.Lie=2)if(Mappoision.Hang-2poision.Lie=0)Mappoision.Hang-2poision.Lie=2;Mappoision.Hang-1poision.Lie=3;Mappoision.Hangpoision.Lie=0;if(Mappoision.Hang-2poision.Lie=4)Mappoision.Hang-2poision.Lie=2;Mappoision.Hang-1poision.Lie=3;Mappoision.Hangpoision.Lie=0;Count+;InvalidateRect(hwnd,NULL,1);/刷新整个界面Show_Map();break;case VK_DOWN:Get_Poision(poision);if(Mappoision.Hang+1poision.Lie=0)Mappoision.Hang+1poision.Lie=3;/箱子走过来Mappoision.Hangpoision.Lie=0; /人过来,身后变成路else if(Mappoision.Hang+1poision.Lie=2) if(Mappoision.Hang+2poision.Lie=0)Mappoision.Hang+2poision.Lie=2;Mappoision.Hang+1poision.Lie=3;Mappoision.Hangpoision.Lie=0;if(Mappoision.Hang+2poision.Lie=4)Mappoision.Hang+2poision.Lie=2;Mappoision.Hang+1poision.Lie=3;Mappoision.Hangpoision.Lie=0;Count+;InvalidateRect(hwnd,NULL,1);/刷新整个界面Show_Map();break;break;case WM_CLOSE:if(IDYES=MessageBox(hwnd,Do you really want to quit?,退出,MB_YESNO)DestroyWindow(hwnd);break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hwnd,uMsg,wParam,lParam);return 0;/*/*对话框过程函数*/*/BOOL CALLBACK DlgProc(HWND hdlg,UINT message,WPARAM wParam,LPARAM lParam)int i=0,j=0;BOOL root;switch(message)case WM_INITDIALOG:return TRUE;case WM_COMMAND:switch(LOWORD(wParam)case IDC_EDIT1:Count=0;choose=GetDlgItemInt(hdlg,IDC_EDIT1,&root,TRUE);switch(choose)case 1:for(i=0;i10;i+)for(j=0;j10;j+)Mapij=Map1ij;break;case 2:for(i=0;i10;i+)for(j=0;j10;j+)Mapij=Map2ij;break;case 3: for(i=0;i10;i+)for(j=0;j10;j+)Mapij=Map3ij;break;case 4:for(i=0;i10;i+)for(j=0;j10;j+)Mapij=Map4ij;break;case 5:for(i=0;i10;i+)for(j=0;j10;j+)Mapij=Map4ij;break;InvalidateRect(hWnd,NULL,1);/刷新整个界面Show_Map();break;case IDOK: EndDialog(hdlg,0);return TRUE;break;case WM_CLOSE:EndDialog(hdlg,0);return TRUE;return FALSE;/*/*生成地图的函数*/*/void Draw_Map()/*/*显示单张图片函数*/*/void Show_Image(HBITMAP bmap,int i,int j)GetObject(bmap, sizeof(BITMAP),(LPVOID)&bm);SelectObject(hDCMem,bmap);/将位图选入内存设备环境BitBlt(hdc,i,j,bm.bmWidth,bm.bmHeight,hDCMem,0,0,SRCCOPY);/将原位图复制到目标位图/*/*输出一张地图*/*/void Show_Map()int i,j;for(i=0;i10;i+)/1表示墙 0表示通路 2表示箱子 3表示人 4表示目的地for(j=0;j10;j+)if(Mapij=1)Show_Image(hBm_wall,32*j,32*i);else if(Mapij=2)Show_Image(hBm_box,32*j,32*i);else if(Mapij=3)Show_Image(hBm_people,32*j,32*i);else if(Mapij=4)Show_Image(hBm_dirtion,32*j,32*i);else if(Mapij=0)Show_Image(hBm_floor,32*j,32*i);/*/*人在哪里的定位*/*/void Get_Poision(Poision &poision)int i=0,j=0;bool flag=FALSE;poision.Hang=0,poision.Lie=0;for(i=0;i10;i+)for(j=0;j10;j+)if(Mapij=3)poision.Hang=i;poision.Lie=j;flag=TRUE;break;if(flag=TRUE)break;
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!