可视化大作业.docx

上传人:b****3 文档编号:27141699 上传时间:2023-06-27 格式:DOCX 页数:50 大小:70.87KB
下载 相关 举报
可视化大作业.docx_第1页
第1页 / 共50页
可视化大作业.docx_第2页
第2页 / 共50页
可视化大作业.docx_第3页
第3页 / 共50页
可视化大作业.docx_第4页
第4页 / 共50页
可视化大作业.docx_第5页
第5页 / 共50页
点击查看更多>>
下载资源
资源描述

可视化大作业.docx

《可视化大作业.docx》由会员分享,可在线阅读,更多相关《可视化大作业.docx(50页珍藏版)》请在冰豆网上搜索。

可视化大作业.docx

可视化大作业

武汉理工大学《可视化编程》课程设计说明书

 

1.概述及课设要求2

 

1.1基于MFC的贪吃蛇游戏设计与实现2

 

1.2概述2

 

2.简单的操作及功能说明3

 

3.MFC具体设计过程及相应模块的功能.4

 

3.1创建工程4

 

3.2添加消息,成员函数,控件.4

 

3.3定义全局变量并确定贪吃蛇的基本大小4

 

3.4响应键盘操作的消息6

 

3.5对OnRButtonDown()具体添加代码7

 

3.6对贪吃蛇初始化(画图)7

 

3.7对相关控件的的功能设定8

 

3.8用画刷画一个背景,并画3个矩形区域.10

 

3.9贪吃蛇的前行中的具体的算法和判断.11

 

4.游戏运行的界面及相关的截图14

 

5系统设计过程中自己所遇到的问题及相应的解决方法和解决过程。

 

16

 

6结束语18

 

7参考文献:

19

 

本科课程论文评分标准20

 

1

武汉理工大学《可视化编程》课程设计说明书

 

1.概述及课设要求

1.1基于MFC的贪吃蛇游戏设计与实现

1.游戏界面设计

2.食物的初始化

3.游戏开始以及具体实现

 

1.2概述

 

此次课程设计我利用MFC编写了一个贪吃蛇游戏,游戏拥有结束时计

分,开始,暂停,继续,退出,重新开始等功能,并且随着贪吃蛇的长度的增加,刷新的速度(移动的速度)也会变快.

 

2

武汉理工大学《可视化编程》课程设计说明书

 

2.简单的操作及功能说明

 

⑴运行程序,游戏界面打开。

⑵点击“游戏->游戏开始”,出现围墙界面,一条蛇在密闭的白色矩

形内,在围墙内随机出现一个食物,游戏开始。

⑶通过四个方向键控制蛇的运动方向,吃掉随机出现的豆子,若不小

心碰到墙壁或者与自身相交,则该轮游戏结束。

⑷点击“游戏->游戏暂停”,暂停游戏。

⑸点击“游戏->游戏继续”,继续游戏。

⑹点击“游戏->游戏退出”,退出游戏。

⑺点击“游戏->重新开始”,重新开始。

⑻游戏会根据蛇身的长度自动调节难易程度。

 

3

武汉理工大学《可视化编程》课程设计说明书

 

3.MFC具体设计过程及相应模块的功能

 

3.1创建工程

打开VisualC++新建一个MFCAppWizard单文档工程,取名snake

 

3.2添加消息,成员函数,控件.

 

首先在已有工程下的“ClassView”中右键CView类添加以下Windows信息

1WM_KEYDOWN

2WM_RBUTTONDOWN

3WM_TIMER

右键CView类选择“ADDVirtualFunciton”选OnInitialUpdate()

这里的OnInitialUpdate()是对视图的初始化.后再在csnakeview类中添

加一个成员函数oninit()用来对贪吃蛇的外观进行初始化.

“ResourceView”进行控件的具体设计,这里我们在Menu文件夹中把

“IDR_MAINFRAME”中默认的控件全部删除,后自己添加控件并建立类向

导,如下图所示;

 

3.3定义全局变量并确定贪吃蛇的基本大小

 

structSnake

{

 

4

武汉理工大学《可视化编程》课程设计说明书

 

intx,y;

intlen;

intdirect;

 

}Snake[50];

 

structFood

{

intx;

inty;

intisfood;

}Food;

 

voidCSnakeView:

:

OnInitialUpdate()

{

CView:

:

OnInitialUpdate();

Snake[0].x=10;

Snake[0].y=10;

Snake[1].x=11;

Snake[1].y=10;

Snake[2].x=12;

Snake[2].y=10;

Snake[0].direct=3;

Snake[0].len=3;

Food.isfood=1;

 

5

武汉理工大学《可视化编程》课程设计说明书

 

//TODO:

Addyourspecializedcodehereand/orcallthebaseclass

 

}

