贪吃蛇MFC的VC++编辑毕业设计论文
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
第1章需求分析 (2)
第2章游戏设计 (2)
2.1 游戏介绍 (2)
2.2 游戏结构 (2)
2.2.1控制面板结构............................................. 错误!未定义书签。
2.2.2贪吃蛇行动指令系统逻辑流程设计......... 错误!未定义书签。
第3章游戏详细设计与实现 .. (5)
3.1.定义蛇和食物
3.2蛇形和食物绘制
3.3.开始游戏暂停游戏继续游戏退出游戏
3.4.初始化界面
3.5.蛇在行走的运动,蛇头方向,吃食物判定,蛇身变长,游戏结束等
判定
第4章编码与调试 (13)
第5章系统使用手册 (13)
第6章总结 (13)
第1章需求分析
贪吃蛇是一款老少皆宜的益智类竞技游戏,操作简单广受大众喜爱,因程序简易模式多样支持多平台而被我们选为本次课设题目,我们将基于MFC的VC++编辑。
第2章游戏设计
2.1 游戏介绍
本游戏讲述了一只可怜的像素蛇snake,被两个可怕的猥琐怪蜀黍囚禁在一个凄凉的幽闭空间中不停追逐像素果子的故事。
在幽闭空间中每当snake碰撞到像素果子时就会伸长而且移动速度会随之变快,当snake碰触到自己身体或四壁时game over。
1. 控制面板功能
(1)开始游戏;
(2)暂停游戏;
(3)继续游戏;
(4)退出游戏;
2. 游戏功能
(1)snake初始位置,初始移动;
(2)方向移动snake;
(3)果子随机出现;
(4)snake吃掉像素果子后伸长;
(5)果子再生;
(6)snake碰撞四壁以及身体后死亡;
2.2 游戏结构
整个软件根据游戏需求分析,可得出系统控制面板结构图和snake程序整体
调用关系流程图。
2.2.1 控制面板结构
有操作需制作控制板结构来控制游戏
控制面板结构图如下所示
图2.1 控制面板结构图
2.2.2 贪吃蛇行动指令系统逻辑流程设计
分析贪吃蛇游戏功能以及操作后得出贪吃蛇行动逻辑方案,按照方案编写程序函数以及构造程序逻辑流程图
主要运行函数以及逻辑流程图如下:
表2.2 主要函数表
图2.3 贪吃蛇行动逻辑流程图
第3章游戏细设计与实现
我们将游戏的制作重点放在实现snake的各种行动指令以及实现snake的伸长和果实的随机出现
3.1游戏运行中的设计与实现
1.定义蛇和食物
开始定义游戏中的蛇与食物两个单位
struct Snake
{ int x,y;
int len;
int direct;
}Snake[50];
struct Food
{
int x;
int y;
int isfood;
}Food;
2蛇形和食物绘制
void CSNAKEView::OnDraw(CDC* pDC)
{
CSNAKEDoc* pDoc = GetDocument();
ASSERT_V ALID(pDoc);
// TODO: add draw code for native data here
CBrush backBrush(RGB(100,100,0));
CBrush* pOldBrush = pDC->SelectObject(&backBrush);
CRect rect;
pDC->GetClipBox(&rect);
pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(),PATCOPY);
pDC->SelectObject(pOldBrush);
3.开始游戏暂停游戏继续游戏退出游戏
游戏中的各菜单功能的设计与实现
(1)Continue菜单
void CSNAKEView::OnContinue()
{
// TODO: Add your command handler code here
SetTimer(1,10,NULL);
}
(2)Exit菜单
void CSNAKEView::OnExit()
{
// TODO: Add your command handler code here AfxMessageBox("退出游戏...");
}
(3)Start菜单
void CSNAKEView::OnStart()
{
// TODO: Add your command handler code here SetTimer(1,3000,NULL);
AfxMessageBox("3秒后开始游戏!"); OnInitialUpdate();
}
(4)Stop菜单
void CSNAKEView::OnStop()
{
// TODO: Add your command handler code here KillTimer(1);
AfxMessageBox("暂停游戏...");
}
4.初始化界面
void CSNAKEView::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 }
5.蛇在行走的运动,蛇头方向,吃食物判定,蛇身变长,游戏结束等判定
我们将蛇的一系列运动写在一个函数中,此函数用来实现蛇的各种行动以及各种判定
void CSNAKEView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CDC *pDC=GetDC();
CString soure;
if(Snake[0].len==2)SetTimer(1,370,NULL);
if(Snake[0].len==3)SetTimer(1,270,NULL);
if(Snake[0].len==6)SetTimer(1,200,NULL);
if(Snake[0].len==9)SetTimer(1,100,NULL);
soure.Format("得分:%d!",(Snake[0].len-3)*10);
//撞界判断
if(Snake[0].x*20<=37||Snake[0].y*20<=37||Snake[0].x*20>=462||Snake[0].y*20>=46 2)
{
KillTimer(1);
AfxMessageBox(soure);
// s=0;
}
//蛇身相撞判断
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);
// s=0;
}
}
///////////////////////////////////////////////////////////////////////////
pDC->SelectStockObject(WHITE_PEN);
pDC->Rectangle(Snake[Snake[0].len-1].x*20,Snake[Snake[0].len-1].y*20,(Snake[Sn ake[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(100,100,100));
CBrush *Drawbrush=pDC->SelectObject(&DrawBrush);
pDC->Rectangle(Snake[0].x*20,Snake[0].y*20,(Snake[0].x+1)*20,(Snake[0].y+1)*2 0);
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()%25;
Food.y=rand()%25;
}
}
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);
}
第4章编码与调试
在上一章节中已经分模块给出了核心代码,则在此不需再给出代码,可从系统在编码实现过程中遇到的主要问题及其解决方法在此罗列。
第5章系统使用手册
上下左右方向键控制snake的行动其他你懂得。
第6章总结
本次课程设计首先查阅航空售票方面的知识及系统设计的各种资料,规划出了整个航空售票的设计流程,写出了航空售票系统的需求分析、航空售票系统的设计、航空售票系统的系统详细设计;其次采用Visual Studio 2008开发环境、平台、Microsoft SQL Server 2008数据库,C#编程实现系统各模块功能;最后对系统进行了编码与调试。
完成的主要工作有:
(1)调查了国内外航空售票系统的现状,结合用户对应用的需求,进行需求分析,确定了系统的设计方向。
(2)针对设计方向,结合自身知识,利用现有资源对系统进行详细设计,
在用户端完成了用户注册、查询航班、订票、退票等功能;在管理端完成了管理员对用户注册、航班、航线、机票的管理。
(3)对系统进行编码实现并调试,根据所得结果,进一步改进和完善系统。
本次课程设计中还存在以下不足,对于用户网上支付安全性等问题没有过多考虑。
此外,随着信息化时代的到来,智能化的系统也越来越受人们青睐,而本文对系统的智能化未作深入探讨。