数据结构面向对象课程设计MFC贪吃蛇.docx

上传人:b****6 文档编号:5186898 上传时间:2022-12-13 格式:DOCX 页数:16 大小:891.43KB
下载 相关 举报
数据结构面向对象课程设计MFC贪吃蛇.docx_第1页
第1页 / 共16页
数据结构面向对象课程设计MFC贪吃蛇.docx_第2页
第2页 / 共16页
数据结构面向对象课程设计MFC贪吃蛇.docx_第3页
第3页 / 共16页
数据结构面向对象课程设计MFC贪吃蛇.docx_第4页
第4页 / 共16页
数据结构面向对象课程设计MFC贪吃蛇.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

数据结构面向对象课程设计MFC贪吃蛇.docx

《数据结构面向对象课程设计MFC贪吃蛇.docx》由会员分享,可在线阅读,更多相关《数据结构面向对象课程设计MFC贪吃蛇.docx(16页珍藏版)》请在冰豆网上搜索。

数据结构面向对象课程设计MFC贪吃蛇.docx

数据结构面向对象课程设计MFC贪吃蛇

湖南工业大学

课程设计任务书

2012—2013学年第2学期

计算机与通信学院(系、部)软件工程专业1201班级

课程名称:

面向对象课程设计

设计题目:

贪吃蛇

完成期限:

自2013年6月24日至2013年6月29日共1周

一、设计的主要技术参数

《贪吃蛇》游戏实现的功能有:

控制蛇前后左右移动、控制蛇斜走、暂停游戏、继续游戏、背景音乐的播放、记录成绩

二、设计任务

游戏操作界面的生成;插入游戏界面图片;蛇的移动控制、播放音乐、暂停/停止暂停、结束游戏、游戏记录的生成;程序的调试与修改

三、设计工作量

一周

起止日期

工作内容

6月24号

游戏操作界面的生成、背景图片的插入

6月25号-26号

蛇的移动控制、播放音乐、暂停/停止暂停

6月27号-28号

结束游戏、游戏记录的生成

6月29号

程序的调试与修改

1.谭浩强.C++面向对象程序设计[M].北京:

清华大学出版社,2006.

2.张海林,杜忠友,姜玉波.VisualC++简明教程[M].北京:

电子工业出版社,2007.

3.丁展,四维科技.VisualC++游戏开发技术与实例[M].北京:

人民邮电出版社,2005.

4.姚领田.精通MFC程序设计[M].北京:

人民邮电出版社.2000.

指导教师(签字):

年月日

系(教研室)主任(签字):

年月日

《面向对象程序设计课程设计》

┊┊

设计说明书

基于windows界面应用程序

贪吃蛇

起止日期:

2013年6月24日至2013年6月28日

学生姓名

汪骁将

班级

软件工程1201

学号

12408300126

成绩

指导教师(签字)

计算机与通信学院

2013年6月28日

第四章解释

 

第一章引言

1.1关于题目

1.1.1题目要求

利用MicrosoftVisualC++制作一个贪吃蛇的小游戏,要求:

(1)应用MFC单文档制作

(2)能够记录游戏成绩

(3)可暂停/继续并在玩家不愿游戏时停止游戏

(4)有背景音乐和音效

1.1.2选题背景

贪吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇这个游戏就深深地吸引着我们,它的制作方法对于以前的我们而言都是很神秘的。

我们希望通过自己的所学知识把它剖析开来,真真正正的了解它的本质和精髓。

虽然我们的编程能力不是很强,但是通过三人团队的合作,我们有信心,在这次学习中我们将从实践和实际的项目中提高自己的编程能力。

因此我们选定了这个题目。

1.2关于编译软件

本程序采用MicrosoftVisualC++6.0的英文版本进行编译。

VisualC++6.0是Microsoft公司推出的基于Windows操作系统的可视化C++编程工具,尽管Microsoft公司推出了.NET平台的集成开发环境,但由于其良好的界面和可操作性,加上支持标准C/C++规范,但仍有相当多的编程人员使用VisualC++6.0进行应用系统的开发。

1.3关于兼容性

本程序经过调试,可以在XP系统下编译运行,也可以在Vista下运行,界面稍有不同,但不影响运行结果。

 

第二章概要设计

2.1软件主要功能设计

2.1.1程序结构

根据分析,贪吃蛇这个程序一共要实现如下几个功能,包括游戏方面开始游戏、暂停游戏以及停止游戏,音乐音效的添加与控制,游戏帮助提示等等。

具体的程序结构如下面的图所示:

 

 

2.1.2程序流程

根据分析后的贪吃蛇结构设计出相应的贪吃蛇流程。

贪吃蛇的内容主要包括:

