03-实验报告范例.doc_第1页
03-实验报告范例.doc_第2页
03-实验报告范例.doc_第3页
03-实验报告范例.doc_第4页
03-实验报告范例.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

“猴子选大王”实验报告游戏截图图一:开始游戏图二:猴子队列就绪图三:游戏中,按空格键淘汰猴子图四:选出大王,即最后剩下的一只图五:重新开始一局功能描述本游戏源自典故猴子称大王!1、 游戏运行,初试界面出现空格开始的提示。2、 玩家按空格开始游戏,6只猴子排成一列。3、 游戏开始后,用户每按一次空格键,随机从猴子队列中产生一个被淘汰的猴子4、 被淘汰的猴子会出局,加入屏幕下方的淘汰者猴子队列中。5、 站在被淘汰猴子后方的选手依次往前移,填补空白6、 用户继续按空格淘汰猴子,值到剩下唯一的猴子,就是大王!这样,一局游戏完成。7、 一局游戏完成后,屏幕重新出现“空格开始”的标志,用户按空格可以继续游戏,如此往复。流程图数据结构1. CSprite*m_Monkeys6用一个CSprite的指针数组来保存猴子精灵2. floatm_fLocation6;用一个浮点型数组存储猴子位置(因为6只猴子站成一排,y坐标值是相同的,因此该数组保存6只猴子的x坐标值)。其中m_Monkeysi对应的位置为m_fLocationi3. m_iNumMokeys当前备选猴子数量,即截图中上层队列的猴子数4. m_iNumLoseMonkeys淘汰的猴子数量,即下层队列中的猴子数5. m_iChooseMonkey本轮淘汰的猴子编号6. m_iMoveMonkey淘汰猴子后,后面需要移动的猴子数7. m_fDelayTime猴子向前移动的延迟时间算法描述有六只猴子,存储在m_Monkeys数组中,对应的位置则在m_fLocation中,对应关系为m_Monkeysi m_fLocationi;游戏状态m_iGameState分为三种状态0,1,2 ,其中0表示游戏结束状态,1表示游戏初始化,2则表示游戏运行状态;0 1的转换为“空格开始”,初始化函数为GameInit函数;1 2的转换自然发生,即游戏初始化函数后会自动将游戏状态从1置为22 表示游戏运行状态,在该状态,敲击空格可以选出淘汰的猴子2 0的转换为当猴子的备选队列中只剩下一只猴子的时候发生,该猴子便是大王了CGameMain:CGameMain()构造函数完成初始化工作1、 设置游戏状态为1。2、 初始化精灵类start,对应“空格开始”精灵。3、 设置随机数种子CGameMain:GameMainLoop(floatfDeltaTime )游戏的主循环,根据游戏的状态切换逻辑1、 当当游戏状态为0时,主循环一直循环,但不做处理,而是等待空格键按下,开始游戏。2、 当游戏状态为1时,调用GameInit()方法初始化游戏,然后置游戏状态为2。3、 当游戏状态为2时,调用GameRun(fDeltaTime)方法,移动淘汰猴子后续队列中的一只猴子补齐空缺。跳出该状态的条件是备选队列中只剩下最后一只猴子且该猴子移动到最前端,游戏结束时会执行GameEnd且置状态为0CGameMain:GameInit()负责猴子精灵的初始化1、 创建猴子精灵的对象,并保存CSprite数组中,依次设置每只精灵的坐标。2、 将参选大王的猴子数设为6,每只猴子移动的时间间隔设为1.0秒。3、 淘汰的猴子数目设为0。4、 隐藏“空格开始”精灵CGameMain:GameRun(floatfDeltaTime )处理猴子移动,即淘汰猴子后,备选队列中的猴子前移1、 当有猴子需要移动时且经过1秒的移动时间后,移动猴子,且将待移动的猴子数目减1CGameMain:OnKeyDown(constintiKey, constboolbAltPress, constboolbShiftPress, constboolbCtrlPress )游戏开始和控制按钮1、如果空格按下时,游戏未开始,即游戏状态为0,则将游戏状态改为1,运行游戏初始化函数(GameInit)2、如果按下空格时,剩下的猴子数大于1,游戏状态为2且备选队列中没有需要向前移动的猴子时,则随机选中1个猴子淘汰,并将被淘汰的猴子移动到屏幕下方淘汰者队列。3、移动完成后,将淘汰猴子的数量标志m_iNumLoseMonkeys加1,备选猴子数keys减1,同时计算出需要移动的猴子数量,并将猴子精灵数组中的猴子均向前移动一位,同位置数组相对应;源代码LessionX.h:CGameMain类的声明#ifndef _LESSON_X_H_#define _LESSON_X_H_/#include / 游戏总管类。负责处理游戏主循环、游戏初始化、结束等工作classCGameMainprivate:intm_iGameState;/ 游戏状态,0:结束或者等待开始;1:初始化;2:游戏运行;CSprite*m_Monkeys6;/存储猴子精灵floatm_fLocation6;/存储猴子的位置intm_iNumMokeys;/当前猴子的数量intm_iChooseMonkey;/当前随机淘汰的猴子intm_iMoveMonkey ;/需要移动的猴子,位于m_iChooseMonkey的后面且不为NULLfloatm_fDelayTime;/每隔1s移动一只猴子intm_iNumLoseMonkeys;/已经淘汰的猴子数量,初始为0CSprite*start;public:CGameMain(); /构造函数CGameMain(); /析构函数/ Get方法intGetGameState() return m_iGameState; / Set方法voidSetGameState( constintiState ) m_iGameState=iState; / 游戏主循环等voidGameMainLoop( floatfDeltaTime );voidGameInit();voidGameRun( float fDeltaTime );voidGameEnd();voidOnKeyDown( constintiKey, constboolbAltPress, constboolbShiftPress, constboolbCtrlPress );/ externCGameMaing_GameMain;#endif / _LESSON_X_H_LessonX:CGameMain类定义#include #include CommonClass.h#include LessonX.h#include /CGameMaing_GameMain;/=/ 大体的程序流程为:GameMainLoop函数为主循环函数,在引擎每帧刷新屏幕图像之后,都会被调用一次。/=/ 构造函数CGameMain:CGameMain()m_iGameState=0;start = new CSprite(start);srand(time(NULL);/=/ 析构函数CGameMain:CGameMain()/=/ 游戏主循环,此函数将被不停的调用,引擎每刷新一次屏幕,此函数即被调用一次/ 用以处理游戏的开始、进行中、结束等各种状态. / 函数参数fDeltaTime : 上次调用本函数到此次调用本函数的时间间隔,单位:秒voidCGameMain:GameMainLoop( floatfDeltaTime )switch(GetGameState() )/ 初始化游戏,清空上一局相关数据case 1:GameInit();SetGameState(2); / 初始化之后,将游戏状态设置为进行中break;/ 游戏进行中,处理各种游戏逻辑case 2:/猴子备选队列中的猴子数大于1或者该数量为1,但是猴子还没有完成向前移动的状态if(m_iNumMokeys1 |(m_iNumMokeys = 1 &m_iMoveMonkey0)GameRun(fDeltaTime );else / 游戏结束。调用游戏结算函数,并把游戏状态修改为结束状态SetGameState(0);GameEnd();break;/ 游戏结束/等待按空格键开始case 0:default:break;/=/ 每局开始前进行初始化,清空上一局相关数据voidCGameMain:GameInit()char* szName;floatx,y;for(int i=0;iSetSpritePosition(x,y);m_fLocationi = x;m_iNumMokeys = 6;m_fDelayTime = 1.f;/每隔1s移动一只猴子m_iNumLoseMonkeys = 0;/已经淘汰的猴子数量,初始为0start-SetSpriteVisible(false);/隐藏“空格开始”/=/ 每局游戏进行中voidCGameMain:GameRun( float fDeltaTime )if(m_iGameState=2)if(m_iMoveMonkey 0)/需要移动的数量大于0m_fDelayTime -= fDeltaTime;/计算经过的时间if(m_fDelayTimeSetSpritePosition(m_fLocationm_iChooseMonkey,-3);/移动猴子m_iChooseMonkey+;/下一只待移动的猴子编号m_iMoveMonkey-;/需要移动的猴子数量减少了1只/=/ 本局游戏结束voidCGameMain:GameEnd()start-SetSpriteVisible(true);/重现显示“空格开始”voidCGameMain:OnKeyDown( constintiKey, constboolbAltPress, constboolbShiftPress, constboolbCtrlPress )if(iKey = KEY_SPACE)if(m_iGameState = 0) / 游戏未开始m_iGameState = 1;else if(m_iNumMokeys1 &m_iGameState = 2 &m_iMoveMonkey = 0)/得到随机要淘汰的monkey序号m_iChooseMonkey = CSystem:RandomRange(0,m_iNumMokeys-1);/放入淘汰者队列m_Monkeysm_iChooseMonkey-SetSpritePosition(m_iNumLoseMonkeys*16-40,24);/置该猴子为淘汰,即NULLm_Monkeysm_iChooseMonkey = NULL;/将该猴子后面的猴子顺序向前移动一位for(int i=m_iChooseMonkey+1;im_iNumMokeys;i+)CSprite* t = m_Monkeysi-1;m_Monkeysi-1 = m_Monkeysi;m_Monkeysi = t;m_iNumLoseMonkeys+;/淘汰猴子数+1m_iNumMokeys-;/备选猴子数-1m_iMoveMonkey = m_iNumMokeys - m_iChooseMonkey;/后面需要移动的数量m_fDelayTime = 1;/重新设置延迟时间Main 类/-/-#include CommonClass.h#include LessonX.h/ 主函数入口/int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,intnCmdShow)/ 初始化游戏引擎if( !CSystem:InitGameEngine( hInstance, lpCmdLine ) )return 0;/ To do : 在此使用API更改窗口标题CSystem:SetWindowTitle(猴子选大王);/ 引擎主循环,处理屏幕图像刷新等工作while(CSystem:EngineMainLoop() )/ 获取两次调用之间的时间差,传递给游戏逻辑处理floatfTimeDelta=CSystem:GetTimeDelta();/ 执行游戏主循环g_GameMain.GameMainLoop(fTimeDelta );/ 关闭游戏引擎CSystem:ShutdownGameEngine();return 0;/=/ 引擎捕捉鼠标移动消息后,将调用到本函数voidCSystem:OnMouseMove( const float fMouseX, const float fMouseY )/ 可以在此添加游戏需要的响应函数/=/ 引擎捕捉鼠标点击消息后,将调用到本函数voidCSystem:OnMouseClick( constintiMouseType, const float fMouseX, const float fMouseY )/ 可以在此添加游戏需要的响应函数/=/ 引擎捕捉键盘按下消息后,将调用到本函数/ bAltPressbShiftPressbCtrlPress分别为判断Shift,Alt,Ctrl当前是否也处于按下状态。比如可以判断Ctrl+E组合键voidCSystem:OnKeyDown( constintiKey, constboolbAltPress, constboolbShiftPress, constboolbCtrlPress )g_GameMain.OnKeyDown(iKey, bAltPress, bShiftPress, bCtrlPress );/=/ 引擎捕捉键盘弹起消

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论