贪吃蛇游戏设计报告.docx

上传人:b****2 文档编号:24608962 上传时间:2023-05-29 格式:DOCX 页数:12 大小:73.28KB
下载 相关 举报
贪吃蛇游戏设计报告.docx_第1页
第1页 / 共12页
贪吃蛇游戏设计报告.docx_第2页
第2页 / 共12页
贪吃蛇游戏设计报告.docx_第3页
第3页 / 共12页
贪吃蛇游戏设计报告.docx_第4页
第4页 / 共12页
贪吃蛇游戏设计报告.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

贪吃蛇游戏设计报告.docx

《贪吃蛇游戏设计报告.docx》由会员分享,可在线阅读,更多相关《贪吃蛇游戏设计报告.docx(12页珍藏版)》请在冰豆网上搜索。

贪吃蛇游戏设计报告.docx

贪吃蛇游戏设计报告

青岛理工大学琴岛学院

设计报告

 

课题名称:

贪吃蛇游戏设计

学院:

青岛理工大学琴岛学院

专业班级:

计算机网络技术091

学号:

0017

学生:

王三鹏

指导教师:

张秀国、宋传磊

青岛理工大学琴岛学院教务处

2010年12月29日

学生

王三鹏

指导教师

张秀国、宋传磊

课题名称

贪吃蛇游戏设计

设计时间

设计地点

图书馆501

设计目的

熟练使用vc++,提高自身对MFC类的理解及更好的应用MFC类制作软件。

指导教师评语

 

系部

教研室

意见

 

 

一、需求分析………………………………………4

二、设计说明………………………………………4

1.设计思路……………………………………………4

2.程序框图……………………………………………5

3.主要函数……………………………………………7

三、代码实现………………………………………6

1.构造函数……………………………………………6

2.放置食物……………………………………………6

3.碰撞检测……………………………………………7

四、问题解决………………………………………9

五、总结展望………………………………………10

六、参考文献………………………………………10

一、需求分析

1.选题

接到课程设计任务后,我们对曾经非常感兴趣的几款经典小游戏作了分析并筛选,然后发现使用MFC类库都可以完成这些游戏的编译,但是我们刚刚学习,还不能完全掌握MFC类的使用和复杂的算法,但是我们相信通过一个简单的贪吃蛇游戏可以让我们对MFC得到充分的锻炼。

2.功能

使用MFC编译的游戏,我们预计实现游戏的开始、暂停、继续、等级的提升、难度的增加。

3.重要的MFC

1)CWnd:

窗口,它是大多数“看得见的东西”的父类(Windows里几乎所有看得见的东西都是一个窗口,大窗口里有许多小窗口),比如视图CView、框架窗口CFrameWnd、工具条CToolBar、对话框CDialog、按钮CButton,etc;一个例外是菜单(CMenu)不是从窗口派生的。

2)CDocument文档,负责内存数据与磁盘的交互。

最重要的是OnOpenDocument(读入),OnSaveDocument(写盘),Serialize(读写)

3)CView视图,负责内存数据与用户的交互。

包括数据的显示、用户操作的响应(如菜单的选取、鼠标的响应)。

最重要的是OnDraw(重画窗口),通常用CWnd:

:

Invalidate()来启动它。

另外,它通过消息映射表处理菜单、工具条、快捷键和其他用户消息。

4)CDialog对话框

5)CPen笔,画线

6)CBrush刷子,填充

7)CBitmap位图

8)CRgn区域,指定一块区域可以用于做特殊处理。

9)CString字符串。

封装了C中的字符数组,非常实用。

10)CPoint点,就是(x,y)对

11)CRect矩形,就是(left,top,right,bottom)

二、总体设计说明

1.设计思路

在数据结构上,用数组存储蛇以及蛇的运动区域。

在数组中,每个元素有四个云感动方向,分别为RIGHT,LEFT,UP,DOWN.在没有蛇身的区域,数组的元素值为0。

在蛇身的每个节点,用一个数组元素存储当前蛇节点的运动方向。

通过改变数组中元素的值来表示蛇身的移动。

在程序中运用定时器来保证蛇的持续移动。

每个一定的时间间隔,蛇移动一格。

在设计界面时。

在VisualStudioC++的环境下,建立基于对话框的工程,在工程下设计游戏界面,实现贪食蛇运行算法。

在对话框中画出一个矩形,在大矩形中,用20x20的像素单位表示每一个蛇的节点。

当数组节点的值不为0的时候,在大矩形中画出相应的蛇的节点矩形。

并在蛇每移动一小格的时候,重绘整个窗口。

在对蛇身进行绘画时。

通过数组元素的值将蛇身在对话框的矩形中显示出来。

在蛇身运动时,首先在蛇头位置蛇身增长一个节点,然后判断蛇头是否到达食物所在位置,若在食物所在位置,则蛇尾不减一,蛇身继续移动,若蛇头不在食物位置,则蛇尾减一,蛇身继续移动。

若蛇头越界或者蛇头与蛇身重叠,则游戏结束。

2.程序框图

操作控制:

如图1所示

图1

游戏控制:

如图2所示

图2

3.主要函数和变量:

如表1表2所示

表1主要函数和变量

函数名

所属类

功能

ReDisplay()

CSnakeView

刷新界面函数

voidIniAim()

CSnakeView

消息处理函数

m_nDirect

CSnakeView

运动方向

m_pAim

CSnakeView

目前指向

m_nGameStatus

