当前位置:文档之家› Windows 编程拼图游戏

Windows 编程拼图游戏

Windows 编程拼图游戏
Windows 编程拼图游戏

大连民族学院

计算机科学与工程学院大作业

作业题目:简易拼图小游戏

课程名称: Windows 编程

实验类型:□演示性□验证性□操作性□设计性■综合性

专业:计算计科学与技术班级:计科09

学生姓名:学号:2009081

实验日期: 2011年11月5日实验地点:多媒体机房

实验学时:4 学时实验成绩:

指导教师签字:

年月日

目录

目录 (2)

一.问题描述 (3)

二.基本要求 (3)

三. 概要设计 (3)

1.系统需求分析 (3)

1) 功能分析 (3)

2)对象识别 (4)

3)类关系图及类成员 (4)

4)软件接口设计 (5)

四.详细设计 (6)

1.流程图 (6)

2创建初始界面 (7)

3.位图的读入和显示 (9)

4.类关系图及成员函数 (11)

五.编码与调试分析 (12)

1.程序编码 (12)

1)CspellPictureDlg类的编码 (12)

2)游戏获胜GameWin()的编码 (12)

3)选择图片Onmenustart()的编码 (13)

2调试分析 (13)

六.使用说明 (14)

七.测试 (17)

九.附录(部分源代码) (17)

一.问题描述

拼图游戏是同学们喜欢的益智游戏之一,带着浓厚的兴趣,我选择设计一个简易拼图小游戏作为此次设计的课题。

利用所学知识,并实现如下功能:

①可以更换拼图背景图片;

②可以区分等级,如3*3,4*4,5*5等;

③根据用户需求,给予背景图提示;

④实现背景音乐;

二.基本要求

①通过实践加强对程序设计语言课程知识点的理解和掌握,培养对课程知识综合运用能力、实际分析问题能力及编程能力,养成良好的编程习惯。

②通过实践进一步领会程序设计的特点和应用,提高运用C++ 以及面向对象知识解决实际问题的能力,初步掌握MFC变成的基本功能。

③通过实践掌握用C++ 编写面向对象的实用程序的设计方法,对面向对象方法和思想增加感性的认识;学会利用C++程序设计语言编写出一些短小、可靠的Windows实用程序,切实提高面向对象的程序设计能力,为后续的相关课程的学习打下基础。

三. 概要设计

1.系统需求分析

1) 功能分析

简单的拼图游戏应该有拼图、选择难度、更换背景图片、判断拼图是否成功等功能,下图所示是拼图游戏的用例图,表明拼图游戏的主要功能。

2)对象识别

3)类关系图及类成员

CMosaicApp :拼图游戏线程,应用程序

CMosaicDoc :拼图文档类

CAboutDlg :一个About对话框

CMainFrame :单文档主要框架、计时器

CMosaicView :控制游戏的开始、结束,难度的选择、底图的选取

CPlacePicture :存放图形坐标、判断拼图成功与否

4)软件接口设计

class CMosaicView : public CView{

protected:

{

void OnGameCustomnew(); //自定义

void OnBegingame(); //开始游戏

void OnPicture1(); //底图1

void OnPicture2(); //底图2

void OnPicture3(); //底图3

void OnVeryeasy(); //难度一

void OnEasy(); //难度二

void OnLittlehard(); //难度三

void OnBack();

void OnReset(); //重置

}

};

class CPlacePicture

