小游戏黄金矿工设计报告.docx

上传人:b****5 文档编号:7399883 上传时间:2023-01-23 格式:DOCX 页数:32 大小:2.36MB
下载 相关 举报
小游戏黄金矿工设计报告.docx_第1页
第1页 / 共32页
小游戏黄金矿工设计报告.docx_第2页
第2页 / 共32页
小游戏黄金矿工设计报告.docx_第3页
第3页 / 共32页
小游戏黄金矿工设计报告.docx_第4页
第4页 / 共32页
小游戏黄金矿工设计报告.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

小游戏黄金矿工设计报告.docx

《小游戏黄金矿工设计报告.docx》由会员分享,可在线阅读,更多相关《小游戏黄金矿工设计报告.docx(32页珍藏版)》请在冰豆网上搜索。

小游戏黄金矿工设计报告.docx

小游戏黄金矿工设计报告

 

 

C语言课程设计报告

 

机房名称  

时间 

学院

专业班级 

姓  名

学  号

指导教师

 

小游戏“黄金矿工”设计报告

 

一、课题简述

通过一年的c语言程序设计的学习,我们仅仅掌握了c语言最基本的知识,还有很多内容是我们没有涉及的。

所以通过c语言课程设计的学习实践活动和实际演练,使我们能够在实际操作中提高运用c语言解决问题的能力和程序设计的能力。

得知本次课程设计任务是小游戏的设计,我们既兴奋又不安,兴奋是十分期待自己亲手做出的游戏,不安的是我们对funcode这个软件很不了解。

幸好这次实践的过程,让我们从做平时简单的小程序过渡到现在的综合应用程序,将学过的c语言知识融入新接触到的funcode操作中,不仅能巩固所学的知识,还能加强对新事物的接受及应用的本领,在不断的挑战问题中大大的提升自己,同时也是对c语言程序设计这门课的深入理解的过程。

而什么样的小游戏是我们能实现而又不乏趣味呢?

经过反复思考、讨论,我们小组设计了“黄金矿工”这样一个小游戏:

玩家通过键盘的按键控制矿工抓取金块,将钩子碰触到的金块抓取过来。

1.单机键盘上的空格键进入游戏,金块的总数是20,钻石的总数是2,炸弹的总数是3,石头的总数是4,大小位置是随机的。

2.在没有抓取状态下,钩子左右摆动,此时矿工的是静止的。

当钩子摆动到一定角度,玩家可以单击键盘上的上下左右键中的下方向键控制矿工伸出长钩,抓取金子等——抓到一个金子金子加20分,钻石加50分且拉回速度变快,石头加5分且拉回速度变慢,抓到炸弹不加分且炸弹会爆炸。

此时矿工是向下摇动转轴。

获取到金子等往回拉后,矿工是不断转动转轴,直到金子拉动到钩子初始处,矿工恢复静止,钩子继续左右摇摆,直到玩家再次单击向下方向键。

如果钩子没有碰触到金子,而是碰触到左右和下的边界,则钩子保持原来的速度往回收。

3.加入计分和计时系统。

60秒倒计时时间内抓取的金子越多得分越高。

接下来,我们开始思索,要如何实现这些功能,如何将所有功能连接在一起。

于是我们先用funcode熟悉小游戏制作的操作,认真按照老师给我们的实验指南进行练习,反复阅读其内容,并用vc6.0进行对各种小游戏源代码的简单探索。

当然,由于技术原因,我们想要设计的软件只是局限于对游戏功能的实现,而实际中正式的欢迎界面,游戏说明等优美的图片,我们并没有进行设计,包括刚开始拟定的金子运动、玩家升级等也取消了。

然而,这并不影响我们制作小游戏的热情,而且我们根据其具体的功能进行了组员之间的分工合作。

二、功能需求

Ⅰ.程序大体流程图:

图1.游戏模块图

Ⅱ.部分函数介绍

