贪吃蛇VC课程设计毕业论文 - 图文

更新时间:2024-03-26 14:58:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

VC课程设计报告

设计题目:贪吃蛇

目录

第一章 引言 ..................................................................... - 1 -

1.1关于题目 ................................................................. - 1 -

1.1.1题目要求 ........................................................... - 1 - 1.1.2选题背景 ........................................................... - 1 - 1.2关于编译软件 ............................................................. - 1 - 1.3关于兼容性 ............................................................... - 1 - 第二章 概要设计 ................................................................. - 2 -

2.1软件主要功能设计 ......................................................... - 2 -

2.1.1程序结构 ........................................................... - 2 - 2.1.2程序流程 ........................................................... - 2 -

第三章 软件实现 ................................................................. - 4 -

3.1变量函数及资源的声明 ..................................................... - 4 -

3.1.1函数声明 ........................................................... - 4 - 3.1.2变量声明 ........................................................... - 4 - 3.1.3资源 ............................................................... - 5 - 3.2主要功能的实现 ........................................................... - 5 -

3.2.1游戏界面 ........................................................... - 5 - 3.2.2初始化食物 ......................................................... - 6 - 3.2.3开始游戏 ........................................................... - 7 - 3.2.4英雄榜 ............................................................. - 9 - 3.2.5游戏设置 ........................................................... - 9 -

第四章 结果与讨论 .............................................................. - 10 -

4.1程序运行 ................................................................ - 10 - 4.2错误调试与分析 .......................................................... - 12 -

VC课程设计报告

第一章 引言

1.1关于题目 1.1.1题目要求

利用Microsoft Visual C++制作一个贪吃蛇的小游戏,要求: (1)应用MFC单文档制作

(2)能够记录游戏时间,游戏成绩

(3)可暂停/继续并在玩家不愿游戏时停止游戏 (4)蛇的身体能够随着蛇的长度变色 (5)能够显示英雄榜 (6)有背景音乐和音效

1.1.2选题背景

贪吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇这个游戏就深深地吸引着我,它的制作方法对于以前的我而言都是很神秘的。我希望通过自己的所学知识把它剖析开来,真真正正的了解它的本质和精髓。虽然我的编程能力不是很强,但是我有信心,在这次学习中我将从实践和实际的项目中提高自己的编程能力。因此我选定了这个题目。

1.2关于编译软件

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

1.3关于兼容性

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

- 1 -

VC课程设计报告

第二章 概要设计

2.1软件主要功能设计 2.1.1程序结构

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

图2-1 贪吃蛇结构图

2.1.2程序流程

根据分析后的贪吃蛇结构设计出相应的贪吃蛇流程。贪吃蛇的内容主要包括: 游戏开始,随机

- 2 -

VC课程设计报告

出现食物;按下ToolBar中的暂停按钮或Space键可以实现暂停功能;按下帮助键或ToolBar中的“?”键可获得游戏帮助说明;可播放背景音乐和音效并可通过菜单以及ToolBar控制其播放或停止等等。

图2-2 贪吃蛇流程图

- 3 -

VC课程设计报告

第三章 软件实现

3.1变量函数及资源的声明

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

3.1.1函数声明

void CYuShuoView::OnDraw(CDC* pDC)

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

void CYuShuoView::YsInitFood() //初始化贪吃蛇的食物,使其随机生成 void CYuShuoView::YsInitGame() //初始化贪吃蛇游戏参数 void CYuShuoView::YsReDisplay(CPoint ysPoint) //重绘游戏窗口

void CYuShuoView::OnYsBegin() //开始游戏(菜单响应消息) void CYuShuoView::OnYsPause() //暂停游戏(菜单响应消息) void CYuShuoView::OnYsStop() //停止游戏(菜单响应消息) void CYuShuoView::OnYsExit() //退出游戏(菜单响应消息) void CYuShuoView::OnYsEffect() //控制游戏音效 void CYuShuoView::OnYsMusicbkg() //控制游戏背景音乐 void CYuShuoView::OnYsLevel1() //控制游戏等级为初级 void CYuShuoView::OnYsLevel2() //控制游戏等级为中级 void CYuShuoView::OnYsLevel3() //控制游戏等级为高级 void CYuShuoView::OnYsHelpgame() //游戏帮助 void CYuShuoView::OnYsBest() //英雄榜的显示

3.1.2变量声明

CArray m_ysBody; //定义点数组作为蛇的身体 CPoint m_ysFood; //食物出现的点 int m_ysTime; //显示时间

int m_ysTime1; //满10则进一位使时间增加1秒 int m_ysDirect; //方向控制变量 int m_ysScore; //玩家成绩变量 int m_yspausectrl; //暂停控制变量 int m_yslevelctrl; //等级控制变量

