黄金矿工实验报告.docx

上传人:b****4 文档编号:6002925 上传时间:2023-05-09 格式:DOCX 页数:19 大小:724.71KB
下载 相关 举报
黄金矿工实验报告.docx_第1页
第1页 / 共19页
黄金矿工实验报告.docx_第2页
第2页 / 共19页
黄金矿工实验报告.docx_第3页
第3页 / 共19页
黄金矿工实验报告.docx_第4页
第4页 / 共19页
黄金矿工实验报告.docx_第5页
第5页 / 共19页
黄金矿工实验报告.docx_第6页
第6页 / 共19页
黄金矿工实验报告.docx_第7页
第7页 / 共19页
黄金矿工实验报告.docx_第8页
第8页 / 共19页
黄金矿工实验报告.docx_第9页
第9页 / 共19页
黄金矿工实验报告.docx_第10页
第10页 / 共19页
黄金矿工实验报告.docx_第11页
第11页 / 共19页
黄金矿工实验报告.docx_第12页
第12页 / 共19页
黄金矿工实验报告.docx_第13页
第13页 / 共19页
黄金矿工实验报告.docx_第14页
第14页 / 共19页
黄金矿工实验报告.docx_第15页
第15页 / 共19页
黄金矿工实验报告.docx_第16页
第16页 / 共19页
黄金矿工实验报告.docx_第17页
第17页 / 共19页
黄金矿工实验报告.docx_第18页
第18页 / 共19页
黄金矿工实验报告.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

黄金矿工实验报告.docx

《黄金矿工实验报告.docx》由会员分享,可在线阅读,更多相关《黄金矿工实验报告.docx(19页珍藏版)》请在冰点文库上搜索。

黄金矿工实验报告.docx

黄金矿工实验报告

中国石油大学(华东)

程序设计实训报告

“黄金矿工”实验报告

游戏截图

图一:

开始游戏

图二:

按下空格键开始游戏,出现金块,钩子转动

图三:

按下↓键,钩子停止转动,开始下放,抓取金块

图四:

抓完金块后返回初始界面

功能描述

1、游戏运行,初始界面出现“空格开始”的提示。

2、玩家按下空格键,开始游戏。

3、游戏开始后,界面随机出现20个大小不同的金子,并且钩子开始转动。

4、按下↓键,钩子停止转动,下放,抓取金子。

5、抓到金子后,返回到初始位置,被抓到的金子消失。

6、用户继续按下↓键,继续抓取金子,直到金子被抓取完,这样一局游戏完成。

7、一局游戏完成后,屏幕重新出现“空格开始”的标志,用户按下空格可以继续游戏,如此往复。

流程图:

数据结构:

1、g_fGoldBornMinX金子左边界

2、g_fGoldBornMaxX金子右边界

3、g_fGoldBornMinY金子上边界

4、g_fGoldBornMaxY金子下边界

5、g_iGoldCount屏幕中金子数目

6、g_iGameState设置游戏状态

7、szGotGoldName[20]当前抓到金子的名称

8、g_fHookRotation钩子的转动的角速度

9、g_fEmptyHookSpeed钩子的下放的初始速度

10、g_fHookStartPosX存储钩子的初始X位置

11、g_fHookStartPosY存储钩子的初始Y位置

算法描述:

游戏状态g_iGameState分为三种状态0,1,2,其中0表示游戏结束状态,1表示游戏初始化,2则表示游戏运行状态;

0→1的转换为“空格开始”;

1→2的转换自然发生,即游戏初始化函数后会自动将游戏状态从1置为2;

2表示游戏运行状态,在该状态,按下↓键可以抓取金子;

2→0的转换为当金子全被抓完后会自动将游戏状态从2置为0;

金子精灵的初始化:

1、创建金子精灵的对象;

2、生成大小为4的小金块10个、大小为6的中金块6个、大小为8的大金块4个,并保存tmpName数组中,随机获取每个金子的坐标;

3、隐藏“空格开始”精灵;

4、设置屏幕中剩下的金子数目为20,每当被抓走的一块金子消失后屏幕中剩下的金子数目减1;

5、当屏幕中剩下的金子数目为0时,一局游戏结束,返回初始界面,“空格开始”精灵出现;

6、重新进行金子精灵的初始化;

dOnKeyDown(constintiKey,constboolbAltPress,constboolbShiftPress,constboolbCtrlPress)

游戏开始和控制按钮:

1、游戏还未开始,即游戏状态为0,如果空格按被下,则将游戏状态改为1,此时对程序的数据进行初始化,“空格开始”精灵消失,金子出现,钩子转动;

2、游戏状态为0时并按下空格键后,,如果按下↓键,钩子开始下放抓金子,当抓到金子后,游戏的状态变为2游戏正式开始运行;

3、游戏状态为2时,钩子抓住金子后,按照金子的大小设置金子的速度,金子越大,回拉速度越小;

4、当钩子和金子回到初始位置后,被抓的金子消失;

 

源代码:

在Main.cpp文件中

//-----------------------------------------------------------------------------

//

//-----------------------------------------------------------------------------

#include"CommonAPI.h"

#include"stdio.h"

