资源描述
XXX学院
面向对象程序设计(c++/vc++)
课程设计报告
题 目:基于VC++贪食蛇游戏的设计与实现
学 号:
班 级:
小组成员:
指导教师:
所属系部:
2014年 6月 3 日
2
课程设计任务书
课程名称
面向对象程序设计(C++/VC++)
时间
2014.6.3----2014.6.6
题 目
基于VC++的贪食蛇游戏的设计与实现
主要内容:本设计实现了一个简单的贪食蛇小游戏,该游戏不仅实现了简单的游戏操作功能,还实现了灵活的运作功能,而且具有简洁大方的图文外观。此设计按照软件工程的方法进行,系统具有良好的界面和必要的交互信息,使操作人员能快捷简单地进行操作,给玩家一个简易有趣的游戏。本系统开发平台为Windows XP,程序设计语言采用C++,在程序设计中,采用了结构化与面向对象两种解决问题的方法。
要求:(1)通过实际软件项目的分析、设计、编码、测试等工作,掌握用软件工程的方法来开发和维护系统。
(2)按要求编写课程设计报告书,能正确编写分析、设计、编码、测试等技术文档和用户使用手册。
(3)进行系统的联合调试,编写系统使用说明。
(4)完成系统的文档、设计说明工作
任务分配:
计科132班:XXX XXX负责程序框架设计和服务端代码编写
计科132班:XXX主要负责软件测试及调试
计科132班:XXX主要负责撰写报告与汇报
摘要
本设计实现了一个简单的贪食蛇小游戏,该游戏不仅实现了简单的游戏操作功能,还实现了灵活的运作功能,而且具有简洁大方的图文外观。此设计按照软件工程的方法进行,系统具有良好的界面和必要的交互信息,使操作人员能快捷简单地进行操作,给玩家一个简易有趣的游戏。本系统开发平台为Windows XP,程序设计语言采用C++,在程序设计中,采用了结构化与面向对象两种解决问题的方法。
关键词:贪食蛇;MFC
Abstratc
This design implements a simple bulimia small snake game, the game is not only realize the function of simple operation, and realize the function of flexible operation, and has a concise and easy by appearance. This design according to the method of software engineering, system has a good interface and the interaction of the necessary information, allow the operator to quick and easy to operate, easy to give players a fun game. This system development platform for Windows XP, using c + + program design language, in programming, using the structured and object oriented method to solve the problem.
Key words: Gluttony Snake; MFC
II
目录
摘要 I
ABSTRATC II
1引言: 1
1.1课题背景介绍 1
1.2 MFC简介 1
2系统分析 2
2.1可行性分析 2
2.2系统需求分析 2
2.2.1课题需求 2
2.2.2功能需求 3
2.2.3游戏环境需求 3
2.2.4游戏界面需求 4
2.3程序分析 6
2.3.1游戏大体框架 6
2.3.2主要游戏函数 6
2.3.3游戏程序整体间调用关系图 7
3程序设计 8
3.1游戏教程的知识点 8
3.2游戏基本流程和大体思想 8
3.3游戏程序模块实现函数说明 9
3.4程序变量声明 15
4 系统实现 23
4.1坐标位置信息模块实现 23
4.2键盘方向键操作模块实现 23
4.3蛇身撞界与分数计算模块实现 23
4.4食物重新生成模块实现 24
4.5游戏测试 25
5 总结 26
参考文献 27
附录 28
1引言
在程序设计中,通过设计、编制、调试一个模拟计算器的程序,加深对语法及语义分析原理的理解,并实现对命令语句的灵活应用。在程序设计中,可以用两种方法解决问题:一是传统的结构化程序设计方法,二是更先进的面向对象程序设计方法。
1.1课题背景介绍
贪食蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己所学的知识加以应用,二是一直以来贪食蛇这个游戏就深深地吸引着我们,它的制作方法对于以前的我们而言都是很神秘的。我们希望通过自己的所学知识把它剖析开来,真真正正的了解它的本质和精髓。虽然我们的编程能力不是很强,但是我们有信心,在这次学习中我们将从实践和实际的项目中提高自己的编程能力。因此我们选了这个题目作为我们的课程实训。
1.2 MFC简介
MFC(Microsoft Foundation Classes),是一个微软公司提供的类库( class libraries) 以 C++类的形式封装了 Windows 的 API,它包含了窗口等许多类的定义。各种类的集合构成了一个应运程序的框架结构,以减少应用程序开发人员的工作量。其中包含的类包含大量 Windows句柄封装类和很多 Windows 的内建控件和组件的封装类。MFC 6.0 版本封装了大约200 个类,其中的一些可以被用户直接使用。例如 CWnd 类封装了窗口的功能,包括打印文本、绘制图形及跟踪鼠标指针的移动等; CsplitterWnd是从CWnd 类派生出来的,继承了基类或称父类 CWnd 类的所有特 性,但增加了自己的功能,实现拆分窗口,使窗口至少可被拆分成两个窗口,用户可以移动两个窗口之间的边框来改变窗口的大小;CtoolBar 类可以定义工具等。MFC 命名的惯例是类的名字通常是由“C”打头;成员变量使用前缀“m_” ,接着使用一个字母来指明数据类型,然后是变量的名称;所有的单词用大写字母开头。
2系统分析
2.1可行性分析
贪食蛇游戏是一种简单的大众的游戏,自计算机实现以来,十分深受广大电脑玩家的喜爱,做一个简单的贪食蛇游戏。贪食蛇的核心玩法是一条蛇在密闭的围墙内,在围墙内随机出现一个食物,通过按键盘上的四个方向键控制蛇向上接着又出现食物,等待被蛇吃掉,这时蛇身增长一节,同时获得10分。如果蛇在移动过程中,撞到墙壁或身体交叉蛇头撞到自己的身体游戏结束。并且可以在游戏开始前自由选择游戏难度,游戏过程中可暂停游戏,并有积分系统,且积分每满一定值,蛇的运行速度会逐步增加。
2.2系统需求分析
2.2.1课题需求
接到课程设计任务后,我们对曾经非常感兴趣的几款经典小游戏作了分析并筛选,然后发现使用MFC类库都可以完成这些游戏的编译,但是我们刚刚学习,还不能完全掌握MFC类的使用和复杂的算法,但是我们相信通过一个简单的贪吃蛇游戏可以让我们对MFC得到充分的锻炼。贪吃蛇游戏作为一款经典小游戏,版本多样,娱乐性也很高,适合在闲暇时放松心神。并且可在多个平台上实现,程序简单易懂,非常适合MFC初学者学习制作。
2.2.2功能需求
1.使用MFC编译的游戏,我们预计实现游戏的开始、暂停、继续、等级的提升、难度的增加。
2.重要的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)
2.2.3游戏环境需求
游戏要求(包括原始数据、技术参数、设计要求、图纸量、工作量要求等)
(1) 操作系统:Windows NT Windows XP Windows7
(2) 应用软件:Microsoft Visual Studio 2010
2.2.4游戏界面需求
(1)游戏说明界面:
图2.1游戏说明界面
(2)游戏开始界面:
图2.2游戏开始界面
(3)游戏运行界面
图2.3游戏运行界面
(4)游戏结束界面
图2.4游戏结束界面
2.3程序分析
2.3.1游戏大体框架如下图所示
开始游戏
暂停游戏
退出游戏
继续游戏
游戏控制模块
重新开始
图2.5游戏大体框架
2.3.2主要游戏函数
void CSnake2View::OnDraw(CDC* pDC)
void CSnake2View::oninit(void)
void CSnake2View::OnStart()
void CSnake2View::OnPause()
void CSnake2View::OnContinue()
void CSnake2View::OnExit()
void CSnake2View::OnIntroduce()
void CSnake2View::OnRestart()
void CSnake2View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
void CSnake2View::OnRButtonDown(UINT nFlags, CPoint point)
void CSnake2View::OnTimer(UINT_PTR nIDEvent)
2.3.3游戏程序整体间调用关系图InitSnake()
DrawSnake()
设置自动移动定时器和增加食物定时器
游戏开始
CSnakeDlg::OnPaint()
DrawFood ()
桌面初始化
初始化蛇头和蛇移动方向
随机初始化一个食物到桌面
SetTimer()
CTable::AddFood()
蛇移动
蛇吃食?
蛇增长
继续?
蛇死亡?
桌面上随机生成食物
MoveSnake ()
AddSnake()
退出程序
是
是
否
否
OnGameStart()
GameOver()
TB_STATE_SBLOCK
图3.6游戏程序关系图
3程序设计
3.1游戏教程的知识点
1、 CView类中的消息响应
2、 控件的消息响应
3、 基于CView类内的具体游戏实现
4、 数组
5、 游戏图形的实现用CDC类实现。
3.2游戏基本流程和大体思想
1、 定义蛇类和食物类,初始化贪吃蛇各项成员变量,包括图像的出现在屏幕的初始位置,长度,以及蛇的行走方向。食物类的定义包括出现的初始位置,以及食物是否被吃掉的判断。
2、 用数组初始化长度为3的贪吃蛇,并且默认食物未出现
3、 在CView类上运用MFC提供的Windows消息中WM_TIMER消息,运用OnTimer()函数让系统提供一个时钟节拍,更新游戏
4、 具体游戏实现,包括蛇撞到自己和围墙都将使游戏结束,判断吃豆等,其中还包括根据蛇的速度和长度来进行游戏难度的改变。
5、 具体键盘游戏操作运用到Windows消息响应中的WM_KEYDOWN,用OnKeyDown()来响应玩家的实际操作。
3.3游戏程序模块实现函数说明
第一部分:
本版游戏的具体实现是在CViewl类中实现,所以其他类不用添加任何代码。
由于此次贪吃蛇需要MFC的开发环境,所以打开Visual Studio2010新建一个MFC单文档工程,取名Snake2。
然后单击菜单栏里的“项目”,找到“类向导”,单击打开,在类名中选择Snake2View添加以下Windows信息
1 WM_KEYDOWN
2 WM_RBUTTONDOWN
3 WM_TIMER
并且添加虚函数OnInitialUpdate()
OnInitialUpdate()的功能如下:
视图窗口完全建立后第一个被框架调用的函数。框架在第一次调用OnDraw前会调用OnInitialUpdate,因此OnInitialUpdate是设置滚动视图的逻辑尺寸和映射模式的最合适的地方。
时间上,两者先后顺序不同,构造函数生成本类的对象,但没有产生窗口,OnCreate后窗口产生,然后才是视图的OnInitialUpDate,一般在这里对视图的显示做初始化。简单点,就是ONCREATE只是产生VIEW的基本结构和变量而在OnInitialUpDate()中,主要初始化视图中控件等。对各个变量进行初始化操作
所以我们要用这个函数来进行贪吃蛇的初始化工作。再者还要添加一个成员函数oninit()进行贪吃蛇外观的初始化。
图3.1添加消息
图3.2添加虚函数
再者是设计游戏的一些控件来控制“开始游戏” “结束游戏” 和“暂停游戏”“退出游戏”“重新开始”“游戏介绍”。
我们可以点击“资源视图”然后找到“Menu”文件夹,选“IDR_MAINFRAME”进行控件的具体设计,这里我们在Menu文件夹中把“IDR_MAINFRAME”中默认的控件全部删除
右键其中的标题栏,点击属性,会得到一个菜单栏标题,我们分别建立1个菜单栏标题。这里我们分别建“游戏操作”“游戏说明”。
图3.3菜单栏标题
点击并且在已有控件中的列表中点击属性,进行“菜单项目属性”的设置。我们本别建立的属性“标明”与对应的ID有
A. 开始游戏ID_START
B. 暂停游戏ID_PAUSE
C. 继续游戏ID_CONTINUE
D. 退出游戏ID_EXIT
E. 重新开始ID_RESTART
F. 游戏介绍ID_Introduce
此处控件的设计是“可见即可得”的控件操作,成功设置ID之后
1、 右键“游戏开始”。
2、 点击“添加事件处理程序”。
3、 在Message Maps页面,在要进行消息响应的控件ID列表Object IDs中上选择对应的ID, 这里我们选择IDM_START,具体实现的环境是CView类,所以我们必须把“Class name”的默认“CMainFrame”改为“CView类”,并且在“Messages”类型设置中,用“COMMAND”设置为其为命令消息。其余各项也按照同理进行设置。
图3.4添加事件处理程序
图3.5添加事件处理程序向导
第二部分
具体实现游戏、
Step 1
首先我们在文件“Snake2View.cpp”开头处分别定义 蛇 和食物 的全局变量
struct Snake //蛇的全局变量
{
int x,y;
int len;
int direct;
}Snake[50];
struct Food //食物的全局变量
{
int x;
int y;
int isfood;
}Food;
图3.6蛇与食物的全局变量
接着把那窗口往下拉,找到”void CSnake2View::OnInitialUpdate()”,添加如下代码
”
void CSnake2View::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;
// TODO: Add your specialized code here and/or call the base class
}
3.4程序变量声明
代码说明一:
1、 初始化贪吃蛇起初有3个节点,长度为3,起始坐标;食物默认为 1无0有。
2、 Step 2 找到类视图中的“CSnake2View”单击右键找到“属性”,然后再属性栏里找到“消息”按钮,点击,然后在那里找到“WM_KEYDOWN”添加函数,然后回到Snake2View.cpp,添加代码如下:
void CSnake2View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
switch(nChar)
{
case VK_UP:if(Snake[0].direct!=2)Snake[0].direct=1;break;
case VK_DOWN:if(Snake[0].direct!=1)Snake[0].direct=2;break;
case VK_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);
}
3、 OnKeyDown函数的第一个参数 UINT nChar 是接收用户键入的信息,然后我们用switch进行选择判断
代码说明二:
1、 Snake[0]代表的是蛇头,我们对蛇头的方向Snake[0].direct进行判断。
case VK_UP:if(Snake[0].direct!=2)Snake[0].direct=1;break;
意思就是当Snake[0].direct的方向此时并不等于“下”的时候,才能做出“上”的操作动作,否则则忽略用户“向上”的操作按键效果
2、 Step 3 用同样的方法对OnRButtonDown()具体添加代码如下:
void CSnake2View::OnRButtonDown(UINT nFlags, CPoint point)
{
CString str;
str.Format(_T("%d,%d"),point.x,point.y);
AfxMessageBox(str);
// TODO: Add your message handler code here and/or call default
}
这个函数功能是:用鼠标右键屏幕,就会马上显示当前位置的坐标信息。
3、 Step 4在同一窗口为“CSnake2View::oninit”添加
void CSnake2View::oninit(void)
{
CDC *pDC=GetDC();
CBrush DrawBrush=(RGB(0,255,0));
CBrush *Drawbrush=pDC->SelectObject(&DrawBrush);
for(int i=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);
}
代码说明三:
1、 利用Windows给我们提供的CDC类来进行画图,我们首先用一个指向CDC类的指针去接受与该窗口相关联的DC句柄,然后用定义画刷一个DrawBrush对象,并且用RGB(0,250,0)来给画刷初始化颜色。且用electObject(&DrawBrush);函数把对象画刷选入到设备描述表中,用for循环依次把贪吃蛇的3个节点画出来。
void far rectangle(int left, int top, int right, int bottom);这个函数的的功能根据
函数功能:该函数画一个矩形,用当前的画笔画矩形轮廓,用当前画刷进行填充.
2、 Step 5仍在同一视图,分别找到OnStart,OnPause,OnContinue,OnExit,OnRestart函数添加以下代码
void CSnake2View::OnStart()
{
SetTimer(1,3000,NULL);
AfxMessageBox(_T("3秒后开始游戏!"));
}//开始游戏
void CSnake2View::OnPause()
{
KillTimer(1);
AfxMessageBox(_T("暂停游戏·..."));
}//暂停游戏
void CSnake2View::OnContinue()
{
SetTimer(1,10,NULL);
}//继续游戏
void CSnake2View::OnExit()
{
AfxMessageBox(_T("退出游戏·..."));
exit(0);
}//退出游戏
void CSnake2View::OnRestart()
{
CSnake2View::OnInitialUpdate();
CSnake2View::oninit();
CSnake2View::OnStart();
}//重新开始
3、 Step 6 对OnDraw()的添加代码
OnDraw()函数众所周知视图类中的输出.视图类的输出基本上都是在视图类的OnDraw函数中处理的,系统会准备好入参,然后调用OnDraw函数,所以我们只需找到它,然后添加代码
void CSnake2View::OnDraw(CDC* pDC)
{
CSnake2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
CBrush backBrush(RGB(0,50,250));
CBrush* pOldBrush = pDC->SelectObject(&backBrush);
CRect rect;
pDC->GetClipBox(&rect);
pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(),PATCOPY);
pDC->SelectObject(pOldBrush);
pDC->Rectangle(19,19,501,501);
oninit();
}
代码说明四:
1、 此处是用画刷画一个背景,并且画出3个矩形区域
2、 函数原型:int GetClipBox(HDC hdc, LPRECT lprc);
3、 该函数得到一个能够完包含当前可见区域的最小矩形的大小。
4、 函数原型:int nYLeft, int nWidth, int nHeight, DWORD dwRop);
5、 该函数使用当前选入指定设备环境中的刷子绘制给定的矩形区域。
6、 Step 7 一样是通过属性,在消息里找到“WM_TIMER”添加函数,然后返回“Snake2View.cpp”为该函数添加代码
void CSnake2View::OnTimer(UINT_PTR nIDEvent)
{
CDC *pDC=GetDC();
CString soure;
if(Snake[0].len==3)SetTimer(1,600,NULL);
if(Snake[0].len==6)SetTimer(1,400,NULL);
if(Snake[0].len==9)SetTimer(1,300,NULL);
if(Snake[0].len==11)SetTimer(1,200,NULL);
if(Snake[0].len==14)SetTimer(1,100,NULL);
soure.Format(_T("得分%d!"),(Snake[0].len-3)*10);
if(Snake[0].x*20<=20||Snake[0].y*20<=20||Snake[0].x*20>=480||Snake[0].y*20>=480)
{
KillTimer(1);
AfxMessageBox(soure);
}
if(Snake[0].len>3)
for(int sn=Snake[0].len-1;sn>0;sn--)
{
if(Snake[0].x*20==Snake[sn].x*20&&Snake[0].y*20==Snake[sn].y*20)
{
KillTimer(1);
AfxMessageBox(soure);
}
}
///////////////////////////////////////////////////////////////////////////
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(int i=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);
CBrush DrawBrush=(RGB(255,0,0));
CBrush *Drawbrush=pDC->SelectObject(&DrawBrush);
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(int isfo=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()%20;
Food.y=rand()%20;
}
}
while(Food.x*20<70||Food.y*20<70||Food.x*20>430||Food.y*20>430);
pDC->Rectangle(Food.x*20,Food.y*20,(Food.x+1)*20,(Food.y+1)*20);
Food.isfood=0;
}
CView::OnTimer(nIDEvent);
}
代码说明五:
1、 切换到“资源视图”,展开节点,找到“Dialog”并在此节点上单击鼠标右键,在弹出的快捷菜单中选“插入对话框”。
2、 然后创建对话框的类,方法是打开类向导,单击“添加类”按钮,在弹出的MFC类向导对话框中的“类名”文本框中输入“CIntroduceDialog”,在基类下拉列表中选择“Cdialog”,在对话框ID下拉列表中输“ID_Introduce”,单击完成按钮,对话框类创建完毕。
3、 接着在对话框里添加游戏的介绍,然后在“Snake2View.cpp”中加入头文件“#include”IntroduceDialog.h””然后往下拉,找到”void CSnake2View::OnIntroduce()“添加代码
void CSnake2View::OnIntroduce()
{
CIntroduceDialog introduce;
introduce.DoModal();
}//游戏介绍
4 系统实现
4.1坐标位置信息模块实现
void CSnake2View::OnRButtonDown(UINT nFlags, CPoint point)
{
CString str;
str.Format(_T("%d,%d"),point.x,point.y);
AfxMessageBox(str);
// TODO: Add your message handler code here and/or call default
}
4.2键盘方向键操作模块实现
void CSnake2View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
switch(nChar)
{
case VK_UP:if(Snake[0].direct!=2)Snake[0].direct=1;break;
case VK_DOWN:if(Snake[0].direct!=1)Snake[0].direct=2;break;
case VK_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);
}
4.3蛇身撞界与分数计算模块实现
soure.Format(_T("得分%d!"),(Snake[0].len-3)*10); if(Snake[0].x*20<=20||Snake[0].y*20<=20||Snake[0].x*20>=480||Snake[0].y*20>=480)
{
KillTimer(1);
AfxMessageBox(soure);
}if(Snake[0].len>3)
for(int sn=Snake[0].len-1;sn>0;sn--) {
if(Snake[0].x*20==Snake[sn].x*20&&Snake[0].y*20==Snake[sn].y*20)
{
KillTimer(1);
AfxMessageBox(soure); }
4.4食物重新生成模块实现
if(Food.isfood==1)
{
srand((unsigned)time(NULL));
do
{
for(int isfo=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()%20;
Food.y=rand()%20;
}
}
while(Food.x*20<70||Food.y*20<70||Food.x*20>430||Food.y*20>430);
pDC->Rectangle(Food.x*20,Food.y*20,(Food.x+1)*20,(Food.y+1)*20);
Food.isfood=0; }
4.5游戏测试
以下是部分游戏视图:
图4.1游戏开始运行 图4.2游戏结束
5 总结
在开始着手编程之前,我以为编个小游戏很简单,但是当我深入思考后发现,并不是自己想象的那么简单,虽然不是什么难度很大的算法,但是程序要考虑的问题很多,相当复杂,需要考虑的很全面,不然就打不到预期的效果。深入思考碰壁后,我在VC++课本上找到了灵感,把课本上的小程序仔细研究调试之后,终于弄清楚了其中的奥妙。通过此次贪吃蛇游戏的设计,确实学到了很多实战的经验。以前只是纸上谈兵,真正下起手来才发现自己其实对C++语言还没有掌握到编程的程度。
开始编译之后,自己通过与同学交流,查阅资料,独立的编写出了游戏代码,并进一步优化,加强可操作性,从中得到了很多课上没有的知识,体会到了编程的快乐,也许,编程就是,由简单到复杂,由复杂到简单。刚开始时,一直失败,好多错误,其实就是些基本的错误,比如变量的定义,整型变量的范围,结构体的运用,指针的定义,函数的调用等等,通过这些问题才发现自己学习的知识是那么不牢固。再有就是些技术上的难题,比如画图函数,初次接触,需要去查阅运用。这次实习不仅仅锻炼了我的VC++编程能力,同时让
展开阅读全文