- 4 -

VC课程设计报告

CString m_ysPlayer; //玩家姓名 int m_yseffectctrl; //音效控制变量 int m_ysmusicctrl; //背景音乐控制变量

3.1.3资源

1、对话框

IDD_YS_HELPGAME //游戏帮助说明 IDD_YS_BEST //英雄榜 IDD_YS_RETRY //停止游戏确认 IDD_ABOUTBOX //关于游戏版本 2、音乐

IDR_YS_BKGMUSIC //游戏背景音乐

IDR_YS_EAT //贪吃蛇吃到食物的音乐 IDR_YS_LOWSCORE //游戏结束后得低分音乐 IDR_YS_HIGHSCORE //游戏结束后得高分音乐 3、位图

IDB_YS_BITMAP //游戏背景图 4、菜单/工具栏

IDR_MAINFRAME //系统自带菜单

IDR_YS_TOOLBAR //自己创建的工具条 5、头文件

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

3.2主要功能的实现 3.2.1游戏界面

贪吃蛇游戏的游戏界面包括背景图片、蛇身体的绘制、蛇移动范围的绘制等等。其中贪吃蛇的身体用什么方法绘制,才可以使得其在游戏过程中可以实现“吃”的功能是很重要的。因此在游戏界面的初始绘制时就必须考虑到游戏时可能遇到的问题。

本程序采用点数组CArray m_ysBody来存储贪吃蛇,点数组的功能很强大,可以添加点,同时可以获得蛇的长度,对于而后进行游戏中控制蛇的颜色以及音效的播放等都有很大

- 5 -

VC课程设计报告

的帮助。

导入位图以及菜单工具条后,游戏未开始前(XP系统下)的界面显示如图3-1所示

图3-1 游戏初始界面显示

3.2.2初始化食物

确定用点数组存储贪吃蛇以后,贪吃蛇的食物如何达到随机出现,并且能够按照网格式与蛇头无偏差相接就是一个亟待解决的问题。

随机出现应采用rand()函数来实现,而食物与蛇头无偏差相接则利用坐标来解决。设置两个整型变量m_ysX,m_ysY作为食物出现的点的坐标,令m_ysX= rand()0, ,m_ysY= rand()@即可。使随机出现的点能够整除最小网格,也就是使食物与蛇头无偏差相接。

再由食物坐标(m_ysX,m_ysY)与蛇头坐标是否相同判断蛇是否“吃”到了食物,设置判断标签ysTag,如果吃到了,ysTag为1,则再出现下一个食物,反之,如果没吃到,则不出现食物直到

- 6 -

VC课程设计报告

标签为1为止。

最后,再将(m_ysX,m_ysY)赋给m_ysFood作为食物坐标,以便在其他函数中调用。在下面的图3-2中,我们可以看到,蛇的身体是与出现的食物在一条直线上的,完全可以达到相接的目的。

图3-2 蛇与食物的相接

3.2.3开始游戏

开始游戏后的重点是如何用键盘来控制蛇的移动并传递到OnTimer(UINT nIDEvent)函数中去以及判断蛇是否死亡。首先说明键盘与蛇的响应,设置一个方向控制变量m_ysDirect,再添加OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)函数来实现键盘消息的传递,按下不同的键盘按键,m_ysDirect会相应的改变,再利用switch语句在OnTimer(UINT nIDEvent)函数中对坐标进行相应改变即可。如图3-3所示。

(1)左 (2)下 (3)右 (4)上

图3-3 键盘的上下左右键的效果

- 7 -

VC课程设计报告

其次来解释一下如何判断蛇的死亡,由于蛇的身体是由点坐标数组构成的,因此判断蛇是否死亡其本质就是判断蛇头的坐标是否与游戏边框相同或者蛇头坐标是否与蛇自己的身体相同。该过程也在OnTimer(UINT nIDEvent)函数中写入即可,设置一个判断死亡变量ysTag1,当按下向下键时,蛇纵坐标不断自加,此处仅以向下为例,具体程序如下:

switch(m_ysDirect) //根据键盘按下键来选择蛇移动的方向 {

case 1: //方向变量向下 }

如果ysTag1为1,则说明蛇已经死亡,应当弹出对话框提示死亡,输出得分(如图3-4),同时还可以根据玩家的得分数相应的改变对话框中的话语(XP系统下)。

ysPoint2.y++; //点纵坐标自加

if(ysPoint2.y>=40) //如果纵坐标多于最下端边框 { } break;

ysTag1=1; //变量为1,判断死亡

图3-4 贪吃蛇的死亡

- 8 -

VC课程设计报告