我们假设贪吃蛇开始有3个节点,食物则是认为1无0有.

 

3.4响应键盘操作的消息

 

voidCSnakeView:

:

OnKeyDown(UINTnChar,UINTnRepCnt,UINT

nFlags)

{

//TODO:

Addyourmessagehandlercodehereand/orcalldefault

switch(nChar)

{

caseVK_UP:

if(Snake[0].direct!

=2)Snake[0].direct=1;break;caseVK_DOWN:

if(Snake[0].direct!

=1)Snake[0].direct=2;break;caseVK_LEFT:

if(Snake[0].direct!

=4)Snake[0].direct=3;break;case

VK_RIGHT:

if(Snake[0].direct!

=3)Snake[0].direct=4;break;

}

CView:

:

OnKeyDown(nChar,nRepCnt,nFlags);

CView:

:

OnKeyDown(nChar,nRepCnt,nFlags);

}分别对上下左右的消息进行响应,snake[0].direct表示的时蛇头方

向.而caseVK_UP:

if(Snake[0].direct!

=2)Snake[0].direct=1;break;

意思就是当Snake[0].direct的方向此时并不等于“下”的时候,才能

做出“上”的操作动作,同理其他的代码亦是相同的意思.

 

6

武汉理工大学《可视化编程》课程设计说明书

 

3.5对OnRButtonDown()具体添加代码

 

voidCSnakeView:

:

OnRButtonDown(UINTnFlags,CPointpoint)

{

//TODO:

Addyourmessagehandlercodehereand/orcall

default

CStringstr;

str.Format("%d,%d",point.x,point.y);

AfxMessageBox(str);

CView:

:

OnRButtonDown(nFlags,point);

CView:

:

OnRButtonDown(nFlags,point);

CView:

:

OnRButtonDown(nFlags,point);

 

}这个函数用于当你用鼠标右键屏幕,就会马上显示当前位置的坐标信息。

其实这个函数可有可无,但是我在后面的的确定初始化窗口的大小很有作用,于是我在当时决定将其加进去.

 

3.6对贪吃蛇初始化(画图)

 

voidCSnakeView:

:

Oninit()

{

CDC*pDC=GetDC();

CBrushDrawBrush=(RGB(100,0,0));

CBrush*Drawbrush=pDC->SelectObject(&DrawBrush);

7

武汉理工大学《可视化编程》课程设计说明书

 

for(inti=0;i<=Snake[0].len-1;i++)

 

pDC->Rectangle(Snake[i].x*20,Snake[i].y*20,(Snake[i].x+1)*20,(Snake[i].y+1)*20);

pDC->SelectObject(DrawBrush);

 

}利用Windows给我们提供的CDC类来进行画图,我们首先用一个指向CDC类的指针

 

去接受与该窗口相关联的DC句柄,然后用定义画刷一个DrawBrush对象,并且用

RGB(100,100,100)来给画刷初始化颜色。

并且用SelectObject(&DrawBrush);函数把对

 

象画刷选入到设备描述表中,用for循环依次把贪吃蛇的3个节点画出来。

 

3.7对相关控件的的功能设定

 

voidCSnakeView:

:

OnPause()

{

//TODO:

AddyourcommandhandlercodehereKillTimer

(1);

 

}

 

voidCSnakeView:

:

OnContinue()

{

//TODO:

AddyourcommandhandlercodehereSetTimer(1,10,NULL);

8

武汉理工大学《可视化编程》课程设计说明书

 

}

 

voidCSnakeView:

:

OnExit()

{

//TODO:

Addyourcommandhandlercodehereexit(0);

}

 

voidCSnakeView:

:

OnStart()

{

//TODO:

AddyourcommandhandlercodehereSetTimer(1,30,NULL);

 

}

SetTimer(m_hWnd,1,1000,NULL);//一个1秒触发一次的定时器

在MFC程序中SetTimer被封装在CWnd类中,所以我在调用就不用指定窗口句柄了,并且找资料得到SetTimerAPI函数的原型

UINT_PTRSetTimer(

HWNDhWnd,//窗口句柄

UINT_PTRnIDEvent,//定时器ID,多个定时器时,可以通过该ID判

断是哪个定时器

UINTuElapse,//时间间隔,单位为毫秒

TIMERPROClpTimerFunc//回调函数

);

因此更加容易的理解了settime的使用及原理.

 

9

武汉理工大学《可视化编程》课程设计说明书

 

3.8用画刷画一个背景,并画3个矩形区域.

 