本实验用到的API

externfloatdGetScreenLeft();/*获取世界边界之左边X坐标*/

externfloatdGetScreenTop();/*获取世界边界之上边Y坐标*/

externfloatdGetScreenRight();/*获取世界边界之右边X坐标*/

externfloatdGetScreenBottom();/*获取世界边界之下边Y坐标*/

externvoiddSetSpriteWidth(constchar*szName,constfloatfWidth);/*设置精灵外形宽度*/

externfloatdGetSpriteWidth(constchar*szName);/*dGetSpriteWidth:

获取精灵外形宽度*/

externintdRandomRange(constintiMin,constintiMax);/*获取一个位于参数1到参数2之间的随机数*/

externvoiddSetSpriteRotation(constchar*szName,constfloatfRot);/*设置精灵的旋转角度*/

externvoiddSetSpriteLinearVelocityPolar(constchar*szName,constfloatfSpeed,constfloatfPolar);

/*设置精灵移动速度*/

externintdAnimateSpritePlayAnimation(constchar*szName,constchar*szAnim,constintiRestore);

/*精灵播放动画*/

externfloatdGetSpriteLinkPointPosX(constchar*szName,constintiId);

/*获取精灵链接点X坐标。

链接点是依附于精灵的一个坐标点*/

externfloatdGetSpriteLinkPointPosY(constchar*szName,constintiId);

/*获取精灵链接点Y坐标。

链接点是依附于精灵的一个坐标点*/

externvoiddDrawLine(constfloatfStartX,constfloatfStartY,constfloatfEndX,constfloatfEndY,constfloatfLineWidth,constintiLayer,constintiRed,constintiGreen,constintiBlue,constintiAlpha);

/*dDrawLine:

两点之间画线*/

Funcode接口介绍

externvoiddOnSpriteColSprite(constchar*szSrcName,constchar*szTarName);

/*精灵与精灵碰撞后将被调用的函数*/

externintdSpriteMountToSpriteLinkPoint(constchar*szSrcName,constchar*szDstName,constintiPointId);/*将一个精灵绑定到另一个精灵上,绑定位置为指定*的链接点,暂时的成为另一个精灵的一部分,跟随其运动等*/

externfloatdGetSpritePositionX(constchar*szName);/*获取精灵X坐标*/

externfloatdGetSpritePositionY(constchar*szName);/*获取精灵Y坐标*/

funcode函数

(1)/*主函数入口*/

intPASCALWinMain(HINSTANCEhInstance,

HINSTANCEhPrevInstance,

LPSTRlpCmdLine,

intnCmdShow)

{

/*初始化游戏引擎*/

if(!

dInitGameEngine(hInstance,lpCmdLine))

return0;

/*在此使用API更改窗口标题*/

dSetWindowTitle("Lesson");

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

while(dEngineMainLoop())

{

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

floatfTimeDelta=dGetTimeDelta();

/*执行游戏主循环*/

GameMainLoop(fTimeDelta);

};

/*关闭游戏引擎*/

dShutdownGameEngine();

return0;

}

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

voiddOnKeyDown(constintiKey,constintiAltPress,constintiShiftPress,constintiCtrlPress)

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

voiddOnKeyUp(constintiKey)

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

voiddOnSpriteColSprite(constchar*szSrcName,constchar*szTarName)

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

voiddOnSpriteColWorldLimit(constchar*szName,constintiColSide)

其它函数

(1)出现金块、钻石、炸弹、石头,并增加其碰撞属性

voidAppear();

(2)画出链接钩子的线

voidline();

(3)重置游戏初始状态

voidbegin();

(4)游戏结束后,清楚剩余金块、钻石、炸弹、石头

voidDisappear();

 

三、总体设计

.下图为主函数及各级嵌套函数的流程图,部分省略。

 

图2.主函数流程图

、操作使用说明

玩家通过键盘的按键控制矿工抓取金块,将钩子碰触到的金块抓取过来。