游戏开始,随机出现食物;按下暂停按钮或Space键可以实现暂停功能,按下Z键游戏继续开始;按下帮助键可获得游戏帮助说明;可播放背景音乐等等。

下图卫程序流程图:

 

本次贪吃蛇基本流程与大体思想

1  定义蛇类和食物类,初始化贪吃蛇各项成员变量,包括图像的出现在屏幕的初始位置,长度,以及蛇的行走方向。

食物类的定义包括出现的初始位置,以及食物是否被吃掉的判断。

2  用数组初始化长度为3的贪吃蛇,并且默认食物未出现

3  在CView类上运用MFC提供的Windows消息中WM_TIMER消息,运用OnTimer()函数让系统提供一个时钟节拍,更新游戏

4  具体游戏实现,包括蛇撞到自己和围墙都将使游戏结束,判断吃豆等,其中还包括根据蛇的长度来进行游戏难度的改变。

5  具体键盘游戏操作运用到Windows消息响应中的WM_KEYDOWN,用OnKeyDown()来响应玩家的实际操作

第三章软件实现

3.1变量函数及资源的声明

根据程序的结构,将贪吃蛇需要实现的功能细化成为相应的函数。

3.1.1函数声明

voidCYuShuoView:

:

OnDraw(CDC*pDC)

//在OnDraw函数中绘制游戏背景、游戏文字以及控制蛇的样式颜色。

IMPLEMENT_DYNCREATE(CSANKEView,CView)

BEGIN_MESSAGE_MAP(CSANKEView,CView)

//{{AFX_MSG_MAP(CSANKEView)

ON_WM_KEYDOWN()

ON_WM_RBUTTONDOWN()

ON_WM_TIMER()

ON_WM_CANCELMODE()

ON_COMMAND(ID_START,OnStart)

ON_COMMAND(ID_PAUSE,OnPause)

ON_COMMAND(ID_CONTINUE,OnContinue)

ON_COMMAND(ID_EXIT,OnExit)

//}}AFX_MSG_MAP

//Standardprintingcommands

ON_COMMAND(ID_FILE_PRINT,CView:

:

OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_DIRECT,CView:

:

OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView:

:

OnFilePrintPreview)

END_MESSAGE_MAP()

3.1.2变量声明

CArraym_ysBody;//定义点数组作为蛇的身体

CPointm_ysFood;//食物出现的点

3.1.3资源

1、对话框

2、位图

IDB_YS_BITMAP//游戏背景图

3、菜单/工具栏

4、头文件

mmsystem.h//播放音乐的相应文件

#include"stdafx.h"

#include"SANKE.h"

#include"SANKEDoc.h"

#include"SANKEView.h"

#ifdef_DEBUG

#definenewDEBUG_NEW

#undefTHIS_FILE

staticcharTHIS_FILE[]=__FILE__;

#endif

3.2主要功能的实现

3.2.1游戏界面

贪吃蛇游戏的游戏界面包括背景图片、蛇身体的绘制、蛇移动范围的绘制等等。

其中贪吃蛇的身体用什么方法绘制,才可以使得其在游戏过程中可以实现“吃”的功能是很重要的。

因此在游戏界面的初始绘制时就必须考虑到游戏时可能遇到的问题。

3.2.2初始化食物

随机出现应采用rand()函数来实现,而食物与蛇头无偏差相接则利用坐标来解决。

3.2.3开始游戏

开始游戏后的重点是如何用键盘来控制蛇的移动并传递到OnTimer(UINTnIDEvent)函数中去以及判断蛇是否死亡

3.2.4游戏设置

这里的游戏设置主要是指游戏音效音乐的播放控制。

 

同时,我们也为这款游戏定制了一份游戏规则

游戏规则如下:

●点击游戏->开始菜单游戏开始;

●通过方向键控制蛇的运动方向,吃掉随机出现的豆子,若不小心碰到墙壁或者与自身相交,则该轮游戏结束;

●点击游戏->暂停按钮,暂停游戏;点击游戏->游戏继续,继续游戏;

●点击游戏->结束菜单退出游戏;

●单击帮助->查看游戏帮助。

第四章解释

4.1个人所分任务详解

我在这次实验中的工作:

贪吃蛇游戏功能设计。

对ontime()添加代码,包括按键设计、撞界判断、蛇身相撞判断、行走方向判断、判断吃豆的条件(撞到就吃)、如果食物被吃了就生成。

1.这段代码是给键盘上的A、S、D、W以及方向键赋予蛇行进方向的命令,控制蛇的走向(“12345678”本别代表“上下左右”x++,y++进行移动,然后用选定画刷画出一个新节点的矩形作为头结点):

voidCSANKEView:

:

OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)

