推箱子程序设计与报告

更新时间:2024-04-11 08:06:10 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

程 序 设 计 与 实 验 报 告

设计内容:推箱子姓名 :黄班级 :电信学号 :1

庭 1101

1107050123

目 录

一.引言

二.需求分析与系统设计

三. 开发技术 四.程序中的主要模块 五. 心得体会 六. 程序全文

2

一.引言

在实际编写程序的过程中,产生的一些疑惑与不解,在同学和老师的帮助下圆满解决,对于老师和同学们的帮助,在此我表示衷心的感谢。因为一开始构架的问题造成了一些功能的不能实现。经多方努力仍不能解决,留下遗憾,希望随着日后能力的提高能解决今天留下的问题。

二.需求分析与系统设计

2.1 设计目的

通过本学期对游戏程序的研究,我们掌握了运用win32来制作游戏的技术,虽然不娴熟还有待提高,但是一些技术含量较低的小游戏还是很容易让我们掌握的。

此次游戏程序设计的目的,主要是通过win32来制作游戏来更好的掌握编程语言。通过win32这个平台,熟习在制作游戏方面所需要的技巧,将自己的游戏尽可能多的运用所学到的技术,并且将在课程上面学到的知识付诸于实践,并从实际操作中,找出自己的不足之处进行弥补。

每一次的课程设计,都是一次小小的软件工程,所以需要我们用百分百认真的态度来对待。对于小一点的程序,我们一个人足以应付,但是这并不是说我们可以单独一个人为所欲为,其实质应该是通过课程设计来培养自己独立自主的能力。而对于那些

3

相对于麻烦的程序,便需要我们的协作,这样对我们以后进入企

业公司发展打下了更多的基础。

2.2 设计要求

这次课程设计的要求并不像以往那么紧,老师让给了我们充足的时间来制作游戏,虽然是计划做一款较为大众的经典游戏,并且能力有限,但还是对游戏做出了较高的期望,对于功能做出了较多的设想。例如,背景音乐的播放,时间的显示,自动切换关卡,难度的选择等。

2.3 界面设计

图2.3.1进入后的主界面

4

图2.3.2素材图片集合

这个程序是一个益智类的游戏,是一个单机游戏,人物通过推动箱子到达目的地以在游戏中取胜,同一时刻只能有一位玩家进行游戏。

图2.3.4英雄榜

5

图2.3.5关于游戏

图2.3.3选择关卡截图

2.4 游戏流程

系统流程图:

游戏开始 选择关卡 6

进行游戏 完成游戏 自动切换 下一关 结束游戏 游戏开局出现如图1,然后进行难度的选择,再是关卡的选择,然后就可以游戏了,

游戏完成之后会自动切换下一关,游戏者可手动选择结束游戏。

三. 开发技术 3.1 Win32 API 简介

Win32

API即为Microsoft 32位平台的应用程序编程接口

(Application Programming Interface)。所有在Win32平台上运行的应用程序都可以调用这些函数。 使用Win32 API,应用程序可以充分挖掘Windows的32位操作系统的潜力。 Mircrosoft的所有32位平台都支持统一的API,包括函数、结构、消息、宏及接口。使用 Win32 API不但可以开发出在各种平台上都能成功运行的应用程序,而且也可以充分利用每个平台特有的功能和属性。 在具体编程时,程序实现方式的差异依赖于相应平台的底层功能的不同。最显著的差异是某些函数只能在更强大的平台上实现其功能。例如,安全函数只能在Windows NT操作系统下使用。另外一些主要差别就是系统限制,比如值的范围约束,或函数可管理的项目个数等等。

7

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(\

8

}

BOOL InitWindows(HINSTANCE hInstance,int nCmdShow) {

hWnd=CreateWindow(\推箱子

\

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;i<10;i++)//1表示墙 0表示通路 2表示箱子目的地

for(j=0;j<10;j++) if(Map[i][j]==1)

Show_Image(hBm_wall,32*j,32*i); else if(Map[i][j]==2)

Show_Image(hBm_box,32*j,32*i); else if(Map[i][j]==3)

Show_Image(hBm_people,32*j,32*i); else if(Map[i][j]==4)

Show_Image(hBm_dirtion,32*j,32*i); else if(Map[i][j]==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;i<10;i++) {

for(j=0;j<10;j++) {

9

表示人表示 3 4

}

}

if(Map[i][j]==3) {

poision.Hang=i; poision.Lie=j; flag=TRUE; break; } }

if(flag==TRUE) break;

4.5 地图的编写