1.单机键盘上的空格键进入游戏,金块的总数是20,钻石的总数是2,炸弹的总数是3,石头的总数是4,大小位置是随机的。

2.在没有抓取状态下,钩子左右摆动,此时矿工的是静止的。

当钩子摆动到一定角度,玩家可以单击键盘上的上下左右键中的下方向键控制矿工伸出长钩,抓取金子等——抓到一个金子金子加20分,钻石加50分且拉回速度变慢,石头加5分且拉回速度变慢,抓到炸弹不加分且炸弹会爆炸。

此时矿工是向下摇动转轴。

获取到金子等往回拉后,矿工是不断转动转轴,知道金子拉动到钩子初始处,矿工恢复静止,钩子继续左右摇摆,直到玩家再次单击向下方向键。

如果钩子没有碰触到金子,而是碰触到左右和下的边界,则钩子保持原来的速度往回收。

3.存在计分和计时系统。

60秒倒计时时间内抓取的金子越多得分越高。

四、详细设计

1.变量定义部分

变量定义是一个完整的程序中不可或缺的内容。

在本次游戏编写中,我们根据程序需要,也不可缺少的设置了许多变量,下面我们简单介绍一下全局变量和主函数之中的部分变量:

(1)定义全局变量

///////////////////初始化物品数量////////////////////////////////////////

intg_iGoldCount=20;//金子数量

intg_iBombCount=3;//炸弹数量

intg_iDiaCount=2;//钻石数量

intg_iStoneCount=4;//石头数量

////////////////////////////初始化计时计分///////////////////////////////

floatg_iGameScore=0;//初始化得分

floatg_fGameTime=60.f;//计时,设定初始计时

boolg_bStart=0;//计时,定义开始计时的状态

////////////////////////////设置钩子自由旋转的定义///////////////////////////////

floatg_fHookRotation=0.f;

intg_iGameState=0;//定义游戏初始状态

floatg_fEmptyHookSpeed=15.f;//定义钩子的速度

///////////////////////////设置钩子抓精灵的定义////////////////////////////////

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

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

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

charszGotBombName[3];//当前抓到炸弹的名称

charszGotDiaName[2];//当前抓钻石的名称

charszGotStoneName[2];//当前抓石头的名称

(2)主函数之中的局部变量

//////////////////////////设置钩子摇摆///////////////////////////////////

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

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

1←;0→

/////////////////////////设置钩子抓金子///////////////////////////////////

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

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

dSetSpriteWorldLimitMode("goldhook",WORLD_LIMIT_NULL);//初始化钩子与世界边界碰撞的模式为NULL

2.主函数模块WinMain()函数模块

实现初始化游戏引擎,执行引擎主循环,处理屏幕图像刷新等工作,包括获取两次调用之间的时间差,传递给游戏逻辑处理等。

我们通过主函数实现设置初始化游戏状态、钩子摇摆、钩子抓金子、炸弹、石头、钻石等内容。

在本游戏中我们设计了5种游戏状态,分别为g_iGameState等于0、1、2、3、4。

其中,状态0为游戏初始状态,状态1和2为游戏运行状态,状态3为游戏结束状态,状态4为过渡到初始状态时运用的一个调整状态。

步骤详细介绍:

第一步,游戏初始化,显示初始界面需要的精灵

if(!

dInitGameEngine(hInstance,lpCmdLine))//初始化游戏引擎

return0;

dSetWindowTitle("黄金矿工");//设置窗口名字

dSetWindowTitle("Lesson");

begin();//调用函数,初始游戏,显示初始精灵

第二步,游戏是一直进行的,因此游戏的重点是在while循环中。

While循环中使用“floatfTimeDelta=dGetTimeDelta();”获取两次调用之间的时间差,传递给游戏逻辑处理,达到不断循环。

下面介绍一下此循环中使用的语句。

