C++贪吃蛇课程设计.docx

上传人:b****6 文档编号:3032440 上传时间:2022-11-17 格式:DOCX 页数:18 大小:122.44KB
下载 相关 举报
C++贪吃蛇课程设计.docx_第1页
第1页 / 共18页
C++贪吃蛇课程设计.docx_第2页
第2页 / 共18页
C++贪吃蛇课程设计.docx_第3页
第3页 / 共18页
C++贪吃蛇课程设计.docx_第4页
第4页 / 共18页
C++贪吃蛇课程设计.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

C++贪吃蛇课程设计.docx

《C++贪吃蛇课程设计.docx》由会员分享,可在线阅读,更多相关《C++贪吃蛇课程设计.docx(18页珍藏版)》请在冰豆网上搜索。

C++贪吃蛇课程设计.docx

C++贪吃蛇课程设计

青岛理工大学琴岛学院

设计报告

 

课题名称:

基于C++贪吃蛇的设计与实现

学院:

计算机工程系

专业班级:

计算机科学与技术(专升本)

13级1班

学号:

20130371001

学生:

邵坤

指导教师:

张秀国

 

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

2013年12月27日

学生

邵坤

指导教师

张秀国

课题名称

基于C++贪吃蛇的设计与实现

设计时间

2013.12.23~2013.12.27

设计地点

8教209室

设计目的

动手练习制作MFC小应用。

锻炼自己动手制作、查询资料、独立思考的能力

指导教师评语

 

系部教研室

意见

 

一、需求分析

贪吃蛇游戏作为一款经典小游戏,版本多样,娱乐性也很高,适合在闲暇时放松心神。

并且可在多个平台上实现,程序简单易懂,非常适合初学者学习制作。

1、语言的使用

现在的贪吃蛇游戏一般是用C语言实现的,用C语言编写贪吃蛇游戏比较简单易懂,当然也可以用其他语言来实现,比如Java、C++、C#等,这里我们用C++来实现。

2、用C++的优势

C++在一定程度上可以和C语言很好的结合,甚至大多数C语言程序是在C++的集成开发环境中完成的。

C++相对众多的面向对象的语言,具有相当高的性能。

C++引入了面向对象的概念,使得开发人机交互类型的应用程序更为简单、快捷。

很多优秀的程序框架包括Boost、Qt、MFC、OWL、WTL就是使用的C++。

人们一般认为,使用Java或C#的开发成本比C++低。

但是,如果充分分析C++和这些语言的差别,会发现这句话的成立是有条件的。

这个条件就是:

软件规模和复杂度都比较小。

如果不超过3万行有效代码(不包括生成器产生的代码),这句话基本上还能成立。

否则,随着代码量和复杂度的增加,C++的优势将会越来越明显。

造成这种差别的就是C++的软件工程性。

相对于其他的语言,C++具有它自己的优势,主要体现在以下几个方面:

(1)、C++实现了面向对象程序设计。

在高级语言当中,处理运行速度是最快的,大部分的游戏软件,系统都是由C++来编写的。

(2)、C++语言非常灵活,功能非常强大。

如果说C语言的优点是指针,那么C++的优点就是性能和类层次结构的设计。

(3)、C++非常严谨、精确和数理化,标准定义很细致。

(4)、C++语言的语法思路层次分明、相呼应;语法结构是显式的、明确的。

当然,这只是C++的一部分优势,在运用过程中,我们会逐渐发现C++语言之美。

3、实现的功能

⑴运行程序。

⑵点击“游戏->开始”,出现围墙界面,一条蛇在密闭的围墙内,在围墙内随机出现一食物,游戏开始。

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

⑷游戏结束后,会弹出游戏得分。

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

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

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

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

⑼单击帮助->游戏规则查看游戏规则。

4、主要的思想

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

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

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

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

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

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

4、游戏界面如下:

 

 

图1游戏界面

 

图1

二、概要设计

1、首先,用一个结构体数组来标记蛇的X位置和Y位置,还有每一节的方向。

用一变量标识蛇的长度。

2、在蛇非转弯的移动时用定时器来自动移动,不管蛇是哪种形状,都只需在每次移动时先将各节向后移动(蛇尾舍弃,新的蛇尾由蛇尾的上一节代替):

如蛇本身为snake[0]到snake[3],就是将snake[0]到snake[2]一起移动到snake[1]到snake[3]:

将snake[2]的XY坐标赋值snake[3]的XY坐标,snake[1]的XY坐标赋值给snake[2]的XY坐标,snake[0]的XY坐标赋值给snake[1]的XY坐标。

再判断蛇头的方向,然后将蛇头顺着这个方向向前移动一格就是蛇头snake[0]的XY坐标。

而蛇除蛇头外各节的方向由函数SetDirection()来确定(明显此种情况,蛇头的方向不变),SetDirection()的思想是根据蛇的每一节的前一节的相对位置来确定本节的方向。