我们看到图3-4的蛇身体的颜色发生了变化,不再是初始状态的绿色,而是变为了蓝色,这是在OnDraw(CDC* pDC)函数中设置的,设置变量获取蛇身长度,随着长度的增加,蛇的颜色发生相应改变,最终会变为表示危险的红色。

并且伴随着贪吃蛇挂掉,播放不同的音乐,如果高于70分,则放带有掌声鼓励的高分音乐的IDR_YS_HIGHSCORE,反之,则播放蛇被撞死的电子音乐IDR_YS_LOWSCORE。

播放音乐的函数用包含在头文件mmsystem.h中的PlaySound函数。此外,游戏开始还需要计时、计分以及暂停等功能。这些功能都比较简单,游戏时间和分数分别用两个变量m_ysTime和m_ysScore来记录,应用pDC->TextOut函数来输出即可。至于暂停和继续的功能实现,只需要暂停和恢复计时器就可以了,实现暂停功能即KillTimer(1)并同时令控制暂停变量为m_yspausectrl为0即可。

3.2.4英雄榜

很多游戏都有英雄榜这一个功能。贪吃蛇这个游戏也不例外,为了下一次开始新游戏的玩家也能够看到别人的成绩,所以采用文件来存储游戏记录。

首先加入头文件fstream.h包含文件写入读出函数ifstream、ofstream。定义文件及变量存储成绩,将对话框中EditBox的变量设置成为对应类型。例如:

CYsBestRecord dlg;

dlg.m_ysbestscore1=m_1bestscore;

上面所写的就是变量的传递,传递完毕后,对话框控件中就有了初值,可以正常显示分数。而后进行游戏相应等级的玩家成绩判断,如果玩家成绩与英雄榜成绩相同,则根据时间来判断,若游戏时间短,则进入英雄榜。判断条件如下:

(m_ysScore>m_1bestscore||m_ysScore==m_1bestscore&&m_ysTime

3.2.5游戏设置

这里的游戏设置主要是指游戏的等级以及音效音乐的播放控制。前面在变量声明中已经看到,关于这三个量,我们已经予以了定义,只需要在按下相应键盘或鼠标消息的时候,将变量值进行改变,再利用这些值控制相应功能的运行。以游戏音效为例,在按下菜单中的“游戏设置—〉音乐—〉音效开/关” 后(即菜单消息void CYuShuoView::OnYsEffect()),代码如下:

switch(m_yseffectctrl) //根据音效控制变量选择 { case 1:

//音效选择开

- 9 -

VC课程设计报告

m_yseffectctrl=0; //将音效控制变量改为0 break;

case 0: //音效选择关 }

其中在构造函数CYuShuoView::CYuShuoView()中已经将m_yseffectctrl的初值设置为1。

m_yseffectctrl=1; //将音效控制变量改为1 break;

第四章 结果与讨论

4.1程序运行

程序开始运行后会进入游戏界面,但是不会立即进行游戏,单击菜单的“开始”才会开始游戏。在游戏开始前,玩家可以根据自己的喜好,通过菜单或者工具栏设置游戏等级等。

在游戏过程中,按下Space键就会暂停游戏,再按下Space键则会继续游戏。图4-1所显示的是XP系统下菜单的样式,以及单击菜单开始。

(1)带有子菜单的菜单样式

(2)单击开始菜单 图4-1 菜单样式及单击开始游戏

开始游戏了,小蛇越来越长,颜色也有所不同了。颜色的改变预示着游戏的难度加大了,并且,不同的最终得分会产生不同的死亡评语。

在前面的图3-4中显示了贪吃蛇死亡的样子,其中因为该局游戏得分比较低,因此得到的评语是“你才得了这么两分!”,而如果得分较高,就会得到更好的评语,最好的评语是“牛!”。

图4-2所显示的是游戏开始后随着蛇长度的增加而变的颜色。

- 10 -

VC课程设计报告

(1)黄色 (2)红色

图4-2 蛇变颜色

如果不太会玩贪吃蛇这款游戏,那么可以单击菜单“帮助—〉游戏说明”,或者单击工具条上的,寻求帮助。如图4-2所示。

图4-3 游戏说明

如果你觉得自己实力很强想看看别人的成绩,那么可以单击英雄榜看看什么样。

- 11 -

VC课程设计报告

图4-4 英雄榜样式

4.2错误调试与分析

本程序由于经常调用Invalidate()函数重绘窗口,因此在游戏过程中频闪的非常严重。查阅了很多资料,双缓冲技术可以解决这个问题,但是如果采用双缓冲技术,暂时还不能克服背景的问题,因为在双缓冲技术的应用中,背景是被强制默认为颜色,而不是图片。

我尝试改变了一下,但是没有成功,所以这个问题还没有解决。希望大家多多给予意见。

- 12 -

本文来源:https://www.bwwdw.com/article/yicr.html

Top