int Map4[10][10]={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 Map5[10][10]={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 Map1[10][10]={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,

10

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 Map2[10][10]={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 Map3[10][10]={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 Map[10][10]={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(\

11

五 心得体会

通过一个学期的学习实践,我掌握了一些比较基础的编程方

法。在实际操作上有了很大程度的提高,在听课以及与同学交流的过程中,受益匪浅,感悟颇多。

看似简单的编程游戏背后,确实异常复杂的算法。在网上参考了一些类似的逻辑算法和代码,并在前人的基础上进行拓展与改编。同时也让我更认识到了自身学习的不足之处,也更进一步产生了对游戏开发的兴趣。游戏开发是一个创新的过程,由于能力欠缺,仅仅做了一个众所周知的经典项目。希望日后能力提高了,能做出更加复杂,细致的好游戏。

第六章 程序全文

#include #include #include #include\#include\

#include

#pragma comment(lib,\

/**********全局变量的一些定义********/ HMENU hmenu,haddmenu;

12

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[]=\char lpszClassName[]=\typedef struct {

int 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 ) {

13

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,\ WndClass.hInstance=hInstance; WndClass.lpfnWndProc=WindowProc;

WndClass.lpszClassName=lpszClassName;

WndClass.lpszMenuName=lpszMenuName;//加载窗口类菜单 WndClass.style=CS_HREDRAW | CS_VREDRAW;

hBm_floor=LoadBitmap(hInstance,\ //地板 hBm_people=LoadBitmap(hInstance,\ //小人 hBm_box=LoadBitmap(hInstance,\ //箱子

hBm_dirtion=LoadBitmap(hInstance,\ //目的地 hBm_wall=LoadBitmap(hInstance,\ //墙 if(!RegisterClass(&WndClass)) {

MessageBeep(0); return FALSE; }

return TRUE;

14

}

/**********************/ /*创建窗口函数*/

/**********************/ void main() {

PlaySound(\}

BOOL InitWindows(HINSTANCE hInstance,int nCmdShow) {

hWnd=CreateWindow(\推箱子

\ 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,\successwin\

if(choose==1) {

for(i=0;i<10;i++)

15

\

for(j=0;j<10;j++)

Map[i][j]=Map2[i][j];

InvalidateRect(hWnd,NULL,1);//刷新整个界面 }

else if(choose==2) for(i=0;i<10;i++) for(j=0;j<10;j++)

Map[i][j]=Map3[i][j]; /*else if(choose==3) for(i=0;i<10;i++) for(j=0;j<10;j++)

Map[i][j]=Map4[i][j];*/ }

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;i<10;i++) for(j=0;j<10;j++)

Map[i][j]=Map1[i][j]; break; case 2:

for(i=0;i<10;i++) for(j=0;j<10;j++)

Map[i][j]=Map2[i][j]; break; case 3:

16

for(i=0;i<10;i++) for(j=0;j<10;j++)

Map[i][j]=Map3[i][j]; break; case 4:

for(i=0;i<10;i++) for(j=0;j<10;j++)

Map[i][j]=Map3[i][j]; break; case 5:

for(i=0;i<10;i++) for(j=0;j<10;j++)

Map[i][j]=Map3[i][j]; break; }

InvalidateRect(hwnd,NULL,1);//刷新整个界面 Show_Map(); break;

case IDM_HELP: DialogBox(hInst/*当前窗口的实例句柄*/,\ break; case IDM_TOOL:

PlaySound(\ break; case WM_TIMER: {

if( wParam == 1 ) {

char buffer[100]; SYSTEMTIME tmp;

char *WeekName[7] = {\星期日\星期一\星期二\星期三\星期四\星期五\星期六\

GetLocalTime(&tmp);

sprintf(buffer, \年d月d日 d:d:d %s d\

tmp.wYear, tmp.wMonth, tmp.wDay, tmp.wHour, tmp.wMinute, tmp.wSecond,WeekName[tmp.wDayOfWeek], tmp.wMilliseconds);

SetWindowText(hWnd, buffer );

17

} }

break;

case IDM_RANGE:

DialogBox(hInst,\ break;

case IDM_CHOOSE:

DialogBox(hInst,\ break; }

break;

case WM_KEYDOWN: switch(wParam) {

case VK_RIGHT:

Get_Poision(poision);

if(Map[poision.Hang][poision.Lie+1]==0) {

Map[poision.Hang][poision.Lie+1]=3;//人走过来 Map[poision.Hang][poision.Lie]=0; //变成路 }

else if(Map[poision.Hang][poision.Lie+1]==2) {

if(Map[poision.Hang][poision.Lie+2]==0) {

Map[poision.Hang][poision.Lie+2]=2; Map[poision.Hang][poision.Lie+1]=3; Map[poision.Hang][poision.Lie]=0; }

if(Map[poision.Hang][poision.Lie+2]==4) {

Map[poision.Hang][poision.Lie+2]=2; Map[poision.Hang][poision.Lie+1]=3; Map[poision.Hang][poision.Lie]=0; Count++; } }

InvalidateRect(hwnd,NULL,1);//刷新整个界面 Show_Map(); break; case VK_LEFT:

Get_Poision(poision);

if(Map[poision.Hang][poision.Lie-1]==0)

18

{

Map[poision.Hang][poision.Lie-1]=3;//箱子走过来

Map[poision.Hang][poision.Lie]=0; //人过来,身后变成路 }

else if(Map[poision.Hang][poision.Lie-1]==2) {

if(Map[poision.Hang][poision.Lie-2]==0) {

Map[poision.Hang][poision.Lie-2]=2; Map[poision.Hang][poision.Lie-1]=3; Map[poision.Hang][poision.Lie]=0; }

if(Map[poision.Hang][poision.Lie-2]==4) {

Map[poision.Hang][poision.Lie-2]=2; Map[poision.Hang][poision.Lie-1]=3; Map[poision.Hang][poision.Lie]=0; Count++; } }

InvalidateRect(hwnd,NULL,1);//刷新整个界面 Show_Map(); break; case VK_UP:

Get_Poision(poision);

if(Map[poision.Hang-1][poision.Lie]==0) {

Map[poision.Hang-1][poision.Lie]=3;//箱子走过来

Map[poision.Hang][poision.Lie]=0; //人过来,身后变成路 }

else if(Map[poision.Hang-1][poision.Lie]==2) {

if(Map[poision.Hang-2][poision.Lie]==0) {

Map[poision.Hang-2][poision.Lie]=2; Map[poision.Hang-1][poision.Lie]=3; Map[poision.Hang][poision.Lie]=0; }

if(Map[poision.Hang-2][poision.Lie]==4) {

Map[poision.Hang-2][poision.Lie]=2; Map[poision.Hang-1][poision.Lie]=3; Map[poision.Hang][poision.Lie]=0;

19

Count++; } }

InvalidateRect(hwnd,NULL,1);//刷新整个界面 Show_Map(); break; case VK_DOWN:

Get_Poision(poision);

if(Map[poision.Hang+1][poision.Lie]==0) {

Map[poision.Hang+1][poision.Lie]=3;//箱子走过来

Map[poision.Hang][poision.Lie]=0; //人过来,身后变成路 }

else if(Map[poision.Hang+1][poision.Lie]==2) {

if(Map[poision.Hang+2][poision.Lie]==0) {

Map[poision.Hang+2][poision.Lie]=2; Map[poision.Hang+1][poision.Lie]=3; Map[poision.Hang][poision.Lie]=0; }

if(Map[poision.Hang+2][poision.Lie]==4) {

Map[poision.Hang+2][poision.Lie]=2; Map[poision.Hang+1][poision.Lie]=3; Map[poision.Hang][poision.Lie]=0; Count++; } }

InvalidateRect(hwnd,NULL,1);//刷新整个界面 Show_Map(); break; }

break; case WM_CLOSE:

if(IDYES==MessageBox(hwnd,\you really want to quit?\退出\ DestroyWindow(hwnd); break;

case WM_DESTROY:

PostQuitMessage(0); break; default:

return DefWindowProc(hwnd,uMsg,wParam,lParam);

20

}

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;i<10;i++) for(j=0;j<10;j++)

Map[i][j]=Map1[i][j]; break; case 2:

for(i=0;i<10;i++) for(j=0;j<10;j++)

Map[i][j]=Map2[i][j]; break; case 3:

for(i=0;i<10;i++) for(j=0;j<10;j++)

Map[i][j]=Map3[i][j]; break; case 4:

for(i=0;i<10;i++) for(j=0;j<10;j++)

Map[i][j]=Map4[i][j];

21

break; case 5:

for(i=0;i<10;i++)

for(j=0;j<10;j++) Map[i][j]=Map4[i][j]; 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;

22

for(i=0;i<10;i++)//1表示墙 0表示通路 2表示箱子 3表示人 4表示目的地 for(j=0;j<10;j++) if(Map[i][j]==1)

Show_Image(hBm_wall,32*j,32*i); else if(Map[i][j]==2)

Show_Image(hBm_box,32*j,32*i); else if(Map[i][j]==3)

Show_Image(hBm_people,32*j,32*i); else if(Map[i][j]==4)

Show_Image(hBm_dirtion,32*j,32*i); else if(Map[i][j]==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;i<10;i++) {

for(j=0;j<10;j++) {

if(Map[i][j]==3) {

poision.Hang=i; poision.Lie=j; flag=TRUE; break; } }

if(flag==TRUE) break; } }

23

本文来源:https://www.bwwdw.com/article/tbyp.html

Top