{

//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;

caseVK_RIGHT:

if(Snake[0].direct!

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

case'W':

if(Snake[0].direct!

=6)Snake[0].direct=5;break;

case'S':

if(Snake[0].direct!

=5)Snake[0].direct=6;break;

case'A':

if(Snake[0].direct!

=8)Snake[0].direct=7;break;

case'D':

if(Snake[0].direct!

=7)Snake[0].direct=8;break;

}

CView:

:

OnKeyDown(nChar,nRepCnt,nFlags);

CView:

:

OnKeyDown(nChar,nRepCnt,nFlags);

}

 

2.这段代码是给蛇制定一个速度变化,当蛇“吃”到一定长度时,速度会加快

voidCSANKEView:

:

OnTimer(UINTnIDEvent)

{

//TODO:

Addyourmessagehandlercodehereand/orcalldefault

CDC*pDC=GetDC();

CStringsoure;

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

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

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

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

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

//soure.Format("得分:

%d分!

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

soure.Format("得分:

%d分!

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

3.这段代码是对蛇“撞界”的判断,给蛇规定一个行动的区域;还有规定了蛇不能撞到自己的“身体”,否则游戏结束并显示得分:

if(Snake[0].x*20<=37||Snake[0].y*20<=37||Snake[0].x*20>=580||Snake[0].y*20>=580)//撞界判断

{

KillTimer

(1);

AfxMessageBox(soure);

//s=0;

}

//蛇身相撞判断

if(Snake[0].len>3)

for(intsn=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);

//s=0;

}

}

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

/*由于判断蛇自己是否咬到了自己,根据蛇长sn,进行sn次forsn-1次循环

并且和Snake[0].x进行比较(之所以进行sn-1次那肯定是不包括蛇头而且蛇的长度也必须大于3才会发生自己咬自己的情况)

KillTimer

(1);是停止计时器;和之前的SetTime()对应而已

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(inti=Snake[0].len-1;i>0;i--)

{

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

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

}

进行次数为"长度-1"次的循环,这里是不包括蛇头的进行的平移,用数组赋值的方法,把前一节点保存在后一个结点,然后头结点向前移动。

 

4.这段代码是给蛇走向的判断,令蛇可以前后左右和斜着走:

//行走方向判断

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++;

if(Snake[0].direct==5)

{

Snake[0].y--;

Snake[0].x++;}

if(Snake[0].direct==6)

{

Snake[0].y++;

Snake[0].x--;}

if(Snake[0].direct==7)

{

Snake[0].x--;

Snake[0].y--;}

if(Snake[0].direct==8)

{

Snake[0].x++;

Snake[0].y++;}

pDC->SelectStockObject(BLACK_PEN);

 

相关运行图如下:

向右

向左

向下

向上

右斜向上或左斜向下走。

 

左斜向上或右斜向下走。

 

第五章结果与讨论

5.1程序运行

程序开始运行后会进入游戏界面,但是不会立即进行游戏,单击菜单的“开始”才会开始游戏。

在游戏过程中,按下Space键就会暂停游戏,再按下Z键则会继续游戏。

5.1.1部分函数与代码

在程序中定义一个蛇的类,结构如下:

structSnake

{

intx,y;

intlen;

intdirect;

}Snake[50];

structFood

{

intx;

inty;

intisfood;

}Food;

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

在数组中,每个元素有四

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

值为0。

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

通过

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

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

动。

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

在设计界面时。

在VisualStudio2008

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

法。

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

的节点。

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

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

在对蛇身进行绘画时。

通过数组元

素的值将蛇身在对话框的矩形中显示出来。

在蛇身运动时,首先在蛇头位置蛇身

增长一个节点,然后判断蛇头是否到达食物所在位置,若在食物所在位置,则蛇

尾不减一,蛇身继续移动,若蛇头不再食物位置,则蛇尾减一,蛇身继续移动。

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

5.2实验总结

贪吃蛇是一款经典的单机游戏,曾承载着无数人的童年记忆,所以我对贪吃蛇也是带有

自己感情和付出的。

在刚开始只是看了中国地质大学网站上对贪吃蛇的算法,后来有综合

了网络上的一些资源就开始编码。

在功能实现上我一直坚持简单实用,例如利用快捷键开始

游戏,但后来发现这太过单点又美化了一下界面和对框架类的修改,

基本上实现了幼年时期的贪吃蛇。

当我玩着自己和同学做的游戏的时候有一种成就感,

因为这期间有太多的曲折。

经过这近两周的课设我认识到自己的肤浅和知识量的不足,同

时这几周也让我更快地获得了如何解决问题的能力和提高相应的知识。

同时很感谢我的老

师和同学,他们给予我极大的技术和精神支持,让我一步步坚定的向前走。

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

当前位置:首页 > 高等教育 > 艺术

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

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