游戏倒计时,倒计时结束后实现状态跳转到结束状态

/////////////////////////////////////////////////////////////////倒计时/////////////////////////////////////////////////////////////////

if(g_bStart)//判断游戏是否开始

{

g_fGameTime-=fTimeDelta;//设置游戏时间

if(g_fGameTime>0)//判断游戏是否结束

{

dSetTextValue("Time",(int)(g_fGameTime));//设置精灵"时间"显示数值

}

if(g_fGameTime<=0&&(g_iGameState==2||g_iGameState==1))

//判断游戏是否结束,且在运行状态1或2时,其他状态不执行

{

g_iGameState=3;//变成状态3,实现游戏结束

}

}

钩子的自由摆动,此过程是在状态0和1时准备抓金子时出现的

////////////////////////////////////////////////////////////////////钩子自由摆动////////////////////////////////////////////////////

floatfThisRotate=fRotateSpeed*fTimeDelta;//本次旋转的角度

if(g_iGameState==0||g_iGameState==1)

{

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);//设置钩子的旋转角度

}

钩子抓金子,钩子抓金子为状态2,不需要钩子自由摆动

/////////////////////////////////////////////////////////////////钩子抓金子///////////////////////////////////////////////////////////

if(g_iGameState==2)

{

floatfSpeedX=dGetSpriteLinearVelocityX("goldhook");//获取钩子X方向的速度

floatfSpeedY=dGetSpriteLinearVelocityY("goldhook");//获取钩子Y方向的速度

if(fSpeedX<0.00001f&&fSpeedX>-0.00001f&&fSpeedY<0.00001f&&fSpeedY>-0.00001f)//当速度接近为0时,即可判定其已到达初始点

{

dSpriteDismount(szGotGoldName);//解除金块与钩子的锚定

dDeleteSprite(szGotGoldName);//删除获取的金块

g_iGameState=1;//回拉结束,设定状态为1,钩子摆动

dAnimateSpritePlayAnimation("GoldMan","GolderManAnimation2",0);//播放矿工的动画,即准备拉金子的动画

}

}

游戏状态3,显示游戏时间停止

if(g_iGameState==3)

{

dSetSpriteVisible("over",1);//若结束显示Timeover

}

游戏状态为4时,实现过渡到游戏状态为1

if(g_iGameState==4)

{

begin();//调用重置游戏初始化所需精灵

g_iGameState=0;//实现游戏状态跳转到初始状态0

g_iGameScore=0;//重置游戏分数为0

g_fGameTime=60.f;//重置倒计时时间为60

g_bStart=0;//停止先前状态中的倒计时

dSetTextValue("score",(int)0);//重置游戏分数为0

dSetTextValue("time",(int)60);//重置倒计时时间为60

dSetSpriteVisible("over",0);//隐藏Timeover

dSetSpriteVisible("score",1);//出现计分装置

dSetSpriteVisible("time",1);//出现计时装置

}

由于钩子的连线也是一直在游戏运行时存在的,故也应放入此循环中

////////////////////////////////////////////////////////设置与钩子链接的线//////////////////////////////////////////////////////

line();//调用画线的函数

第四步,游戏结束,关闭游戏引擎,主函数完成

dShutdownGameEngine();//关闭游戏引擎

return0;

3.有关系统给定的函数的设置

(1)dOnKeyDown()函数的详述,对于系统内我们主要使用此函数。

我们使用空格键控制游戏开始,方向下键控制钩子下落,回车键实现从结束状态到开始状态的过渡。

///////////////////////////////////////按下空格游戏开始///////////////////////////////////////////////

g_fEmptyHookSpeed=15.f;//为之后调整绳子速度做准备

if(iKey==KEY_SPACE&&g_iGameState==0)//按下空格键且游戏状态为0时

{

g_iGameState=1;//游戏状态变为1

dSetSpriteVisible("GameBegin",0);//消失游戏开始

dSetSpriteVisible("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