1、黄金矿工实验报告可编辑修改word版中国石油大学(华东)程序设计实训报告“黄金矿工”实验报告游戏截图图一:开始游戏图二:按下空格键开始游戏,出现金块,钩子转动图三:按下键,钩子停止转动,开始下放,抓取金块图四:抓完金块后返回初始界面功能描述1、 游戏运行,初始界面出现“空格开始”的提示。2、 玩家按下空格键,开始游戏。3、 游戏开始后,界面随机出现 20 个大小不同的金子,并且钩子开始转动。4、 按下键,钩子停止转动,下放,抓取金子。5、 抓到金子后,返回到初始位置,被抓到的金子消失。6、 用户继续按下键,继续抓取金子,直到金子被抓取完,这样一局游戏完成。7、 一局游戏完成后,屏幕重新出现“空
2、格开始”的标志,用户按下空格可以继续游戏,如此往复。流程图:数据结构:1、g_fGoldBornMinX 金子左边界2、 g_fGoldBornMaxX 金子右边界3、 g_fGoldBornMinY 金子上边界4、 g_fGoldBornMaxY 金子下边界5、g_iGoldCount 屏幕中金子数目6、 g_iGameState 设置游戏状态7、szGotGoldName20 当前抓到金子的名称8、g_fHookRotation 钩子的转动的角速度9、 g_fEmptyHookSpeed 钩子的下放的初始速度10、g_fHookStartPosX 存储钩子的初始 X 位置11、g_fHoo
3、kStartPosY 存储钩子的初始 Y 位置算法描述:游戏状态 g_iGameState 分为三种状态 0,1,2 ,其中 0 表示游戏结束状态,1 表示游戏初始化,2 则表示游戏运行状态;1 1 的转换为“空格开始”;2 2 的转换自然发生,即游戏初始化函数后会自动将游戏状态从 1 置为 2;3表示游戏运行状态,在该状态,按下键可以抓取金子;2 0 的转换为当金子全被抓完后会自动将游戏状态从 2 置为 0;金子精灵的初始化:1、创建金子精灵的对象;2、生成大小为 4 的小金块 10 个、 大小为 6 的中金块 6 个、大小为 8 的大金块 4 个,并保存 tmpName 数组中,随机获取每
4、个金子的坐标;3、隐藏“空格开始”精灵;4、设置屏幕中剩下的金子数目为 20,每当被抓走的一块金子消失后屏幕中剩下的金子数目减 1;5、当屏幕中剩下的金子数目为 0 时,一局游戏结束,返回初始界面,“空格开始”精灵出现;6、重新进行金子精灵的初始化;dOnKeyDown(const intiKey, const boolbAltPress, const boolbShiftPress, const boolbCtrlPress ) 游戏开始和控制按钮:1、游戏还未开始,即游戏状态为 0,如果空格按被下,则将游戏状态改为 1,此时对程序的数据进行初始化,“空格开始”精灵消失,金子出现,钩子转动;
5、2、游戏状态为 0 时并按下空格键后, 如果按下键,钩子开始下放抓金子,当抓到金子后,游戏的状态变为 2 游戏正式开始运行;3、游戏状态为 2 时,钩子抓住金子后,按照金子的大小设置金子的速度,金子越大,回拉速度越小;4、当钩子和金子回到初始位置后,被抓的金子消失;源代码:在Main.cpp文件中/ / #include CommonAPI.h#include stdio.h #include string.hvoid DrawHookLine(); int g_fGoldBornMinX = 0; int g_fGoldBornMaxX = 0; int g_fGoldBornMinY =
6、0; int g_fGoldBornMaxY = 0; int g_iGoldCount = 20;int g_iGameState=2; int flag=1;int flagnum=0;char szGotGoldName20 ; /当前抓到金子的名称float g_fHookRotation = 0.f;float g_fEmptyHookSpeed =35.f; float fTimeDelta;float g_fHookStartPosX; /存储钩子的初始 X 位置float g_fHookStartPosY; /存储钩子的初始 Y 位置/ 主函数入口/ int PASCAL Wi
7、nMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow)/ 初始化游戏引擎if( !dInitGameEngine( hInstance, lpCmdLine ) ) return 0;/ 游戏初始化代码dSetWindowTitle(黄金矿工);g_fGoldBornMinX = dGetScreenLeft() + 5; /金子左边界g_fGoldBornMaxX = dGetScreenRight() - 5; /金子右边界g_fGoldBornMinY = dGetScreenTop
8、() + 20; /金子上边界g_fGoldBornMaxY = dGetScreenBottom() - 5;/金子下边界g_fHookStartPosX = dGetSpritePositionX(GoldHook); /获取钩子的初始 X 坐标g_fHookStartPosY = dGetSpritePositionY(GoldHook); /获取钩子的初始 Y 坐标dSetSpriteCollisionSend(goldHook, 1);dSetSpriteCollisionReceive(goldTemplate, 1);const float fRotateSpeed = 45.f
9、; / 摇摆速度,单位 度/秒int iHookRotToLeft = 1; /钩子摆动的方向:1 ;0 float fTimeDelta = dGetTimeDelta();/ 引擎主循环,处理屏幕图像刷新等工作while( dEngineMainLoop() )/ 获取两次调用之间的时间差,传递给游戏逻辑处理float fTimeDelta = dGetTimeDelta(); DrawHookLine();/ 执行游戏主循环if(g_iGameState = 0)float fThisRotate = fRotateSpeed * fTimeDelta; if( iHookRotToLe
10、ft )g_fHookRotation += fThisRotate; if( g_fHookRotation = 180.f )elseg_fHookRotation = 180.f; iHookRotToLeft = 0;g_fHookRotation -= fThisRotate; if( g_fHookRotation = 0.f )g_fHookRotation = 0.f; iHookRotToLeft = 1;dSetSpriteRotation(GoldHook,g_fHookRotation);else if(g_iGameState = 1)dAnimateSpritePl
11、ayAnimation(goldMan,GolderManAnimation3, 1 ); /播放拉金块的动作/获取钩子 X 方向的速度float fSpeedX = dGetSpriteLinearVelocityX(GoldHook);/获取钩子 Y 方向的速度float fSpeedY = dGetSpriteLinearVelocityY(GoldHook);/当速度接近为 0 时,即可判定其已到达初始点if( fSpeedX -0.00001f & fSpeedY -0.00001f )/解除金块与钩子的锚定dSpriteDismount(szGotGoldName);/删除获取的金
12、块dDeleteSprite(szGotGoldName);/回拉结束,设定状态为 0g_iGameState = 0;/播放矿工的动画,即准备拉金子的动画if(flagnum)g_iGoldCount-;/ 播 放 挖 金 者 的 动 作 ( 恢 复 初 始 守 候 动 作 ) dAnimateSpritePlayAnimation(goldMan, GolderManAnimation2, 1); if(g_iGoldCount=0)g_iGameState = 0; dSetSpriteVisible(GameBegin,1); g_iGoldCount = 20;flag=1;dAni
13、mateSpritePlayAnimation(goldMan, GolderManAnimation2, 1);/ 关闭游戏引擎dShutdownGameEngine(); return 0;/=/ 引擎捕捉鼠标移动消息后,将调用到本函数void dOnMouseMove( const float fMouseX, const float fMouseY )/ 可以在此添加游戏需要的响应函数/=/ 引擎捕捉鼠标点击消息后,将调用到本函数void dOnMouseClick( const int iMouseType, const float fMouseX, const float fMou
14、seY )/ 可以在此添加游戏需要的响应函数/=/ 引擎捕捉键盘按下消息后,将调用到本函数/ iAltPress iShiftPress iCtrlPress 分别为判断 Shift,Alt,Ctrl 当前是否也处于按下状态。比如可以判断 Ctrl+E 组合键void dOnKeyDown( const int iKey, const int iAltPress, const int iShiftPress, const int iCtrlPress )/ 可以在此添加游戏需要的响应函数if(iKey=KEY_SPACE)g_iGameState = 1; / 初始化之后,将游戏状态设置为进行
15、中dSetSpriteVisible(GameBegin,0);/生成金子int iLoop = 0; /循环变量控制int iSize = 4, iPosX = 0, iPosY = 0; /iSize 表示金块大小的变量if(flag)for( iLoop = 0; iLoop g_iGoldCount; iLoop+ )if( iLoop = 10 & iLoop 16 )/生成 6 个中金块,大小为 6iSize = 6;else/生成 4 个大金块,大小为 8名字的宽度iSize = 8;/初始化金子精灵实例char* tmpName;tmpName=dMakeSpriteName(
16、GoldBlock,iLoop); /生 成 金 块dCloneSprite(goldTemplate,tmpName); dSetSpriteWidth(tmpName,(float)iSize); /设 置 金 块的高度g_fGoldBornMaxX); g_fGoldBornMaxY);dSetSpriteHeight(tmpName,(float)iSize); /设 置 金 块/设置金子精灵位置iPosX = dRandomRange(g_fGoldBornMinX, iPosY = dRandomRange(g_fGoldBornMinY,dSetSpritePosition(tm
17、pName,(float)iPosX, (float)iPosY); flag=0;if(g_iGoldCount=0)flag=1; g_iGoldCount=20;if( iKey = KEY_DOWN &g_iGameState =0 ) /按下并且游戏状态为 0g_iGameState = 2; /置游戏状态为 2,可用于控制钩子是否摆动/ 以当前朝向给钩子一个向前的速度dSetSpriteLinearVelocityPolar(GoldHook,g_fEmptyHookSpeed,g_fHookRotation);/ 播放挖金者的动作(一个胳膊往下压的动作) dAnimateSpri
18、tePlayAnimation(goldMan,GolderManAnimation1, 0);/0 表示播放一次,这里胳膊往下压就是一次/=/ 引擎捕捉键盘弹起消息后,将调用到本函数void dOnKeyUp( const int iKey )/ 可以在此添加游戏需要的响应函数/=/ 引擎捕捉到精灵与精灵碰撞之后,调用此函数void dOnSpriteColSprite( const char *szSrcName, const char *szTarName )/ 发起者为 GoldHook,接受者含有 GoldBlock 字段if(strcmp(szSrcName,GoldHook)=
19、1 & strstr(szTarName,GoldBlock)!=NULL )在钩子上dSpriteMountToSpriteLinkPoint( szTarName, GoldHook, 2 );/将金块锚定dSpriteMoveTo(GoldHook,g_fHookStartPosX, g_fHookStartPosY,g_fEmptyHookSpeed, 1); /使钩子向初始位置移动,即会拉strcpy(szGotGoldName,szTarName); /复制并保存当前抓取到金块的名称/ 发起者为 GoldHook,接受者含有 GoldBlock 字段/ 根据金子大小,计算钩子的往回
20、收的速度,越大的越慢。/ 算法:之前设置的金子大小为 4,6,8,用 10 减去该大小再除以 10,得到 3 个小/ 数:0.6,0.4,0.2.该小数乘以空钩子的速度即得到挂接不同金子后的实际速度float fWidth = dGetSpriteWidth( szTarName );float fSpeed = (10.f - fWidth) / 10.f) * g_fEmptyHookSpeed;/ 钩子往初始位置移动dSpriteMoveTo( goldhook, g_fHookStartPosX, g_fHookStartPosY, fSpeed,1);dAnimateSpritePl
21、ayAnimation(goldMan,GolderManAnimation1, 0 );/播放拉金块的动作g_iGameState = 1; flagnum=1;/=/ 引擎捕捉到精灵与世界边界碰撞之后,调用此函数./ iColSide : 0 左边,1 右边,2 上边,3 下边void dOnSpriteColWorldLimit( const char *szName, const int iColSide )if(strcmp(szName,GoldHook)!=0)/碰到边界的为钩子时dSpriteMoveTo(szName,g_fHookStartPosX, g_fHookStar
22、tPosY, g_fEmptyHookSpeed, 1);dAnimateSpritePlayAnimation(goldMan,GolderManAnimation3, 0); / 播 放拉金块的动作/同样设置为回拉,只是没有碰到金子g_iGameState = 1;flagnum=0;void DrawHookLine()/ 首先,从矿工精灵上获取一个缆绳链接点作为绳子的起始点(该链接点在编/ 辑器里编辑好)float fStartX = dGetSpriteLinkPointPosX( GoldMan, 1 ); float fStartY = dGetSpriteLinkPointPo
23、sY( GoldMan, 1 );/ 绳子终点在钩子精灵上获取(该链接点在编辑器里编辑好) float fEndX = dGetSpriteLinkPointPosX( GoldHook, 1 ); float fEndY = dGetSpriteLinkPointPosY( GoldHook, 1 );/ 在这两点之间划线.线的颜色红绿蓝值都为 50,即灰色dDrawLine( fStartX, fStartY, fEndX, fEndY, 2.f, 0, 50, 50, 50, 255 );8、 游戏运行,初试界面出现空格开始的提示。学号姓名任务成绩解决程序结构布局问题; 解决画线函数问题;写实验报告;解决捕捉到精灵与精灵碰撞问题;解决捕捉到精灵与世界边界碰撞问题; 解决捕捉键盘按下消息问题;同一个问题可以用不同的代码解决,如该程序中的画线部分;部分程序代码在程序中不能实现,可能是该软件的 bug;编程过程中加深了对全局变量和局部变量的了解;要理解函数的意义,不然会弄乱;程序要写清晰明快,不然在检查的时候会很麻烦;随着对该软件的理解,对 C 语言中的结构函数有了更深的了解;评阅教师签名
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1