VC可视化课程设计

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

相关文档
最新文档