(其实这个函数是多余的,真正用到的只有蛇头的方向)。

3、蛇在转弯时,也是各节一次向后移,蛇头的位置顺着转弯的方向移动,方向由转弯方向确定。

4、蛇在吃到食物时,长度加一,蛇头的位置变成食物的位置,方向不变。

蛇的本身每节的XY位置都向后移。

如蛇本身为snake[0]到snake[3],就是将snake[0]到snake[3]一起移动到snake[1]到snake[4]。

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

6、每次蛇在转弯时只能有一种方向按键能响应,即要么左右转,要么上下转。

蛇头方向向左或向右时,只能上下转;蛇头方向向上或向下时,只能左右转。

7、食物的位置由rand函数随机产生。

游戏运行界面如图2所示:

图2游戏界面

8、游戏框架如下:

 

 

图3游戏框架

3、主要类及成员函数、数据成员的说明如表1所示

表1

类的名称

成员名称

功能

Snake

x

蛇的横坐标

y

蛇的纵坐标

len

蛇的长度

direct

指引蛇的方向

Food

x

食物的横坐标

y

食物的纵坐标

sfood

食物个数

CSnakeView

OnStart()

控制游戏开始

OnPause()

控制游戏暂停

OnContinue()

控制游戏继续

OnExit()

控制游戏退出

OnKeyDown()

接收用户键入的信息,然后用switch进行选择判断

OnRButtonDown()

用鼠标右键屏幕,就会马上显示当前位置的坐标信息

OnRButtonDown()

该函数画一个矩形,用当前的画笔画矩形轮廓,用当前画刷进行填充

oninit()

该函数画一个矩形,用当前的画笔画矩形轮廓,用当前画刷进行填充

OnTime()

改变蛇的移动速度,判断蛇是否撞墙,食物的随机分配,吃食物以后长度的增加,蛇的移动方向的改变

OnDraw(CDC*pDC)

 用画刷画一个背景,并且包含当前可见区域的最小矩形的大小,使用当前选入指定设备环境中的刷子绘制给定的矩形区域

三、详细设计

1、添加消息处理函数

在已有工程下的ClassView中右键Cview类添加以下Windows信息

WM_RBUTTONDOWN

WM_RBUTTONDOWN

WM_TIMER

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

OnInitialUpdate()的功能如下:

视图窗口完全建立后第一个被框架调用的函数。

框架在第一次调用OnDraw前会调用OnInitialUpdate,因此OnInitialUpdate是设置滚动视图的逻辑尺寸和映射模式的最合适的地方。

时间上,两者先后顺序不同,构造函数生成本类的对象,但没有产生窗口,OnCreate后窗口产生,然后才是视图的OnInitialUpDate,一般在这里对视图的显示做初始化。

简单点,就是ONCREATE只是产生VIEW的基本结构和变量而在OnInitialUpDate()中,主要初始化视图中控件等。

所以我们要用这个函数来进行贪吃蛇的初始化工作。

再者还要添加一个成员函数oninit()进行贪吃蛇外观的初始化。

2、控件的设计

再者是设计游戏的一些控件来控制“游戏开始”“游戏结束”和“游戏暂停”。

我们可以点击“工作空间”的“ResourceView”进行控件的具体设计,这里我们在Menu文件夹中把“IDR_MAINFRAME”中默认的控件全部删除,右键其中的标题栏,点击属性,会得到一个菜单栏标题,我们分别建立1个菜单栏标题。

这里我们分别建“游戏”。

图4添加的控件

点击并且在已有控件中的列表中点击属性,进行“菜单项目属性”的设置。

我们本别建立的属性“标明”与对应的ID有

游戏开始IDM_START

游戏暂停IDM_PAUSE

游戏继续IDM_CONTINUE

游戏退出IDM_EXIT

成功设置ID之后我们分别右键各项属性进行消息响应处理函数的生成

具体方法操作例子如下

1右键“游戏开始”

2点击“类向导建立”

3在MessageMaps页面,在要进行消息响应的控件ID列表ObjectIDs中上选择对应的ID,这里我们选择IDM_START,具体实现的环境是CView类,所以我们必须把“Classname”的默认“CMainFrame”改为“CView类”,并且在“Messages”类型设置中,用“COMMAND”设置为其为命令消息。

其余各项也按照同理进行设置。

3、具体实现游戏

Step1

首先我们在文件开头处分别定义蛇和食物的全局变量

staticstructSnake

{

intx,y;

intlen;

intdirect;

}Snake[1000];

staticstructFood

{

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;

}

初始化贪吃蛇起初有3个节点,长度为3和起始坐标;食物默认为1无0有。

Step2对OnKeyDown()具体添加代码

voidCSnakeView:

:

OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)

{

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;

}

CView:

:

OnKeyDown(nChar,nRepCnt,

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

当前位置:首页 > 职业教育 > 其它

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

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