{

public:

CPlacePicture(); //构造函数初始化

virtual ~CPlacePicture(); //析构函数bool LoadPicture(char *strFileName); //载入位图bool InitPatches(DWORD nWdith,int srcx,int srcy,int dstx,int dsty); //初始化矩阵bool IsWin(); //判断拼图胜利

bool ClearAll(); //清除位图

bool DrawPatches(CDC *pDC); //画矩阵

void GetPatchAtPos(POINT *pt,long *pnSrcDest,long *pnPatchIndex); //获得坐标void OnStartDrag(POINT *pt); //开始拖动void OnMove(POINT *pt); //拖动

void OnEndDrag(POINT *pt); //结束拖动,判断是否拖动成功

四.详细设计

1.流程图

首先,我们用流成图来整体认识做这个游戏的逻辑结果,之后再逐步进行!

2创建初始界面

新建一个MFC AppWizard(exe)工程,将其命名为SpellPicture,在MFC应用程序向导步骤1中选择基本对话框,如图1-1所示。

图1-1

接下上来在工作区的Resource标签中加入菜单资源,方法在SpellPicture上右击,在淡出的快捷菜单中选择“插入”,如图1-2所示。

图1-2

然后在弹出的对话框中选中menu项,单击New,完成后的效果如图1-3所示。

图1-3

添加如图1-4的菜单项;

图1-4

游戏菜单下的子菜单项的ID设置如图1-5所示,对于其他的ID设置与这个基本一样,不再给出图示;

图1-5

3.位图的读入和显示

在程序中,需要有用户来选择游戏中使用的图片,同时还需要将整幅图片分成不同的小块,因此,采用Static控件作为位图的载体,分别显示图片的不同部分。

首先,需要读入位图资源。单击VC6.0菜单栏上的“Insert-Resource…”子菜单,在淡出的对话框中选中Bitmap,在单击“import…”,在弹出的对话框中找到你需要添加进来的图片(注意在文件类型下拉框中选择“所有文件(*.*)”,否则你将找不到“*.bmp”的图片),单击“import”后将淡出如下确认框,单击“确定”即可。

接下来为CpictiureDig类添加一个Cbitmap类型的成员变量Bitmap, Cbitmap 封装了Window图形设备接口(GDi)中的位图,并且提供了错做位图的成员函数。

为了实现不同位图资源的加载,我们需要为类CpictureDlalog添加一个成员函数Void OnRun(),如图所示:

图片对应消息的响应代码是:

void CSpellPictureDlg::OnMenubmp1()

{

// TODO: Add your command handler code here

CString str;

str = m_Path;

str = str + "\\res\\1.bmp";

m_pPath = str;

m_Num = 3;

SetGrade(m_Num);

}

void CSpellPictureDlg::OnMenubmp2()

{

// TODO: Add your command handler code here

CString str;

str = m_Path;

str = str + "\\res\\2.bmp";

m_pPath = str;

m_Num = 3;

SetGrade(m_Num);

}

void CSpellPictureDlg::OnMenubmp3()

{

// TODO: Add your command handler code here

CString str;

str = m_Path;

str = str + "\\res\\3.bmp";

m_pPath = str;

m_Num = 3;

SetGrade(m_Num);

}

载入位图时,首先调用函数CgdiObject::DelectObject删除由LoadBitmap加载的位图,然后用LoadBitmap方法载入新的位图对象。

用类向导一次为对话框中的“图像”菜单中的子菜单项添加消息响应函数,如下图所示,并调用OnRun函数加载位图。

4.类关系图及成员函数

这面这部分主要是一个类函数的成员及其成员函数成员函数

五.编码与调试分析

1.程序编码

1)CspellPictureDlg类的编码

class CSpellPictureDlg : public CDialog

{

// Construction

public:

void GameWin();

void RandPlace(int a,int b);

void ShowPicture(int m,int n);

void SetGrade(int n);

CSpellPictureDlg(CWnd* pParent = NULL); // standard constructor

CStatic m_Picture[25]; //控件数组

char m_Path[256]; //程序根目录路径

CString m_pPath; //图片路径

BOOL m_Start; //是否开始游戏

int m_Time; //游戏时间

int m_Size; //控件大小

int m_Num; //级别数

CPoint m_Point[25]; //图片完成位置

CPoint m_MovePoint; //移动块位置

CRect m_Rect[25]; //控件区域

CStatusBar m_Statusbar; //状态栏

CHelpDlg* dlg; //帮助对话框

2)游戏获胜GameWin()的编码

void CSpellPictureDlg::GameWin()

{

int num=0;

for(int i=0;i

{

if(m_Point[i].x == m_Rect[i].left && m_Point[i].y == m_Rect[i].top) num++;

}

if(num == m_Num*m_Num-1)

{

KillTimer(1);

m_Start = FALSE;

m_Picture[num].ShowWindow(SW_SHOW);

MessageBox("获胜了,你好棒啊!");

}

}

3)选择图片Onmenustart()的编码

void CSpellPictureDlg::OnMenustart()

{

// TODO: Add your command handler code here

if(m_pPath.IsEmpty())

{

MessageBox("请选择图片!");

return;

}

SetGrade(m_Num);

m_Time = 0;

SetTimer(1,1000,NULL);

m_Start = TRUE;

CRect rcdlg;

GetClientRect(rcdlg);

m_Size = rcdlg.Width()/m_Num;

RandPlace(m_Num,m_Size);

m_Picture[m_Num*m_Num-1].ShowWindow(SW_HIDE); }

