1、小游戏黄金矿工设计报告C语言课程设计报告机房名称 时 间 学 院 专业班级 姓 名 学 号 指导教师 小游戏“黄金矿工”设计报告一、课题简述通过一年的c语言程序设计的学习,我们仅仅掌握了c语言最基本的知识,还有很多内容是我们没有涉及的。所以通过c语言课程设计的学习实践活动和实际演练,使我们能够在实际操作中提高运用c语言解决问题的能力和程序设计的能力。得知本次课程设计任务是小游戏的设计,我们既兴奋又不安,兴奋是十分期待自己亲手做出的游戏,不安的是我们对funcode这个软件很不了解。幸好这次实践的过程,让我们从做平时简单的小程序过渡到现在的综合应用程序,将学过的c语言知识融入新接触到的funco
2、de操作中,不仅能巩固所学的知识,还能加强对新事物的接受及应用的本领,在不断的挑战问题中大大的提升自己,同时也是对c语言程序设计这门课的深入理解的过程。而什么样的小游戏是我们能实现而又不乏趣味呢?经过反复思考、讨论,我们小组设计了“黄金矿工”这样一个小游戏:玩家通过键盘的按键控制矿工抓取金块,将钩子碰触到的金块抓取过来。1.单机键盘上的空格键进入游戏,金块的总数是20,钻石的总数是2,炸弹的总数是3,石头的总数是4,大小位置是随机的。2.在没有抓取状态下,钩子左右摆动,此时矿工的是静止的。当钩子摆动到一定角度,玩家可以单击键盘上的上下左右键中的下方向键控制矿工伸出长钩,抓取金子等抓到一个金子金
3、子加20分,钻石加50分且拉回速度变快,石头加5分且拉回速度变慢,抓到炸弹不加分且炸弹会爆炸。此时矿工是向下摇动转轴。获取到金子等往回拉后,矿工是不断转动转轴,直到金子拉动到钩子初始处,矿工恢复静止,钩子继续左右摇摆,直到玩家再次单击向下方向键。如果钩子没有碰触到金子,而是碰触到左右和下的边界,则钩子保持原来的速度往回收。3加入计分和计时系统。60秒倒计时时间内抓取的金子越多得分越高。接下来,我们开始思索,要如何实现这些功能,如何将所有功能连接在一起。于是我们先用funcode 熟悉小游戏制作的操作,认真按照老师给我们的实验指南进行练习,反复阅读其内容,并用vc6.0进行对各种小游戏源代码的简
4、单探索。当然,由于技术原因,我们想要设计的软件只是局限于对游戏功能的实现,而实际中正式的欢迎界面,游戏说明等优美的图片,我们并没有进行设计,包括刚开始拟定的金子运动、玩家升级等也取消了。然而,这并不影响我们制作小游戏的热情,而且我们根据其具体的功能进行了组员之间的分工合作。二、功能需求.程序大体流程图:图1. 游戏模块图.部分函数介绍本实验用到的APIextern float dGetScreenLeft(); /*获取世界边界之左边X坐标*/extern float dGetScreenTop(); /*获取世界边界之上边Y坐标*/extern float dGetScreenRight()
5、; /*获取世界边界之右边X坐标*/extern float dGetScreenBottom(); /*获取世界边界之下边Y坐标*/extern void dSetSpriteWidth( const char *szName, const float fWidth ); /*设置精灵外形宽度*/extern float dGetSpriteWidth( const char *szName ); /*dGetSpriteWidth:获取精灵外形宽度*/extern int dRandomRange( const int iMin, const int iMax ); /*获取一个位于参数1
6、到参数2之间的随机数*/extern void dSetSpriteRotation( const char *szName, const float fRot ); /*设置精灵的旋转角度*/extern void dSetSpriteLinearVelocityPolar( const char *szName, const float fSpeed, const float fPolar ); /*设置精灵移动速度*/extern int dAnimateSpritePlayAnimation( const char *szName, const char *szAnim, const
7、int iRestore ); /*精灵播放动画*/extern float dGetSpriteLinkPointPosX( const char *szName, const int iId ); /*获取精灵链接点X坐标。链接点是依附于精灵的一个坐标点*/extern float dGetSpriteLinkPointPosY( const char *szName, const int iId ); / *获取精灵链接点Y坐标。链接点是依附于精灵的一个坐标点*/extern void dDrawLine( const float fStartX, const float fStartY
8、, const float fEndX, const float fEndY, const float fLineWidth, const int iLayer, const int iRed, const int iGreen, const int iBlue, const int iAlpha );/* dDrawLine:两点之间画线*/Funcode接口介绍extern void dOnSpriteColSprite( const char *szSrcName, const char *szTarName ); /*精灵与精灵碰撞后将被调用的函数*/extern int dSprit
9、eMountToSpriteLinkPoint( const char *szSrcName, const char *szDstName, const int iPointId ); /*将一个精灵绑定到另一个精灵上,绑定位置为指定* 的链接点,暂时的成为另一个精灵的一部分,跟随其运动等*/extern float dGetSpritePositionX( const char *szName ); /*获取精灵X坐标*/extern float dGetSpritePositionY( const char *szName ); /*获取精灵Y坐标*/funcode函数(1)/*主函数入口
10、*/int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) /*初始化游戏引擎*/ if( !dInitGameEngine( hInstance, lpCmdLine ) ) return 0; /*在此使用API更改窗口标题*/ dSetWindowTitle(Lesson); /*引擎主循环,处理屏幕图像刷新等工作*/ while( dEngineMainLoop() ) /*获取两次调用之间的时间差,传递给游戏逻辑处理*/ float fTimeDel
11、ta = dGetTimeDelta(); /*执行游戏主循环*/ GameMainLoop( fTimeDelta ); ; /*关闭游戏引擎*/ dShutdownGameEngine(); return 0;(2)/*引擎捕捉键盘按下消息后,将调用到本函数*/void dOnKeyDown( const int iKey, const int iAltPress, const int iShiftPress, const int iCtrlPress )(3)/*引擎捕捉键盘弹起消息后,将调用到本函数*/void dOnKeyUp( const int iKey )(4)/*引擎捕捉到精
12、灵与精灵碰撞之后,调用此函数*/void dOnSpriteColSprite( const char *szSrcName, const char *szTarName )(5)/* 引擎捕捉到精灵与世界边界碰撞之后,调用此函数. */void dOnSpriteColWorldLimit( const char *szName, const int iColSide )其它函数(1) 出现金块、钻石、炸弹、石头,并增加其碰撞属性void Appear();(2) 画出链接钩子的线void line();(3) 重置游戏初始状态void begin();(4) 游戏结束后,清楚剩余金块、钻石
13、、炸弹、石头void Disappear();三、总体设计.下图为主函数及各级嵌套函数的流程图,部分省略。图 2.主函数流程图 、操作使用说明玩家通过键盘的按键控制矿工抓取金块,将钩子碰触到的金块抓取过来。1.单机键盘上的空格键进入游戏,金块的总数是20,钻石的总数是2,炸弹的总数是3,石头的总数是4,大小位置是随机的。2.在没有抓取状态下,钩子左右摆动,此时矿工的是静止的。当钩子摆动到一定角度,玩家可以单击键盘上的上下左右键中的下方向键控制矿工伸出长钩,抓取金子等抓到一个金子金子加20分,钻石加50分且拉回速度变慢,石头加5分且拉回速度变慢,抓到炸弹不加分且炸弹会爆炸。此时矿工是向下摇动转轴
14、。获取到金子等往回拉后,矿工是不断转动转轴,知道金子拉动到钩子初始处,矿工恢复静止,钩子继续左右摇摆,直到玩家再次单击向下方向键。如果钩子没有碰触到金子,而是碰触到左右和下的边界,则钩子保持原来的速度往回收。3存在计分和计时系统。60秒倒计时时间内抓取的金子越多得分越高。四、详细设计1.变量定义部分变量定义是一个完整的程序中不可或缺的内容。在本次游戏编写中,我们根据程序需要,也不可缺少的设置了许多变量,下面我们简单介绍一下全局变量和主函数之中的部分变量:(1)定义全局变量/初始化物品数量/int g_iGoldCount=20; /金子数量int g_iBombCount=3; /炸弹数量in
15、t g_iDiaCount =2; /钻石数量int g_iStoneCount=4; /石头数量/初始化计时计分/float g_iGameScore = 0; /初始化得分float g_fGameTime = 60.f; /计时,设定初始计时 bool g_bStart = 0; /计时,定义开始计时的状态 /设置钩子自由旋转的定义/float g_fHookRotation = 0.f;int g_iGameState = 0; /定义游戏初始状态float g_fEmptyHookSpeed = 15.f;/定义钩子的速度/设置钩子抓精灵的定义/float g_fHookStartP
16、osX; /存储钩子的初始X位置float g_fHookStartPosY; /存储钩子的初始Y位置char szGotGoldName20 ; /当前抓到金子的名称 char szGotBombName3 ; /当前抓到炸弹的名称 char szGotDiaName2 ; /当前抓钻石的名称 char szGotStoneName2 ; /当前抓石头的名称 (2)主函数之中的局部变量/设置钩子摇摆/const float fRotateSpeed = 45.f; / 摇摆速度,单位 度/秒int iHookRotToLeft = 1; /钩子摆动的方向:1 ;0 /设置钩子抓金子/g_fH
17、ookStartPosX = dGetSpritePositionX(goldhook); /获取钩子的初始X坐标g_fHookStartPosY = dGetSpritePositionY(goldhook); /获取钩子的初始Y坐标 dSetSpriteWorldLimitMode(goldhook, WORLD_LIMIT_NULL); /初始化钩子与世界边界碰撞的模式为NULL2.主函数模块WinMain()函数模块实现初始化游戏引擎,执行引擎主循环,处理屏幕图像刷新等工作,包括获取两次调用之间的时间差,传递给游戏逻辑处理等。我们通过主函数实现设置初始化游戏状态、钩子摇摆、钩子抓金子、
18、炸弹、石头、钻石等内容。在本游戏中我们设计了5种游戏状态,分别为g_iGameState等于0、1、2、3、4。其中,状态0为游戏初始状态,状态1和2为游戏运行状态,状态3为游戏结束状态,状态4为过渡到初始状态时运用的一个调整状态。步骤详细介绍:第一步,游戏初始化,显示初始界面需要的精灵if( !dInitGameEngine( hInstance, lpCmdLine ) ) / 初始化游戏引擎return 0;dSetWindowTitle(黄金矿工); /设置窗口名字dSetWindowTitle(Lesson);begin(); /调用函数,初始游戏,显示初始精灵第二步,游戏是一直进行
19、的,因此游戏的重点是在while循环中。While循环中使用“float fTimeDelta = dGetTimeDelta(); ”获取两次调用之间的时间差,传递给游戏逻辑处理,达到不断循环。下面介绍一下此循环中使用的语句。游戏倒计时,倒计时结束后实现状态跳转到结束状态/倒计时/if(g_bStart) /判断游戏是否开始 g_fGameTime -= fTimeDelta; /设置游戏时间if(g_fGameTime 0) /判断游戏是否结束 dSetTextValue(Time, (int)(g_fGameTime); /设置精灵时间显示数值 if(g_fGameTime= 180.f
20、 ) g_fHookRotation = 180.f; iHookRotToLeft = 0; else g_fHookRotation -= fThisRotate; if( g_fHookRotation = 0.f ) g_fHookRotation = 0.f; iHookRotToLeft = 1; dSetSpriteRotation(goldhook,g_fHookRotation); /设置钩子的旋转角度钩子抓金子,钩子抓金子为状态2,不需要钩子自由摆动/钩子抓金子/if(g_iGameState = 2)float fSpeedX = dGetSpriteLinearVelo
21、cityX(goldhook); /获取钩子X方向的速度float fSpeedY = dGetSpriteLinearVelocityY(goldhook); /获取钩子Y方向的速度if( fSpeedX -0.00001f & fSpeedY -0.00001f ) /当速度接近为0时,即可判定其已到达初始点dSpriteDismount(szGotGoldName); /解除金块与钩子的锚定dDeleteSprite(szGotGoldName); /删除获取的金块g_iGameState = 1; /回拉结束,设定状态为1,钩子摆动dAnimateSpritePlayAnimation
22、(GoldMan,GolderManAnimation2, 0 ); /播放矿工的动画,即准备拉金子的动画 游戏状态3,显示游戏时间停止if(g_iGameState=3) dSetSpriteVisible( over,1); /若结束显示Time over 游戏状态为4时,实现过渡到游戏状态为1if(g_iGameState = 4)begin(); /调用重置游戏初始化所需精灵g_iGameState = 0 ; /实现游戏状态跳转到初始状态0 g_iGameScore = 0; / 重置游戏分数为0g_fGameTime = 60.f; / 重置倒计时时间为60g_bStart=0;
23、/ 停止先前状态中的倒计时 dSetTextValue(score,(int)0); / 重置游戏分数为0dSetTextValue(time,(int)60); / 重置倒计时时间为60dSetSpriteVisible(over,0); /隐藏TimeoverdSetSpriteVisible(score,1); /出现计分装置 dSetSpriteVisible(time,1); /出现计时装置由于钩子的连线也是一直在游戏运行时存在的,故也应放入此循环中/设置与钩子链接的线/line(); /调用画线的函数第四步,游戏结束,关闭游戏引擎,主函数完成dShutdownGameEngine(
24、); / 关闭游戏引擎return 0;3.有关系统给定的函数的设置(1)dOnKeyDown()函数的详述,对于系统内我们主要使用此函数。我们使用空格键控制游戏开始,方向下键控制钩子下落,回车键实现从结束状态到开始状态的过渡。/按下空格游戏开始/g_fEmptyHookSpeed=15.f; /为之后调整绳子速度做准备if(iKey=KEY_SPACE & g_iGameState = 0) /按下空格键且游戏状态为0时 g_iGameState = 1; /游戏状态变为1 dSetSpriteVisible( GameBegin,0); /消失游戏开始 dSetSpriteVisible(
25、 HJKG,0); /消失“黄金矿工” Appear(); /调用函数出现金子等东西 g_bStart=1; /计时开始的条件/按下下键钩子下降/if( iKey=KEY_DOWN & g_iGameState = 1) /按下下键且游戏状态为1时 g_iGameState = 2; /置游戏状态为2,可用于控制钩子是否摆动 dSetSpriteLinearVelocityPolar(goldhook,g_fEmptyHookSpeed, g_fHookRotation); /以当前朝向给钩子一个向前的速度 dAnimateSpritePlayAnimation(GoldMan,GolderManAnimation1, 0); / 播放挖金者的动作(一个胳膊往下压的动作) ,0 表示播放一次,这里胳膊下压就是一次/按下回车键跳转到初始状态/if( iKey=KEY_ENTER & g_iGameState = 3 ) /按下回车键且游戏状态为3 DisAppear(); /调用函数消除金子等东西 g_iGameState = 4; /游戏状态变为4(
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1