#include"string.h"

voidDrawHookLine();

intg_fGoldBornMinX=0;

intg_fGoldBornMaxX=0;

intg_fGoldBornMinY=0;

intg_fGoldBornMaxY=0;

intg_iGoldCount=20;

intg_iGameState=2;

intflag=1;

intflagnum=0;

charszGotGoldName[20];//当前抓到金子的名称

floatg_fHookRotation=0.f;

floatg_fEmptyHookSpeed=35.f;

floatfTimeDelta;

floatg_fHookStartPosX;//存储钩子的初始X位置

floatg_fHookStartPosY;//存储钩子的初始Y位置

///////////////////////////////////////////////////////////////////////////////////////////

//

//主函数入口

//

//////////////////////////////////////////////////////////////////////////////////////////

intPASCALWinMain(HINSTANCEhInstance,

HINSTANCEhPrevInstance,

LPSTRlpCmdLine,

intnCmdShow)

{

//初始化游戏引擎

if(!

dInitGameEngine(hInstance,lpCmdLine))

return0;

//游戏初始化代码

dSetWindowTitle("黄金矿工");

g_fGoldBornMinX=dGetScreenLeft()+5;//金子左边界

g_fGoldBornMaxX=dGetScreenRight()-5;//金子右边界

g_fGoldBornMinY=dGetScreenTop()+20;//金子上边界

g_fGoldBornMaxY=dGetScreenBottom()-5;//金子下边界

g_fHookStartPosX=dGetSpritePositionX("GoldHook");//获取钩子的初始X坐标

g_fHookStartPosY=dGetSpritePositionY("GoldHook");//获取钩子的初始Y坐标

dSetSpriteCollisionSend("goldHook",1);

dSetSpriteCollisionReceive("goldTemplate",1);

constfloatfRotateSpeed=45.f;//摇摆速度,单位度/秒

intiHookRotToLeft=1;//钩子摆动的方向:

1←;0→

floatfTimeDelta=dGetTimeDelta();

//引擎主循环,处理屏幕图像刷新等工作

while(dEngineMainLoop())

{

//获取两次调用之间的时间差,传递给游戏逻辑处理

floatfTimeDelta=dGetTimeDelta();

DrawHookLine();

//执行游戏主循环

if(g_iGameState==0)

{

floatfThisRotate=fRotateSpeed*fTimeDelta;

if(iHookRotToLeft)

{

g_fHookRotation+=fThisRotate;

if(g_fHookRotation>=180.f)

{

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);

}

elseif(g_iGameState==1)

{

dAnimateSpritePlayAnimation("goldMan","GolderManAnimation3",1);//播放拉金块的动作

//获取钩子X方向的速度

floatfSpeedX=dGetSpriteLinearVelocityX("GoldHook");

//获取钩子Y方向的速度

floatfSpeedY=dGetSpriteLinearVelocityY("GoldHook");

//当速度接近为0时,即可判定其已到达初始点

if(fSpeedX<0.00001f&&fSpeedX>-0.00001f&&fSpeedY<0.00001f&&fSpeedY>-0.00001f)

{

//解除金块与钩子的锚定

dSpriteDismount(szGotGoldName);

//删除获取的金块

dDeleteSprite(szGotGoldName);

//回拉结束,设定状态为0

g_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;

}

};

dAnimateSpritePlayAnimation("goldMan","GolderManAnimation2",1);

//关闭游戏引擎

dShutdownGameEngine();

return0;

}

//==========================================================================

//

//引擎捕捉鼠标移动消息后,将调用到本函数

voiddOnMouseMove(constfloatfMouseX,constfloatfMouseY)

{

//可以在此添加游戏需要的响应函数

}

//==========================================================================

//

//引擎捕捉鼠标点击消息后,将调用到本函数

voiddOnMouseClick(constintiMouseType,constfloatfMouseX,constfloatfMouseY)

{

//可以在此添加游戏需要的响应函数

}

//==========================================================================

//

//引擎捕捉键盘按下消息后,将调用到本函数

//iAltPressiShiftPressiCtrlPress分别为判断Shift,Alt,Ctrl当前是否也处于按下状态。

比如可以判断Ctrl+E组合键

voiddOnKeyDown(constintiKey,constintiAltPress,constintiShiftPress,constintiCtrlPress)

{

//可以在此添加游戏需要的响应函数

if(iKey==KEY_SPACE)

{

g_iGameState=1;//初始化之后,将游戏状态设置为进行中

dSetSpriteVisible("GameBegin",0);

//生成金子

intiLoop=0;//循环变量控制

intiSize=4,iPosX=0,iPosY=0;//iSize表示金块大小的变量

if(flag)

{

for(iLoop=0;iLoop

{

if(iLoop<10)//生成10个小金块,大小为4

{

iSize=4;

}

elseif(iLoop>=10&&iLoop<16)//生成6个中金块,大小为6

{

iSize=6;

}

else//生成4个大金块,大小为8

{

iSize=8;

}//初始化金子精灵实例

char*tmpName;

tmpName=dMakeSpriteName("GoldBlock",iLoop);//生成金块名字

dCloneSprite("goldTemplate",tmpName);

dSetSpriteWidth(tmpName,(float)iSize);//设置金块的宽度

dSetSpriteHeight(tmpName,(float)iSize);//设置金块的高度

//设置金子精灵位置

iPosX=dRandomRange(g_fGoldBornMinX,g_fGoldBornMaxX);

iPosY=dRandomRange(g_fGoldBornMinY,g_fGoldBornMaxY);

dSetSpritePosition(tmpName,(float)iPosX,(float)iPosY);

flag=0;

}

}

if(g_iGoldCount==0)

{

flag=1;

g_iGoldCount=20;

}

}

if(iKey==KEY_DOWN&&g_iGameState==0)

{//按下↓并且游戏状态为"0"

g_iGameState=2;//置游戏状态为2,可用于控制钩子是否摆动

//以当前朝向给钩子一个向前的速度

dSetSpriteLinearVelocityPolar("GoldHook",g_fEmptyHookSpeed,g_fHookRotation);

//播放挖金者的动作(一个胳膊往下压的动作)

dAnimateSpritePlayAnimation("goldMan","GolderManAnimation1",0);

//0表示播放一次,这里胳膊往下压就是一次

}

}

//==========================================================================

//

//引擎捕捉键盘弹起消息后,将调用到本函数

voiddOnKeyUp(constintiKey)

{

//可以在此添加游戏需要的响应函数

}

//===========================================================================

//

//引擎捕捉到精灵与精灵碰撞之后,调用此函数

voiddOnSpriteColSprite(constchar*szSrcName,constchar*szTarName)

{

//发起者为GoldHook,接受者含有GoldBlock字段

if(strcmp(szSrcName,"GoldHook")==1&&strstr(szTarName,"GoldBlock")!

=NULL)

{

dSpriteMountToSpriteLinkPoint(szTarName,"GoldHook",2);//将金块锚定在钩子上

dSpriteMoveTo("GoldHook",g_fHookStartPosX,g_fHookStartPosY,g_fEmptyHookSpeed,1);//使钩子向初始位置移动,即会拉

strcpy(szGotGoldName,szTarName);//复制并保存当前抓取到金块的名称

//发起者为GoldHook,接受者含有GoldBlock字段

//根据金子大小,计算钩子的往回收的速度,越大的越慢。

//算法:

之前设置的金子大小为4,6,8,用10减去该大小再除以10,得到3个小//数:

0.6,0.4,0.2.该小数乘以空钩子的速度即得到挂接不同金子后的实际速度

floatfWidth=dGetSpriteWidth(szTarName);

floatfSpeed=((10.f-fWidth)/10.f)*g_fEmptyHookSpeed;

//钩子往初始位置移动

dSpriteMoveTo("goldhook",g_fHookStartPosX,g_fHookStartPosY,fSpeed,1);

dAnimateSpritePlayAnimation("goldMan","GolderManAnimation1",0);//播放拉金块的动作

g_iGameState=1;

flagnum=1;

}

}

//===========================================================================

//

//引擎捕捉到精灵与世界边界碰撞之后,调用此函数.

//iColSide:

0左边,1右边,2上边,3下边

voiddOnSpriteColWorldLimit(constchar*szName,constintiColSide)

{

if(strcmp(szName,"GoldHook")!

=0)

{

//碰到边界的为钩子时

dSpriteMoveTo(szName,g_fHookStartPosX,g_fHookStartPosY,g_fEmptyHookSpeed,1);

dAnimateSpritePlayAnimation("goldMan","GolderManAnimation3",0);//播放拉金块的动作

//同样设置为回拉,只是没有碰到金子

g_iGameState=1;

flagnum=0;

}

}

voidDrawHookLine()

{

//首先,从矿工精灵上获取一个缆绳链接点作为绳子的起始点(该链接点在编//辑器里编辑好)

floatfStartX=dGetSpriteLinkPointPosX("GoldMan",1);

floatfStartY=dGetSpriteLinkPointPosY("GoldMan",1);

//绳子终点在钩子精灵上获取(该链接点在编辑器里编辑好)

floatfEndX=dGetSpriteLinkPointPosX("GoldHook",1);

floatfEndY=dGetSpriteLinkPointPosY("GoldHook",1);

//在这两点之间划线.线的颜色红绿蓝值都为50,即灰色

dDrawLine(fStartX,fStartY,fEndX,fEndY,2.f,0,50,50,50,255);

}

8、游戏运行,初试界面出现‘空格开始’的提示。

学号

姓名

任务

成绩

解决程序结构布局问题;

解决画线函数问题;

写实验报告;

解决捕捉到精灵与精灵碰撞问题;

解决捕捉到精灵与世界边界碰撞问题;

解决捕捉键盘按下消息问题;

同一个问题可以用不同的代码解决,如该程序中的画线部分;

部分程序代码在程序中不能实现,可能是该软件的bug;

编程过程中加深了对全局变量和局部变量的了解;

要理解函数的意义,不然会弄乱;

程序要写清晰明快,不然在检查的时候会很麻烦;

随着对该软件的理解,对C语言中的结构函数有了更深的了解;

评阅教师签名

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

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2