VC可视化课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、课设要求
设计题目九:基于MFC的贪吃蛇游戏设计与实现
1.游戏界面设计
2.食物的初始化
3.游戏开始以及具体实现
4.网上许多贪吃蛇游戏设计资料,切记可以参考,请勿照搬!
二、贪吃蛇游戏的简单操作和功能说明
1. 简单描述
游戏通过MFC单文档实现。可以实现贪吃蛇的基本操作例如控制蛇的移动,食物刷新,分数判断,游戏开始、暂停、继续、结束、重新开始,加载背景音乐等。
2. 界面和菜单介绍
(1)界面介绍
如图,是程序的主界面
1
(2)功能菜单
如下图,是游戏菜单的下拉选项。包括游戏开始,游戏暂停,游戏继续,游戏结束和重新开始。每个菜单都有相应的快捷键,其中暂停功能还可以通过游戏中按“空格”这个快捷键实现。
关于游戏:
2
游戏暂停,游戏结束,游戏失败后会有相应提示框。如下:
3
三、源程序模块
1.添加的windows消息和系统函数
首先在“ClassView”中添加了以下Windows信息
1 WM_KEYDOWN(当一个非系统键被按下时该消息发送给具有键盘焦点的窗口。)
2 WM_TIMER(在指定的时间间隔内反复触发指定窗口的定时器事件。)
4
然后还有“ADD Virtual Funciton”的OnInitialUpdate()
另外添加一个成员函数oninit(),负责贪吃蛇外观的初始化。
5
2.控件设计
以“游戏开始”控件为例介绍,其余类似。ID,和函数如下图:6
快捷键:
3.背景音乐实现
首先进入音频文件资源,然后在OnInitialUp函数中加入如下代码:
PlaySound((LPCTSTR)IDR_WA VE1, AfxGetInstanceHandle(), SND_RESOURCE | SND_ASYNC|SND_LOOP);
4.各主要函数
void CSnakeView::OnInitialUpdate() //初始化贪吃蛇{
7
PlaySound((LPCTSTR)IDR_WA VE1, AfxGetInstanceHandle(), SND_RESOURCE | SND_ASYNC|SND_LOOP); //加载背景音乐
// SND_RESOURCE是调用资源函数SND_LOOP实现循环播放CView::OnInitialUpdate();
Snake[0].x=5;
Snake[0].y=3;
Snake[1].x=4;
Snake[1].y=3;
Snake[2].x=3;
Snake[2].y=3;
Snake[0].direct=4;
Snake[0].len=3;
Food.isfood=1;
}
void CSnakeView::Oninit() //该函数画一个矩形,用当前的画笔画矩形轮廓,用当前画刷进行填充{
CDC *pDC=GetDC();
8
//什么CDC类的,我也不太懂~
CBrush DrawBrush=(RGB(100,100,100));
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);
}
代码说明:
利用Windows给我们提供的CDC类来进行画图,我们首
先用一个指向CDC类的指针去接受与该窗口相关联的DC句柄,然后用定义画刷一个DrawBrush对象,并且用RGB(100,100,100)来给画刷初始化颜色。并且用SelectObject(&DrawBrush);函数
把对象画刷选入到设备描述表中,用for循环依次把贪吃蛇的3个节点画出来。
void far rectangle(int left, int top, int right, int bottom);
这个函数的的功能根据
9
}
void CSnakeView::OnStart() //游戏开始{
SetTimer(1,1000,NULL); //设置游戏每秒刷新一次}
void CSnakeView::OnPause() //游戏暂停{
KillTimer(1); //暂停计时器AfxMessageBox("暂停游戏...");
}
void CSnakeView::OnContinue() //游戏继续{
SetTimer(1,10,NULL);
}
void CSnakeView::OnExit() //游戏退出{
10
AfxMessageBox("退出游戏...");
exit (0) ;
}
void CSnakeView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) //键盘控制函数{
default
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; } //Snake[0]代表的是蛇头,对蛇头的方向Snake[0].direct进行判断。Case VK_UP:if(Snake[0].direct!=2)Snake[0].direct=1;break; 意思就是当Snake[0].direct的方向此时并不等于“下”的时候,才能做出“上”的操作动作,否则则忽略用户“向上”的操作按键效果
CView::OnKeyDown(nChar, nRepCnt, nFlags);
CView::OnKeyDown(nChar, nRepCnt, nFlags);