韩尚颖吃豆子VC++课程设计结题书.docx
《韩尚颖吃豆子VC++课程设计结题书.docx》由会员分享,可在线阅读,更多相关《韩尚颖吃豆子VC++课程设计结题书.docx(25页珍藏版)》请在冰豆网上搜索。
![韩尚颖吃豆子VC++课程设计结题书.docx](https://file1.bdocx.com/fileroot1/2023-1/22/836fd6a2-16e4-4bf7-994b-8d5ed897de2c/836fd6a2-16e4-4bf7-994b-8d5ed897de2c1.gif)
韩尚颖吃豆子VC++课程设计结题书
课程设计报告
题目:
吃豆子游戏
分组:
学院:
数学与计算科学学院
专业:
信息与计算科学
学生姓名:
韩尚颖1200710218
小组成员:
郑总文1200710335
小组成员:
徐维爽1200710331
指导教师:
宁黎华
完成日期:
2014年12月26日
组员分工:
1.韩尚颖负责游戏架构,前期分析,函数编写及具体功能的实现;
2.徐维爽负责游戏调试工作,寻找BUG和反馈用户体验;
3.郑总文负责论文的撰写、思路整理;
目录
1、游戏功能描述...............................
2、课程设计分析.................................
3、程序运行结果................................
4、课程设计总结与心得体会......................
5、附录:
程序代码..............................
谷歌翻译
窗体顶端
RealizationofchildhoodclassicPCgame,usingMFCC++programminglanguagecombinedunderwin8.1environment,usingVS2010developmenttoolstocompletethePacmangamedesigncourse.
ThefirsttousetheMFCclassmemberfunctionEllipseCDC,RectangleandPie,drawacircle,beans,wall(rectangle)andthesector(mouth)intherangeof500*650;mapusingthemaparraytostore10*13,differentvaluesrepresentdifferentobjects,andcoordinatevaluesintoacorrespondingarraysubscript;
Afterthestartofthegame,whenyoupressthekeyboardarrowkeys,intheCViewderivedclass,thekeymessagesforWM_KEYDOWNmessagesaccordingly,switch-casestatementtodeterminethemessageinwhichthecorrespondingfunctionusingakey,andvariableassignmentDirection.
ThenWM_CREATEusingSetTimer()functiontosetoneevery300millisecondstosendoutamessageWM_TIMERtimer,thentheresponsefunctionGamedrawWM_TIMERmessagemouthdrawninthecurrentgraphicsandfunctionGamePaycompletearrayofcoordinatesthatchangeindexchanges,thespeedsettinginadvancemouthSetTimerfunction.
WhenthemouthaftereatingbeansbeanswithGamePlaydeletefunctiontoachieve,whenthebeansreachthemouthwherethecoordinatescorrespond;Zhangcombinednumberofadvancesbeforeparityisachieved,thedefinitionofaglobalvariablepanduan,torepresentthenumberofadvancesinthemouthbeforeAnarrayofvaluesassignedto0;attheendofthegame,GameOverfunctiongivesthegameendedtips.
窗体底端
有道
ImplementtheclassicPCgameasachild,theuseofMFCincombinationwithc++programminglanguageundertheenvironmentofwin8.1,VS2010developmenttoolstofinisheatbeansgamecurriculumdesign.
TheCDCofthefirsttouseMFCclassmemberfunctionoftheEllipse,RectangleandPie,withinthescopeofthe500*650drawingcircle,beans,wall(rectangular)andfan(mouth);Mapusing10*13maparraytostore,differentNumbersfordifferentobjects,andthecorrespondingcoordinatescanbeconvertedtoanarraysubscript;
Atthestartofthegame,accordingtothekeyboardupanddownorsokey,inthederivedclassesoftheCViewtomessagecorrespondingbuttonsWM_KEYDOWNmessageinthemessagecorrespondingfunctionusingtheswitch-acasestatementjudgmentwhichisakey,andthevariableDirectionassignment.
AndthentotheSetTimerusedinWM_CREATEmessagehandler()functionsetsthe1every300millisecondssendWM_TIMERmessagetimer,andtheninresponsetoaWM_TIMERmessagefunctionGamedrawdrawthemouthofthegraphandfunctionGamePaycompletecoordinatechangesthearraysubscript,mouthforwardspeedsettingintheSetTimerfunction.
Sharestepsforwardinthemouthofaparity,defineaglobalvariablepanduan,torepresentthestepsforward;WhenthemouthaftereatingthebeansbeansisdeletedinGamePlayfunctiontorealize,whenreachthebeansmouth,wherecoordinates,correspondingtothearrayvaluesassignedtozero;Attheendofthegame,GameOverfunctiongametipsaregiven.
一、游戏功能描述
(一)设计目的:
实现小时候经典PC游戏,基于C++,用MFC编程,完成“吃豆子”课程设计。
(二)设计要求:
1.用MFC编程,在客户区绘制一个嘴的图形、若干个圆豆子和墙壁;
2.按上下左右方向键时嘴可以按照对应的方向一张一合地前进;
3.当嘴吃掉一个豆子后,这个豆子就要消失,不能再出现;
4.当所有豆子都吃掉后,弹出对话框,提示用户“恭喜!
你吃完了全部豆子!
”
(三)编程提示:
1.嘴的图形是一个圆形与一个扇形交替显示,圆形表示嘴闭合的情况,扇形表示嘴张开的形状;绘制圆形和扇形的函数为CDC类的成员函数Ellipse和Pie;
2.豆子可以存储在一个数组中,数组的数据是每个豆子圆心的坐标;在OnDraw()函数中画出每个豆子和嘴的原始位置;
3.键盘上下左右方向键的虚拟键码分别为VK_UP、VK_DOWN、VK_LEFT、VK_RIGTH,在CView的派生类中对WM_KEYDOWN按键消息进行消息相应,在消息相应函数中用switch-case语句判断是哪一个键,然后用SetTimer()函数设置4个定时器;
嘴行进的动画用定时器来实现,SetTimer()函数可以每隔一定的时间发出WM_TIMER消息,那么就可以在响应WM_TIMER消息的函数中绘制当前嘴的图形,用switch-case语句,根据SetTimer()函数设置的不同ID的定时器来判断是哪一个方向,然后按照不同方向绘制开口方向不同的嘴的形状,并且要让嘴沿着这个方向一步一步前进,完成动画效果;嘴前进的速度在SetTimer函数中设置;
4.嘴的张合可以用前进步数的奇偶来实现,在CView派生类中定义一个成员变量用来表示前进步数,用判断语句,当前进步数为偶数时画嘴张开时的扇形,当前进步数为奇数时画嘴闭合时的圆形。
当嘴吃到豆子后豆子的删除是程序的难点,可以使用一个C++标准库的容器来存储豆子,实现豆子的动态删除,效率比用数组存储要高;
5.注意要包含头文件
#include
usingnamespacestd;
豆子都吃完后弹出对话框用MessageBox()函数。
3、课程设计分析
在本次课程设计中,我负责游戏架构、前期分析、函数的编写及具体功能的实现;吃豆子游戏是很经典的一款的游戏,在我很小的时候,就玩过它,因此我对这次课设有着不一样的感受:
当年都是在玩,而现在我确实在做,确实不一样啊!
首先,我开始自学MFC,从老师推荐的《深入浅出MFC》学起,慢慢的懂得了如何使用它;接着我就开始,对游戏进行前期分析和思路总结,总结出了开发思路,然后就开始具体编码,实现函数功能;
下面是我的具体思路:
1.嘴的图形是一个圆形与一个扇形交替显示,圆形表示嘴闭合的情况,扇形表示嘴张开的形状;绘制圆形和扇形的函数为CDC类的成员函数Ellipse和Pie;
2.豆子和墙壁数据信息存储在一个数组中,‘2’表示豆子、‘1’表示墙壁、‘0’代表可以走的通道;在Gamemap()函数中画出每个豆子和墙壁、一些提示信息;
3.键盘上下左右方向键的虚拟键码分别为VK_UP、VK_DOWN、VK_LEFT、VK_RIGTH,在CView的派生类中对WM_KEYDOWN按键消息进行消息相应,在消息相应函数中用switch-case语句判断是哪一个键,然后定义一个变量:
Direction,表示四个方向:
1代表上,2代表下,3代表左,4代表右,并在WM_KEYDOWN按键消息中进行赋值;
4.然后在WM_CREATE中用SetTimer()函数设置1个定时器;SetTimer()函数每隔300毫秒的时间发出WM_TIMER消息,那么就在响应WM_TIMER消息的函数Gamedraw()中绘制当前嘴的图形,在函数中用switch-case语句,根据Direction赋予的不同的值来判断是哪一个方向,然后按照不同方向绘制开口方向不同的嘴的形状(Gamedraw()函数来实现),并且要让嘴沿着这个方向一步一步前进,完成动画效果;嘴前进的速度在SetTimer函数中设置;
5.嘴的张合用前进步数的奇偶来实现,所以定义一个全局变量panduan,来表示前进步数,用判断语句,当前进步数为偶数时画嘴张开时的扇形,当前进步数为奇数时画嘴闭合时的圆形。
6.当嘴吃到豆子后豆子的删除是用GamePlay()来实现的,当嘴到达豆子所在坐标是,对应数组值赋为0;
7.游戏结束用GameOver()函数来判断,每次绘制时都做判断;满足条件给出提示窗口;
3、程序运行结果
初始游戏进入画面:
游戏画面:
4、课程设计总结与心得体会
最初进行设计的时候,啥也不懂,就看了看老师推荐的书,看懂后,我就着手游戏实现思路的设计,当然也参考了很多网上的思路,最终弄清了整个游戏的窗口过程。
而对于编程,是最庞大又棘手的一块,那是学得更多了,于是把课本和图书馆借来的参考书重新针对性的学了一次,遇到难处先是仔细的思考然后就去网上找答案。
编写代码的过程中是很痛苦的,我一遍又一遍的修改、重置并测试功能,最终实现了全部的功能、收获了快乐!
通过这次课程设计,我的编程能力有了很大的提高,虽然有时候自己没有思路,但是可以借鉴别人的设计的思路,理解的同时自己小试一下也可以编出来,所以凡事不能被困难吓倒,只要有开始,去尝试,就会有意想不到的收获!
五、附录:
程序代码..............................
1.主要函数
#pragmaonce
#include
#include"resource.h"
#include
#include
//#include
#include
usingnamespacestd;
voidpaintcircle(HDC&hdc,int&x,int&y);//暂停画圆
#definetimer1;
//响应键盘
#defineL_up1;
#defineL_down2;
#defineL_left3;
#defineL_right4;
#defineMax_x550;
#defineMin_x0;
#defineMax_y650;
#defineMin_y0;
//intDirection=4;//四个方向:
1代表上,2代表下,3代表左,4代表右
staticintmap[10][13]=
{//2代表空,1代表有墙壁;
{1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,1},//
{1,0,0,1,2,1,1,1,2,1,0,2,1},//3
{1,0,1,1,2,0,1,0,2,1,1,2,1},//3
{1,0,2,2,2,2,2,2,2,2,2,2,1},//10
{1,0,2,2,2,2,2,2,2,2,2,2,1},//10
{1,0,1,1,2,0,1,0,2,1,1,2,1},//3
{1,0,0,1,2,1,1,1,2,1,0,2,1},//3
{1,0,0,0,0,0,0,0,0,0,0,0,1},//
{1,1,1,1,1,1,1,1,1,1,1,1,1}
};
staticintscore=0;//成绩
//嘴的初始位置
staticintlx=75,ly=75,gx=475,gy=0;
longpanduan=0,m=0,n=0;
voidGamemap(HDChdc,intx1,inty1,intx2,inty2,intmap[][13],int&score)//地图初始化
{//charS[100];
for(inti=0;i<650;i=i+50)
{
for(intj=0;j<500;j=j+50)//550
{
if(map[j/50][i/50]==2)//map[1+(j-50)/50][1+(i-50)/50]==2
{
HBRUSHhb6;
hb6=CreateSolidBrush(RGB(255,255,0));//黄色画刷
SelectObject(hdc,hb6);
Ellipse(hdc,i+18,j+18,i+33,j+33);//画豆子
DeleteObject(hb6);
}
else
if(map[j/50][i/50]==1)//map[1+(j-50)/50][1+(i-50)/50]==1
{HBRUSHhb7;
hb7=CreateSolidBrush(RGB(255,255,255));//白色
SelectObject(hdc,hb7);
Rectangle(hdc,i,j,i+50,j+50);//画墙
DeleteObject(hb7);
}
}
}
HPENhps;
hps=CreatePen(PS_INSIDEFRAME,3,RGB(255,0,0));//红色
SelectObject(hdc,hps);
//Rectangle(hdc,680,0,900,530);填充颜色为白色
//画出框
MoveToEx(hdc,680,0,NULL);
LineTo(hdc,680,500);
LineTo(hdc,900,500);
LineTo(hdc,900,0);
LineTo(hdc,680,0);
DeleteObject(hps);
TCHARszBuffer[100];
TextOut(hdc,700,50,szBuffer,wsprintf(szBuffer,TEXT("PS:
'↑','↓','←','→'进行控制")));
TextOut(hdc,700,80,szBuffer,wsprintf(szBuffer,TEXT("PS:
按下ESC键,游戏暂停")));
TextOut(hdc,700,110,szBuffer,wsprintf(szBuffer,TEXT("PS:
按下ENTER键,游戏开始")));
TextOut(hdc,700,150,szBuffer,wsprintf(szBuffer,TEXT("游戏成绩:
%d"),score));
}
voidGamedraw(HDChdc,int&x,int&y,long&k,int&dr)//嘴的绘制
{HPENhp1;
hp1=CreatePen(PS_SOLID,2,RGB(128,0,128));
SelectObject(hdc,hp1);
switch(dr)
{
case0:
//y=y;
//paintcircle(hdc,x,y);//暂停画圆
Pie(hdc,x-20,y-20,x+20,y+20,x+10,y-10,x+10,y+10);
HPENhp5;
hp5=(HPEN)GetStockObject(WHITE_BRUSH);
SelectObject(hdc,hp5);
Ellipse(hdc,x-3,y-13,x-13,y-3);
DeleteObject(hp5);
break;
case1:
//嘴向上
if(k%2==0
{
if(y>=75)
{
if(map[(y-25)/50-1][(x-75)/50+1]==2||map[(y-25)/50-1][(x-75)/50+1]==0)
{
Pie(hdc,x-20,y-20,x+20,y+20,x-10,y-10,x+10,y-10);//向上的嘴
HPENhp2;
hp2=(HPEN)GetStockObject(WHITE_BRUSH);
SelectObject(hdc,hp2);
Ellipse(hdc,x-3,y+13,x-13,y+3);//眼睛
DeleteObject(hp2);
y=y-25;
}
else
{
Ellipse(hdc,x-20,y-20,x+20,y+20);//圆
HPENhp3;
hp3=(HPEN)GetStockObject(WHITE_BRUSH);
SelectObject(hdc,hp3);
Ellipse(hdc,x-3,y-13,x-13,y-3);//眼睛
DeleteObject(hp3);
}
}
break;
}
case2:
//嘴向下
if(k%2==0)
{
if(y<=475)
{
if(map[(y-25)/50+1][(x-75)/50+1]==2||map[(y-25)/50+1][(x-75)/50+1]==0)
{
Pie(hdc,x-20,y-20,x+20,y+20,x+10,y+10,x-10,y+10);
HPENhp3;
hp3=(HPEN)GetStockObject(WHITE_BRUSH);
SelectObject(hdc,hp3);
Ellipse(hdc,x-3,y-13,x-13,y-3);
DeleteObject(hp3);
y=y+25;
}
}
}
else
{
Ellipse(hdc,x-20,y-20,x+20,y+20);
HPENhp3;
hp3=(HPEN)GetStockObject(WHITE_BRUSH);
SelectObject(hdc,hp3);
Ellipse(hdc,x-3,y-13,x-13,y-3);
DeleteObject(hp3);
}
break;
case3:
//嘴向左
if(k%2==0)
{
if(x>=25)
{
if(map[(y-75)/50+1][(x-25)/50-1]==2||map[(y-75)/50+1][(x-25)/50-1]==0)
{
Pie(hdc,x-20,y