CSnakeView

游戏是否进行

m_nCount

CSnakeView

计分

m_nTime,m_nTime1

CSnakeView

计时

表2按钮控件资源清单

ID

按钮

功能

ID_APP_ABOUT

VK_F1

游戏介绍

ID_GAME_START

VK_F2

游戏开始

ID_APP_EXIT

VK_F4

游戏结束、退出

三、代码实现

1.构造函数:

通过定义构造函数CSnakeView:

:

CSnakeView()调用IniGame()实现游戏界面的初始化,为开始游戏做好准备,所以在开始进行游戏之前,游戏界面就已经显示完整。

CSnakeView:

:

CSnakeView()

{

……

IniGame();

……

}

CSnakeView:

:

~CSnakeView()

{

}

2.消息处理食物位置:

在函数中声明一个(x,y)数对uAimX,uAimY,然后执行条件循环while

(1),使用随机数函数rand()为uAimX,uAimY赋值,并在一个循环体中判断该点位置上是否有元素,若没有,则放置实物在该坐标上。

voidCSnakeView:

:

IniAim()

{

intuAimX,uAimY;

while

(1)

{

uAimX=rand()%m_nHeight;

uAimY=rand()%m_nWidth;

intuTag=0;

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

{

CPointuPoint=(i);

if==uAimX||==uAimY)

{

uTag=1;

break;

}

}

if(uTag==0)

break;

}

m_pAim=CPoint(uAimX,uAimY);

}

3.碰撞检测:

这里碰撞检测是贯穿游戏始末的主要步骤,蛇神移动的每一步都要执行一次碰撞检测。

第一步检测边界,如果由计时器控制的蛇身触界则游戏结束,否则进行第二步检测,检测该点是否有蛇身(蛇身分为两种,一种是地图上随机生成的实物,另一种是由时间轴控制的蛇)若该点有食物,则蛇身不减,计时器继续运行;若该点是蛇身则调用KillTimer

(1)游戏结束。

碰撞检测实际上是计时器函数的后半部分。

……

if(uTag==0)

{

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

{

CPointuPoint1=(i);

if==&&==

{

uTag=1;

break;

}

}

}

if(uTag==0)

{

(0,uPoint);

ReDisplay(uPoint);

if==&&==

{

m_nCount++;

IniAim();

Invalidate();

}

else

{

CPointuPoint1=());

());

ReDisplay(uPoint1);

}

}

else

{

KillTimer

(1);

MessageBox(strTemp,"游戏结束");}

CView:

:

OnTimer(nIDEvent);

运行界面:

①初始界面:

如图3

图3游戏初始界面

②运行时界面:

如图4

图4游戏运行时界面

③结束界面:

如图5

图5游戏结束时界面

四、问题解决:

1.找不到合适的方法实现食物随机放置:

游戏进行时,如果采用原来的方式在游戏进行到200秒以上时会出现没有食物的现象。

我们通过while

(1)循环控制的随机x,y坐标在地图上绘制一段蛇身来解决了这一问题。

2.在控制游戏选择性条件里食物与蛇身的关系:

一开始,我们的设想是碰撞一次食物,让蛇身加一节,后来实现时遇到了困难,就是不变化。

然后我们决定让蛇每前进一步就加一节,然后每步都进行碰撞检测,如果碰撞到食物就不减一节,反之则减。

这样,就把每一步都控制在了一个贯穿游戏始末的条件循环体中。

3.碰撞检测不能随计时器一起良好运行:

检测游戏时经常出现撞墙不死的情况,疑似碰撞检测没有正常运行。

经改进,我们把碰撞检测加到计时器里面同时运行,这保证了每一步的正确性,又使游戏流畅。

五、总结展望:

参考资料和程序成品,我了解了游戏的最基本形式。

ontimer()函数是控制游戏运行的根本函数,借助这一函数,能实现贪吃蛇、俄罗斯方块、赛车等多个游戏的开发。

随机数生成函数rand()的应用在贪吃蛇游戏中是一个关键步骤,通过不断的循环和调用,能保证游戏的持续进行和更新,其实不止是贪吃蛇,在大多数需要随机生成元素的游戏中,都可以用rand()函数生成随机数,再控制坐标等变量实现“随机生成”功能。

碰撞检测是一个逻辑性比较强的地方,这一段代码的实现,我们想了很多,也找了很多资料,不管是检测碰撞类型先后顺序,还是碰撞检测的位置都经过了多次试验,虽然成品游戏中的代码能够实现,但是我们还是改了又改,让它以我们最理想的形式实现。

通过这一次课程设计,我最大的收获就是分析问题解决问题能力的提高,发现问题,而后解决问题是生活的永续循环,这种能力会伴随我们一生;其次,程序的开发给了我很多经验,相信时间充裕的话,我能独立开发一个小游戏;最后,老师提出的对设计报告的种种要求也为我以后的各种报告的规范性做好了心理准备。

六、参考文献:

[1]孙鑫.《VC++深入详解》.北京.电子工业出版社.

[2]谭浩强.《C++程序设计》.北京.清华大学出版社.

[3]刘春辉.《VisualC++程序设计学习笔记》.北京.电子工业出版社.

[4]CharlesPetzold.《Windows程序设计》.北京.北京大学出版社.

[5]曾凡锋.《MFC编译技巧与范例详解》.北京.清华大学出版社.

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

当前位置:首页 > 幼儿教育 > 唐诗宋词

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

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