韩尚颖吃豆子VC++课程设计结题书.docx

上传人:b****6 文档编号:7760328 上传时间:2023-01-26 格式:DOCX 页数:25 大小:76.40KB
下载 相关 举报
韩尚颖吃豆子VC++课程设计结题书.docx_第1页
第1页 / 共25页
韩尚颖吃豆子VC++课程设计结题书.docx_第2页
第2页 / 共25页
韩尚颖吃豆子VC++课程设计结题书.docx_第3页
第3页 / 共25页
韩尚颖吃豆子VC++课程设计结题书.docx_第4页
第4页 / 共25页
韩尚颖吃豆子VC++课程设计结题书.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

韩尚颖吃豆子VC++课程设计结题书.docx

《韩尚颖吃豆子VC++课程设计结题书.docx》由会员分享,可在线阅读,更多相关《韩尚颖吃豆子VC++课程设计结题书.docx(25页珍藏版)》请在冰豆网上搜索。

韩尚颖吃豆子VC++课程设计结题书.docx

韩尚颖吃豆子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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1