2调试分析

六.使用说明

1、程序正常运行后,出现如下界面

2、点击“游戏”可选择“开始游戏”

3、选择图片

4、难度级别可以有3×3,4×4,5×5三种选择机会

5、选择完毕后出现如下界面

6、点击“开始游戏”,开始计时(左下角)

7、通过键盘上下左右键开始移动图片进行拼图,根据图片的坐标可以确定拼图是否正确;

8、当完成拼图时,会出现“获胜了,你好棒啊!”,拼图游戏结束;

9、点击“原图提示”,界面如下

七.测试

测试发现最下一行的图片在游戏是不能完全显示,可能是对话框存在一定的问题,具体情况如下图所示:

八.心得体会

作为一个计算机学院的学生,只会玩游戏不会编游戏,很是说不过去,不管怎样,慢慢学吧。

这学期选择的这门课程让我学到了不少关于windows编程的知识。老师把课程内容安排的很合理,讲的大都是很基础的知识,这对于像我这样对windows 编程了解不多的学生来说很容易理解,接受。

在这门课上我学习到了一些关于windows编程的基本知识,但依旧不是很明白,这次实验,通过自己的理解,做了这个小游戏,才对windows编程有了进一步了解。

真正完成并且运行无误的时候,充满了成就感和喜悦感,相信以后也会以这种面貌投入到新的学习中去。

九.附录(部分源代码)

BOOL CSpellPictureDlg::PreTranslateMessage(MSG* pMsg)

{

// TODO: Add your specialized code here and/or call the base class

if(m_Start)

{

BOOL move = FALSE;

Sleep(30);

if(pMsg->message == WM_KEYDOWN && pMsg->wParam == 0x0026) //UP

{

for(int i=0;i

{

if(m_Rect[i].left == m_MovePoint.x &&

m_Rect[i].top-m_Size == m_MovePoint.y && !move)

{

CPoint point;

point = m_MovePoint;

}

}

}

else if(pMsg->message == WM_KEYDOWN && pMsg->wParam == 0x0028)//DOWN {

for(int i=0;i

{

if(m_Rect[i].left == m_MovePoint.x &&

m_Rect[i].top+m_Size == m_MovePoint.y && !move)

{

CPoint point;

point = m_MovePoint;

m_Picture[i].MoveWindow(m_MovePoint.x,m_MovePoint.y,m_Size,m_Size);

m_MovePoint.x = m_Rect[i].left;

m_MovePoint.y = m_Rect[i].top;

m_Rect[i].left = point.x;

m_Rect[i].top = point.y;

m_Rect[i].right = m_Rect[i].left+point.x;

m_Rect[i].bottom = m_Rect[i].top+point.y;

move = TRUE;

}

}

}

else if(pMsg->message == WM_KEYDOWN && pMsg->wParam == 0x0025)//LEFT {

for(int i=0;i

{

if(m_Rect[i].left-m_Size == m_MovePoint.x &&

m_Rect[i].top == m_MovePoint.y && !move)

{

CPoint point;

point = m_MovePoint;

m_Picture[i].MoveWindow(m_MovePoint.x,m_MovePoint.y,m_Size,m_Size);

m_MovePoint.x = m_Rect[i].left;

m_MovePoint.y = m_Rect[i].top;

m_Rect[i].left = point.x;

m_Rect[i].top = point.y;

m_Rect[i].right = m_Rect[i].left+point.x;

m_Rect[i].bottom = m_Rect[i].top+point.y;

move = TRUE;

}

}

}

else if(pMsg->message == WM_KEYDOWN && pMsg->wParam == 0x0027)//RIGHT

{

for(int i=0;i

{

if(m_Rect[i].left+m_Size == m_MovePoint.x &&

m_Rect[i].top == m_MovePoint.y && !move)

{

CPoint point;

point = m_MovePoint;

m_Picture[i].MoveWindow(m_MovePoint.x,m_MovePoint.y,m_Size,m_Size);

m_MovePoint.x = m_Rect[i].left;

m_MovePoint.y = m_Rect[i].top;

m_Rect[i].left = point.x;

m_Rect[i].top = point.y;

m_Rect[i].right = m_Rect[i].left+point.x;

m_Rect[i].bottom = m_Rect[i].top+point.y;

move = TRUE;

}

}

}

move = FALSE;

GameWin();

}

return CDialog::PreTranslateMessage(pMsg);

}

相关主题
文本预览
相关文档 最新文档