voidCSnakeView:

:

OnDraw(CDC*pDC)

{

CSnakeDoc*pDoc=GetDocument();

ASSERT_VALID(pDoc);

//TODO:

adddrawcodefornativedatahereCBrushbackBrush(RGB(100,100,100));

CBrush*pOldBrush=pDC->SelectObject(&backBrush);CRectrect;

pDC->GetClipBox(&rect);

pDC->PatBlt(rect.left,rect.top,rect.Width(),rect.Height(),PATCOPY);pDC->SelectObject(pOldBrush);

 

pDC->Rectangle(19,19,501,501);

Oninit();

 

}

 

OnDraw()函数众所周知视图类中的输出.视图类的输出基本上都是在视

图类的OnDraw函数中处理的,系统会准备好入参,然后调用OnDraw函数

 

10

武汉理工大学《可视化编程》课程设计说明书

 

3.9贪吃蛇的前行中的具体的算法和判断.

 

voidCSnakeView:

:

OnTimer(UINTnIDEvent)

{

//TODO:

Addyourmessagehandlercodehereand/orcalldefaultCDC*pDC=GetDC();

CStringsoure;

 

if(Snake[0].len==2)SetTimer(1,370,NULL);

if(Snake[0].len==3)SetTimer(1,270,NULL);

if(Snake[0].len==6)SetTimer(1,200,NULL);

if(Snake[0].len==9)SetTimer(1,100,NULL);

 

soure.Format("得分:

%d!

",(Snake[0].len-3)*10);

//撞界判断

if(Snake[0].x*20<=37||Snake[0].y*20<=37||Snake[0].x*20>=462||Snake[0].y*20>=462)

{

KillTimer

(1);

AfxMessageBox(soure);

//s=0;

}

//蛇身相撞判断

if(Snake[0].len>3)

for(intsn=Snake[0].len-1;sn>0;sn--)

{

 

11

武汉理工大学《可视化编程》课程设计说明书

 

if(Snake[0].x*20==Snake[sn].x*20&&Snake[0].y*20==Snake[sn].y*20)

{

KillTimer

(1);

AfxMessageBox(soure);

//s=0;

}

}

 

///////////////////////////////////////////////////////////////////////////

pDC->SelectStockObject(WHITE_PEN);

 

pDC->Rectangle(Snake[Snake[0].len-1].x*20,Snake[Snake[0].len-1].y*20,(Snake[Snake[0].len-1].x+1)*20,(Snake[Snake[0].len-1].y+1)*20);

for(inti=Snake[0].len-1;i>0;i--)

{

Snake[i].x=Snake[i-1].x;

Snake[i].y=Snake[i-1].y;

}

//行走方向判断

if(Snake[0].direct==1)Snake[0].y--;

if(Snake[0].direct==2)Snake[0].y++;

if(Snake[0].direct==3)Snake[0].x--;

if(Snake[0].direct==4)Snake[0].x++;

pDC->SelectStockObject(BLACK_PEN);

 

CBrushDrawBrush=(RGB(100,100,100));

CBrush*Drawbrush=pDC->SelectObject(&DrawBrush);

 

12

武汉理工大学《可视化编程》课程设计说明书

 

pDC->Rectangle(Snake[0].x*20,Snake[0].y*20,(Snake[0].x+1)*20,(Snake[0].y

+1)*20);

pDC->SelectObject(DrawBrush);

 

//判断吃豆的条件,撞到就吃

if(Snake[0].x*20==Food.x*20&&Snake[0].y*20==Food.y*20)

{

Snake[0].len++;

Food.isfood=1;

Snake[Snake[0].len-1].x=Snake[Snake[0].len-2].x;

Snake[Snake[0].len-1].y=Snake[Snake[0].len-2].y;

}

//如果食物被吃了就生成

if(Food.isfood==1)

{

srand((unsigned)time(NULL));

do

{

for(intisfo=Snake[0].len-1;isfo>=0;isfo--)

 

if(Snake[0].x*20==Snake[isfo].x*20&&Snake[0].y*20==Snake[isfo].y*20)

{

Food.x=rand()%25;

Food.y=rand()%25;

}

}

 

while(Food.x*20<70||Food.y*20<70||Food.x*20>430||Food.y*20>430);

 

13

武汉理工大学《可视化编程》课程设计说明书

 

pDC->Rectangle(Food.x*20,Food.y*20,(Food.x+1)*20,(Food.y+1)*20);

Food.isfood=0;

}

 

CView:

:

OnTimer(nIDEvent);

}

 

14

武汉理工大学《可视化编程》课程设计说明书

 

4.游戏运行的界面及相关的截图

 

15

武汉理工大学《可视化编程》课程设计说明书

 

5系统设计过程中自己所遇到的问题及相应的解决方法和解决过程。

 

(1)在设计重新开始时,贪吃蛇出现了重叠的现象,即出现了多条的贪吃蛇如下图

 

解决方法;之所以会出现重叠,可能是在再次调用onstart函数时界面没有被重新的清理干净,所以在调用开始函数前写了一段刷新界面的代码(即再次填充原本整个背景的颜色如下:

CDC*pDC=GetDC();

CBrushbackBrush(RGB(100,100,100));

CBrush*pOldBrush=pDC->SelectObject(&backBrush);

CRectrect;

pDC->GetClipBox(&rect);

pDC->PatBlt(rect.left,rect.top,rect.Width(),rect.Height(),PATCOPY);

pDC->SelectObject(pOldBrush);

pDC->Rectangle(19,19,501,501);

使得问题得到解决,先尝试自己能想到的的可能的原因.

 

16

武汉理工大学《可视化编程》课程设计说明书

 

(2)修改窗口初始的大小,一开始默认的窗口比例不协调,看上去不舒服,.于是查

询资料(网络)得到修改的方法;

BOOLCMainFrame:

:

PreCreateWindow(CREATESTRUCT&cs)

{

if(!

CFrameWnd:

:

PreCreateWindow(cs))

returnFALSE;

//TODO:

ModifytheWindowclassorstylesherebymodifying

//theCREATESTRUCTcs

cs.cx=100;

cs.cy=100;

 

returnTRUE;

}

 

(3)同时在写程序时一些细节亦要注意,

 

经检查仅仅只是大小写的问而已,有时还会浪费一定的时间.

 

(4)一开始我的贪吃蛇的移动速度是不变的,写完后我在想能不能随着游戏的进行而变的更难,于是我尝试了很多方法,调用各种函数,最后还是在看程序想起自己编程时的settimer,于是就查相关的东西,最后写出:

if(Snake[0].len==2)SetTimer(1,370,NULL);

if(Snake[0].len==3)SetTimer(1,270,NULL);

if(Snake[0].len==6)SetTimer(1,200,NULL);

if(Snake[0].len==9)SetTimer(1,100,NULL);

 

17

武汉理工大学《可视化编程》课程设计说明书

 

6结束语

 

这次课程设计,我选择用MFC编写一个贪食蛇的程序。

在编写程序之前,我

只有很少的关于MFC的程序设计知识,因此,在刚开始,我遇到了很多困难。

为此,我查阅了许多关于贪食蛇的资料,也在网上看了许多关于贪食蛇的算法。

做好了准备之后,才开始写我的贪食蛇,并且加了很多附加功能。

这次课程设计

锻炼了我的动手能力。

通过完成贪食蛇游戏的程序设计,累积了我的实际编程经

验,也提高了我独立解决问题的能力,让我明白实践中的许许多多不同于理论的

东西

 

18

武汉理工大学《可视化编程》课程设计说明书

 

7参考文献:

 

[1].欧阳志宏,MFC程序设计轻松入门,人民邮电出版社,北京,2009-4-1

[2].姚领田,MFC窗口程序设计,水利水电出版社,北京,2007-5-1

 

19

武汉理工大学《可视化编程》课程设计说明书

 

本科课程论文评分标准

 

班级

论文题目

评阅点

 

功能及算

(40分)

 

界面和操

作性

(20分)

 

程序可读、

可维护性

(15分)

 

论文质量

(25分)

 

软件1202学号0121210680201姓名帅宗斌

基于MFC的贪吃蛇游戏设计与实现

 

评分标准(细则)

分值

给分

正确实现本程序所需全部功能,算法设

40分

计正确合理且有一定创意

实现所需功能,算法正确

30分

基本实现所需功能

15分

有明显重大错误

5分

无法实现程序功能

0分

界面美观、合理,可操作性强

20分

界面合理,可操作

15分

界面尚可,基本可操作

10分

可操作较差

5分

程序可读性好、逻辑清晰,程序完整,

15分

可维护性好,

程序可读、可维护

10分

基本可读可维护

5分

逻辑混乱、不可读

0分

论文规范,行文流畅,层次清晰

25分

论文书写基本规范,文理较通畅

20分

结构较合理,层次较清楚,基本符合要

15分

结构混乱,文不对题目,或者有明显抄

5分

袭现象

总分

 

教师签名:

 

 

20

武汉理工大学《可视化编程》课程设计说明书

 

21

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 政史地

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1