可视化大作业
更新时间:2024-07-09 17:02:01 阅读量: 综合文库 文档下载
武汉理工大学《可视化编程》课程设计说明书
目录
1.概述及课设要求 ......................................... 2 1.1基于MFC的贪吃蛇游戏设计与实现 .......................................... 2 1.2概述 ............................................................................................ 2 2.简单的操作及功能说明 ................................... 3 3.MFC具体设计过程及相应模块的功能 ........................ 4 3.1创建工程 .................................................................................... 4 3.2添加消息,成员函数,控件. ....................................................... 4 3.3定义全局变量并确定贪吃蛇的基本大小 .................................. 4 3.4响应键盘操作的消息 ................................................................. 6 3.5对OnRButtonDown()具体添加代码 ....................................... 7 3.6对贪吃蛇初始化(画图) ............................................................. 7 3.7对相关控件的的功能设定 ......................................................... 8 3.8用画刷画一个背景,并画3个矩形区域. ................................ 10 3.9贪吃蛇的前行中的具体的算法和判断. .................................. 11 4.游戏运行的界面及相关的截图 ............................ 14 5系统设计过程中自己所遇到的问题及相应的解决方法和解决过程。 ........................................................ 16 6结束语 ................................................ 18 7参考文献: ............................................. 19 本科课程论文评分标准 .................................... 20
1
武汉理工大学《可视化编程》课程设计说明书
1.概述及课设要求
1.1基于MFC的贪吃蛇游戏设计与实现
1.游戏界面设计 2.食物的初始化
3.游戏开始以及具体实现
1.2概述
此次课程设计我利用MFC编写了一个贪吃蛇游戏,游戏拥有结束时计
分,开始,暂停,继续,退出,重新开始等功能,并且随着贪吃蛇的长度的增加,刷新的速度(移动的速度)也会变快.
2
武汉理工大学《可视化编程》课程设计说明书
2.简单的操作及功能说明
⑴ 运行程序,游戏界面打开。
⑵ 点击“游戏->游戏开始”,出现围墙界面,一条蛇在密闭的白色矩形内,在围墙内随机出现一个食物,游戏开始。
⑶ 通过四个方向键控制蛇的运动方向,吃掉随机出现的豆子,若不小心碰到墙壁或者与自身相交,则该轮游戏结束。 ⑷ 点击“游戏->游戏暂停”,暂停游戏。 ⑸ 点击“游戏->游戏继续”,继续游戏。 ⑹ 点击“游戏->游戏退出”,退出游戏。 ⑺ 点击“游戏->重新开始”,重新开始。 ⑻ 游戏会根据蛇身的长度自动调节难易程度。
3
武汉理工大学《可视化编程》课程设计说明书
3.MFC具体设计过程及相应模块的功能 3.1创建工程
打开VisualC++新建一个MFC AppWizard单文档工程,取名snake
3.2
添加消息,成员函数,控件.
1 WM_KEYDOWN 2 WM_RBUTTONDOWN 3 WM_TIMER
右键CView类选择“ADD Virtual Funciton”选OnInitialUpdate()
首先在已有工程下的“ClassView”中右键CView类添加以下Windows信息
这里的OnInitialUpdate()是对视图的初始化.后再在csnakeview类中添加一个成员函数oninit()用来对贪吃蛇的外观进行初始化. “ResourceView”进行控件的具体设计,这里我们在Menu文件夹中把“IDR_MAINFRAME”中默认的控件全部删除,后自己添加控件并建立类向导,如下图所示;
3.3定义全局变量并确定贪吃蛇的基本大小
struct Snake {
4
武汉理工大学《可视化编程》课程设计说明书
int x,y; int len; int direct;
}Snake[50];
struct Food { int x; int y; int isfood; }Food;
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;
5
武汉理工大学《可视化编程》课程设计说明书
// TODO: Add your specialized code here and/or call the base class }
我们假设贪吃蛇开始有3个节点,食物则是认为1无0有.
3.4响应键盘操作的消息
void CSnakeView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {
// TODO: Add your message handler code here and/or call 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; }
CView::OnKeyDown(nChar, nRepCnt, nFlags); CView::OnKeyDown(nChar, nRepCnt, nFlags);
}分别对上下左右的消息进行响应,snake[0].direct表示的时蛇头方向.而case VK_UP:if(Snake[0].direct!=2)Snake[0].direct=1;break; 意思就是当Snake[0].direct的方向此时并不等于“下”的时候,才能做出“上”的操作动作,同理其他的代码亦是相同的意思.
6
武汉理工大学《可视化编程》课程设计说明书
3.5对OnRButtonDown()具体添加代码
void CSnakeView::OnRButtonDown(UINT nFlags, CPoint point) {
// TODO: Add your message handler code here and/or call
default
CString str;
str.Format(\AfxMessageBox(str);
CView::OnRButtonDown(nFlags, point); CView::OnRButtonDown(nFlags, point); CView::OnRButtonDown(nFlags, point);
}这个函数用于当你用鼠标右键屏幕,就会马上显示当前位置的坐标信息。其实这个函数可有可无,但是我在后面的的确定初始化窗口的大小很有作用,于是我在当时决定将其加进去.
3.6对贪吃蛇初始化(画图)
void CSnakeView::Oninit() {
CDC *pDC=GetDC();
CBrush DrawBrush=(RGB(100,0,0));
CBrush *Drawbrush=pDC->SelectObject(&DrawBrush);
7
武汉理工大学《可视化编程》课程设计说明书
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个节点画出来。
3.7对相关控件的的功能设定
void CSnakeView::OnPause() {
// TODO: Add your command handler code here KillTimer(1);
}
void CSnakeView::OnContinue() {
// TODO: Add your command handler code here SetTimer(1,10,NULL);
8
武汉理工大学《可视化编程》课程设计说明书
}
void CSnakeView::OnExit() {
// TODO: Add your command handler code here
exit (0); }
void CSnakeView::OnStart() {
// TODO: Add your command handler code here SetTimer(1,30,NULL);
}
SetTimer(m_hWnd,1,1000,NULL); //一个1秒触发一次的定时器
在MFC程序中SetTimer被封装在CWnd类中,所以我在调用就不用指定窗口句柄了,并且找资料得到SetTimer API函数的原型
UINT_PTR SetTimer( HWND hWnd, // 窗口句柄
UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判
断是哪个定时器
UINT uElapse, // 时间间隔,单位为毫秒 TIMERPROC lpTimerFunc // 回调函数 );
因此更加容易的理解了settime的使用及原理.
9
武汉理工大学《可视化编程》课程设计说明书
3.8用画刷画一个背景,并画3个矩形区域.
void CSnakeView::OnDraw(CDC* pDC) {
CSnakeDoc* pDoc = GetDocument(); }
OnDraw()函数众所周知视图类中的输出.视图类的输出基本上都是在视图类的OnDraw函数中处理的,系统会准备好入参,然后调用OnDraw函数
10
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here CBrush backBrush(RGB(100,100,100));
CBrush* pOldBrush = pDC->SelectObject(&backBrush); CRect rect;
pDC->GetClipBox(&rect);
pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(),PATCOPY); pDC->SelectObject(pOldBrush);
pDC->Rectangle(19,19,501,501); Oninit();
武汉理工大学《可视化编程》课程设计说明书
3.9贪吃蛇的前行中的具体的算法和判断.
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!\ //撞界判断
if(Snake[0].x*20<=37||Snake[0].y*20<=37||Snake[0].x*20>=462||Snake[0].y*20>=462) { }
//蛇身相撞判断 if(Snake[0].len>3)
for(int sn=Snake[0].len-1;sn>0;sn--) {
11
KillTimer(1);
AfxMessageBox(soure); // s=0;
武汉理工大学《可视化编程》课程设计说明书
if(Snake[0].x*20==Snake[sn].x*20&&Snake[0].y*20==Snake[sn].y*20)
///////////////////////////////////////////////////////////////////////////
pDC->Rectangle(Snake[Snake[0].len-1].x*20,Snake[Snake[0].len-1].y*20,(Snake[Snake[0].len-1].x+1)*20,(Snake[Snake[0].len-1].y+1)*20);
12
}
{ }
KillTimer(1);
AfxMessageBox(soure); // s=0;
pDC->SelectStockObject(WHITE_PEN);
for(int i=Snake[0].len-1;i>0;i--) { }
//行走方向判断
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);
Snake[i].x=Snake[i-1].x; Snake[i].y=Snake[i-1].y;
武汉理工大学《可视化编程》课程设计说明书
pDC->Rectangle(Snake[0].x*20,Snake[0].y*20,(Snake[0].x+1)*20,(Snake[0].y+1)*20);
pDC->SelectObject(DrawBrush);
//判断吃豆的条件,撞到就吃
if(Snake[0].x*20==Food.x*20&&Snake[0].y*20==Food.y*20) { }
//如果食物被吃了 就生成 if(Food.isfood==1) {
srand((unsigned)time(NULL)); do {
for(int isfo=Snake[0].len-1;isfo>=0;isfo--) 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(Snake[0].x*20==Snake[isfo].x*20&&Snake[0].y*20==Snake[isfo].y*20)
while(Food.x*20<70||Food.y*20<70||Food.x*20>430||Food.y*20>430);
13
}
{ }
Food.x=rand()%; Food.y=rand()%;
武汉理工大学《可视化编程》课程设计说明书
pDC->Rectangle(Food.x*20,Food.y*20,(Food.x+1)*20,(Food.y+1)*20);
CView::OnTimer(nIDEvent); }
Food.isfood=0;
}
14
武汉理工大学《可视化编程》课程设计说明书
4.游戏运行的界面及相关的截图
15
武汉理工大学《可视化编程》课程设计说明书
5系统设计过程中自己所遇到的问题及相应的解决方法和解决过程。
(1)在设计重新开始时,贪吃蛇出现了重叠的现象,即出现了多条的贪吃蛇如下图
解决方法;之所以会出现重叠,可能是在再次调用onstart函数时界面没有被重新的清理干净,所以在调用开始函数前写了一段刷新界面的代码(即再次填充原本整个背景的颜色如下:
CDC *pDC=GetDC();
CBrush backBrush(RGB(100,100,100));
CBrush* pOldBrush = pDC->SelectObject(&backBrush); CRect rect;
pDC->GetClipBox(&rect);
pDC->PatBlt(rect.left,rect.top,rect.Width(),rect.Height(),PATCOPY); pDC->SelectObject(pOldBrush); pDC->Rectangle(19,19,501,501);
使得问题得到解决,先尝试自己能想到的的可能的原因.
16
武汉理工大学《可视化编程》课程设计说明书
(2)修改窗口初始的大小,一开始默认的窗口比例不协调,看上去不舒服,.于是查询资料(网络)得到修改的方法;
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {
if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE;
// TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs cs.cx = 100; cs.cy = 100;
return TRUE; }
(3)同时在写程序时一些细节亦要注意,
经检查仅仅只是大小写的问而已,有时还会浪费一定的时间.
(4)一开始我的贪吃蛇的移动速度是不变的,写完后我在想能不能随着游戏的进行而变的更难,于是我尝试了很多方法,调用各种函数,最后还是在看程序想起自己编程时的settimer,于是就查相关的东西,最后写出: 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);
17
武汉理工大学《可视化编程》课程设计说明书
6结束语
这次课程设计,我选择用MFC编写一个贪食蛇的程序。在编写程序之前,我只有很少的关于MFC的程序设计知识,因此,在刚开始,我遇到了很多困难。为此,我查阅了许多关于贪食蛇的资料,也在网上看了许多关于贪食蛇的算法。做好了准备之后,才开始写我的贪食蛇,并且加了很多附加功能。这次课程设计锻炼了我的动手能力。通过完成贪食蛇游戏的程序设计,累积了我的实际编程经验,也提高了我独立解决问题的能力,让我明白实践中的许许多多不同于理论的东西
18
武汉理工大学《可视化编程》课程设计说明书
7参考文献:
[1]. 欧阳志宏,MFC程序设计轻松入门,人民邮电出版社,北京,2009-4-1 [2]. 姚领田,MFC窗口程序设计,水利水电出版社,北京,2007-5-1
19
武汉理工大学《可视化编程》课程设计说明书
本科课程论文评分标准
班级 论文题目 评阅点 软件1202 学号 0121210680201 姓名 帅宗斌 基于MFC的贪吃蛇游戏设计与实现 评分标准(细则)正确实现本程序所需全部功能,算法设计正确合理且有一定创意 实现所需功能,算法正确 分值 40分 30分 15分 5分 0分 20分 15分 10分 5分 15分 10分 5分 0分 25分 20分 15分 5分 给分 功能及算法 基本实现所需功能 (40分) 有明显重大错误 无法实现程序功能 界面美观、合理,可操作性强 界面和操界面合理,可操作 作性 界面尚可,基本可操作 (20分) 可操作较差 程序可读性好、逻辑清晰,程序完整,可维护性好, 程序可读、程序可读、可维护 可维护性 (15分) 基本可读可维护 逻辑混乱、不可读 论文规范,行文流畅,层次清晰 论文书写基本规范,文理较通畅 论文质量 结构较合理,层次较清楚,基本符合要(25分) 求 结构混乱,文不对题目,或者有明显抄袭现象 总分
教师签名:
20
武汉理工大学《可视化编程》课程设计说明书
21
正在阅读:
可视化大作业07-09
2002-2020年中国石油消费结构变化和需求量展望09-06
教师招聘考试(教育学心理学试题大全)-选择判断大全(很多150多页)07-04
2015年7月护士入党转正申请书09-08
2018年中考适应性考试数学试题10-31
2012年电大学前儿童健康教育形考作业册答案(新)07-04
某钢栈桥设计计算书 - secret04-15
2016年水利施工员B卷题目和答案02-03
初中信息VB复习资料与例题 - 图文10-04
外文翻译 装备07-03
- 天大砼方案 - 图文
- 农业科技网络书屋能力提升_玉米错题选
- DNS习题
- 浅议检察官对罪犯谈话的技巧与效果
- 高考语文文言文翻译专题训练
- AB类学科竞赛目录(2015)
- 建筑面积计算新规定(2015最新)
- Revit2012初级工程师题集一
- 十三五项目米线可行性报告
- 2013体育学院党组织建设工作总结
- 2014Revit工程师题库
- 高中数学如何实施研究性学习
- 茶艺表演 中英互译
- 小学音乐湘文艺版 四年级下册 第十一课《(歌表演)脚印》优质课公
- 山西省农村合作经济承包合同管理条例
- 2015年镇江市中考化学一模试题参考答案及评分标准(定稿)
- 统计 题集
- 批评意见清单
- 8潞安集团蒲县黑龙关煤矿矿业公司2
- 鄂教版四年级语文上册复习精要(光谷四小)
- 可视化
- 作业
- 五病区护士分层管理及培训计划
- 2011版—义务教育—语文新课标
- 机械振动习题集与答案
- 2014年上海市第28届“大同杯”初中物理竞赛初赛试卷
- 【英语】河北省衡水中学2018届高三模拟试题(押题卷)(二)(word版
- 外文翻译-模具设计与制造
- 宁夏银川2018届高三4月高中教学质量检测理科综合试题(word) - 图
- 六年级数学知识点总结及各个例题
- 硫及其化合物练习题
- 中外合作经营合同范本(中英)
- 3、消防控制室值班记录()
- 2017年吉林省英语中考真题含答案 - 图文
- 2005年中考数学命题趋势
- 生物化学 酶习题及答案
- 2009年高三英语单项选择精选冲刺1000题(三)
- 2014年全国中学生物理竞赛(安徽)赛区获奖名单
- 2015年江苏省镇江市高考数学模拟试卷
- 注射模具设计和新型注射成型技术外文文献翻译、注塑模具类外文翻
- 中学食堂-创建放心食堂
- 2009年河南省选调生考试资料-省考笔试部分行测真题