中南大学C++程序设计报告.docx
- 文档编号:29839825
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:13
- 大小:19.27KB
中南大学C++程序设计报告.docx
《中南大学C++程序设计报告.docx》由会员分享,可在线阅读,更多相关《中南大学C++程序设计报告.docx(13页珍藏版)》请在冰豆网上搜索。
中南大学C++程序设计报告
中南大学
本科生课程设计(实践)任务书、设计报告
(C++程序设计)
题目
贪吃蛇
学生姓名
指导教师
学院
专业班级
学生学号
计算机基础教学实验中心
2013年7月1日
贪吃蛇
内容:
1CView类中的消息响应
2控件的消息响应
3基于CView类内的具体游戏实现
4数组
5游戏图形的实现用CDC类实现。
关键字:
CViewShakeMFC函数
1.贪吃蛇开发设计思想
1定义蛇类和食物类,初始化贪吃蛇各项成员变量,包括图像的出现在屏幕的初始位置,长度,以及蛇的行走方向。
食物类的定义包括出现的初始位置,以及食物是否被吃掉的判断。
2用数组初始化长度为3的贪吃蛇,并且默认食物未出现
3在CView类上运用MFC提供的Windows消息中WM_TIMER消息,运用OnTimer()函数让系统提供一个时钟节拍,更新游戏
4具体游戏实现,包括蛇撞到自己和围墙都将使游戏结束,判断吃豆等,其中还包括根据蛇的长度来进行游戏难度的改变。
5具体键盘游戏操作运用到Windows消息响应中的WM_KEYDOWN,用OnKeyDown()来响应玩家的实际操作。
2.系统功能及系统设计介绍
详细设计:
第一部分
首先在已有工程下的“ClassView”中右键CView类添加以下Windows信息
1WM_KEYDOWN
2WM_RBUTTONDOWN
3WM_TIMER
再右键CView类选择“ADDVirtualFunciton”选OnInitialUpdate()
OnInitialUpdate()的功能如下:
视图窗口完全建立后第一个被框架调用的函数。
框架在第一次调用OnDraw前会调用OnInitialUpdate,因此OnInitialUpdate是设置滚动视图的逻辑尺寸和映射模式的最合适的地方。
时间上,两者先后顺序不同,构造函数生成本类的对象,但没有产生窗口,OnCreate后窗口产生,然后才是视图的OnInitialUpDate,一般在这里对视图的显示做初始化。
简单点,就是ONCREATE只是产生VIEW的基本结构和变量而在OnInitialUpDate()中,主要初始化视图中控件等。
对各个变量进行初始化操作
所以我们要用这个函数来进行贪吃蛇的初始化工作。
再者还要添加一个成员函数oninit()进行贪吃蛇外观的初始化
控件的设计
再者是设计游戏的一些控件来控制“游戏开始”“游戏结束”和“游戏暂停”。
我们可以点击“工作空间”的“ResourceView”进行控件的具体设计,这里我们在Menu文件夹中把“IDR_MAINFRAME”中默认的控件全部删除
右键其中的标题栏,点击属性,会得到一个菜单栏标题,我们分别建立1个菜单栏标题。
这里我们分别建“游戏”。
点击并且在已有控件中的列表中点击属性,进行“菜单项目属性”的设置。
我们本别建立的属性“标明”与对应的ID有
游戏开始IDM_START
游戏暂停IDM_PAUSE
游戏继续IDM_CONTINUE
游戏退出IDM_EXIT
此处控件的设计是“可见即可得”的控件操作
成功设置ID之后我们分别右键
各项属性进行消息响应处理函数的生成
第二部分
具体实现游戏、
Step1
首先我们在文件开头处分别定义蛇和食物的全局变量
structSnake
{
intx,y;
intlen;
intdirect;
}Snake[50];
structFood
{
intx;
inty;
intisfood;
}Food;
再者
voidCSNAKEView:
:
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:
Addyourspecializedcodehereand/orcallthebaseclass
}
代码说明:
初始化贪吃蛇起初有3个节点,长度为3,起始坐标;
食物默认为1无0有当然我更加喜欢0无1有
Step2对OnKeyDown()具体添加代码
voidCSNAKEView:
:
OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
switch(nChar)
{
caseVK_UP:
if(Snake[0].direct!
=2)Snake[0].direct=1;break;
caseVK_DOWN:
if(Snake[0].direct!
=1)Snake[0].direct=2;break;
caseVK_LEFT:
if(Snake[0].direct!
=4)Snake[0].direct=3;break;
caseVK_RIGHT:
if(Snake[0].direct!
=3)Snake[0].direct=4;break;}
CView:
:
OnKeyDown(nChar,nRepCnt,nFlags);
CView:
:
OnKeyDown(nChar,nRepCnt,nFlags);
}
代码说明:
Snake[0]代表的是蛇头,我们对蛇头的方向Snake[0].direct进行判断。
caseVK_UP:
if(Snake[0].direct!
=2)Snake[0].direct=1;break;
意思就是当Snake[0].direct的方向此时并不等于“下”的时候,才能做出“上”的操作动作,否则则忽略用户“向上”的操作按键效果
Step3对OnRButtonDown()具体添加代码
voidCSNAKEView:
:
OnRButtonDown(UINTnFlags,CPointpoint)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
CStringstr;
str.Format("%d,%d",point.x,point.y);
AfxMessageBox(str);
CView:
:
OnRButtonDown(nFlags,point);
CView:
:
OnRButtonDown(nFlags,point);
CView:
:
OnRButtonDown(nFlags,point);
}
这个函数功能是:
用鼠标右键屏幕,就会马上显示当前位置的坐标信息。
Step4
voidCSNAKEView:
:
oninit()
{
CDC*pDC=GetDC();
CBrushDrawBrush=(RGB(100,100,100));
CBrush*Drawbrush=pDC->SelectObject(&DrawBrush);
for(inti=0;i<=snake[0].l-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个节点画出来。
Step5控件添加代码
voidCSNAKEView:
:
OnStart()
{
//TODO:
Addyourcommandhandlercodehere
SetTimer(1,3000,NULL);
AfxMessageBox("3秒后开始游戏!
");
}
voidCSNAKEView:
:
OnPause()
{
//TODO:
Addyourcommandhandlercodehere
KillTimer
(1);
AfxMessageBox("暂停游戏...");
}
voidCSNAKEView:
:
OnExit()
{
//TODO:
Addyourcommandhandlercodehere
AfxMessageBox("退出游戏...");
exit0;
}
voidCSNAKEView:
:
OnContinue()
{
//TODO:
Addyourcommandhandlercodehere
SetTimer(1,10,NULL);
}
Step6对OnDraw()的添加代码
OnDraw()函数众所周知视图类中的输出.视图类的输出基本上都是在视图类的OnDraw函数中处理的,系统会准备好入参,然后调用OnDraw函数
voidCSNAKEView:
:
OnDraw(CDC*pDC)
{
CSNAKEDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
CBrushbackBrush(RGB(100,100,0));
CBrush*pOldBrush=pDC->SelectObject(&backBrush);
CRectrect;
pDC->GetClipBox(&rect);
pDC->PatBlt(rect.left,rect.top,rect.Width(),rect.Height(),PATCOPY);
pDC->SelectObject(pOldBrush);
pDC->Rectangle(19,19,501,501);
oninit();
}
Step7对OnTime()的添加代码
voidCSNAKEView:
:
OnTimer(UINTnIDEvent)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
CDC*pDC=GetDC();
CStringsoure;
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>=462)
{
KillTimer
(1);
AfxMessageBox(soure);
//s=0;
}
//蛇身相撞判断
if(Snake[0].len>3)
for(intsn=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[Snake[0].len-1].x+1)*20,(Snake[Snake[0].len-1].y+1)*20);
for(inti=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);
CBrushDrawBrush=(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)*20);
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(intisfo=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()%;
Food.y=rand()%;
}
}
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);
}
3.系统开发的体会
本次程序设计所用时间较长,工作量很饱满,而且所用的知识很多,但是我们平常在课堂上所学的知识很有限,这就需要我大量的自学书本和课外的其他书籍上的知识。
为了让程序容易使人看懂,我用到的知识点不是非常多,大都是一些基本知识。
毕竟很多知识没有学,能用基本知识就尽量用的基本知识。
C++设计实践是对之前学过的知识的加深和巩固,之前学得较浅,实践的机会不多,这次实践让我对C++程序有了更加深入的了解,心理也由原来的不喜欢到喜欢,感觉很有意思也很有用,可也设计一些有用的或者是自己喜欢的程序。
最令我收益的是写程序的过程和调试修改的过程,因为没有把知识学习全面,因此编写起来是有难度的,在预先想好程序结构后,就开始看书,一个函数一个函数来编写,不懂的地方就上网搜或是请教一下同学和老师,当终于把程序写出来的时候,内心里又有一种说不出来的激动,我感觉这很符合大学的教育观念,是对个人自主学习能力的一个锻炼。
在接下来就是调试,虽然出了很多的错误,虽然自己也被搞的焦头烂额,但我还是很兴奋,我感觉自己就像是个侦探,一点点找线索,找到问题,再解决,每次成功都带给自己一次激动。
现在程序终于能较好的运行出来了,当然,还存在一些瑕疵,但通过这近两周的实践学习,我收获的不仅仅是这一个程序,我的自学能力,以及寻找问题解决问题的能力也得到了很好的锻炼!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中南 大学 C+ 程序设计 报告