暑期C++程序实践-计算机应用实践报告.doc_第1页
暑期C++程序实践-计算机应用实践报告.doc_第2页
暑期C++程序实践-计算机应用实践报告.doc_第3页
暑期C++程序实践-计算机应用实践报告.doc_第4页
暑期C++程序实践-计算机应用实践报告.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

北京科技大学计算机应用实践报告机房名称 逸夫楼904 时 间2014年6月30日至7月18日 学 院 机械工程学院 专业班级 物流1302 姓名 学号 指导教师 成 绩 2014年 7月说 明一、 计算机应用实践是本科教学重要的实践教学环节,是提高学生应用计算机能力的重要措施。所有参加计算机应用实践教学活动的学生都必须撰写实践报告二、 计算机应用实践报告的质量反映了计算机应用实践的教学质量,它是评定计算机应用实践成绩的主要依据之一。不交实践报告者不得参加实习成绩评定。三、 指导教师必须对学生的实践报告写出评语并在相应位置给出成绩并签字,否则本实践报告无效。四、 实践报告要求条理清晰,内容详尽,数据准确,字数不少于5000字。五、 计算机应用实践活动结束后请将本报告上交学院存档保存。计算机应用实践报告一、 问题的提出在选项目的时候我思考了一番,对于拼图,打飞碟,黄金矿工这些游戏比较熟悉,我一看到迷你高尔夫这个题目的时候感觉有点新奇,没碰到过,我想尝试下新的东西于是就选了这个游戏,希望能在了解基本框架的基础上添加一些新功能和优化一下游戏框架并且美化一下场景。以前小时候玩过各种各样的小游戏,对小游戏如何制作的过程十分好奇,我很盼望能够自己编出一个游戏来,通过一段课程的学习,我了解了游戏的基本制作过程,我选这个题目,具有一定的挑战性,但我相信自己能做好。比如看懂游戏基本代码,添加一些开始,计时,计分,游戏成功或者失败后的相应,以及游戏的优化和场景变换以及游戏的趣味性与逼真性等等都是我在制作游戏的过程中需要考虑的部分。由于我是个人制作,所以这个项目显得有点艰巨,但我会安排好时间,考虑到方方面面,把握好细节方面的处理,从而使迷你高尔夫从原先简单单调的小游戏变为一款功能完善,丰富多彩的小游戏。二、 游戏的整体设计及框架结构1. 游戏功能描述“迷你高尔夫”游戏是通过键盘控制球的运动,最终走出出口,考验了反应能力和思维能力。该游戏功能包括游戏的开始设置,游戏说明,游戏的计时和游戏的分数计算,以及包括背景的音乐播放,场景的变换和精灵的变化,一些特效的加入还有对游戏结束时的不同反应,这是一款相对完善的游戏。2. 游戏流程图“迷你高尔夫”游戏一局结束后的界面游戏中的功能初始界面及功能停止游戏时间,返回第一关游戏结束对成功与失败分别显示不同的语句显示本次游戏所得的分数每过一关变换场景和障碍物精灵不至于显得单调,每一关的场景都显得和谐漂亮按空格键开始游戏,游戏开始则响起背景音乐,同时开始倒计时单击GameDescription显示游戏说明单击说明消失则游戏说明消失三、 详细设计1.主函数模块main()函数模块 主要功能为完成游戏的计时,并在游戏进程中实时显示剩余时间并计算分数;调用其他函数来完成点击鼠标、按下鼠标、精灵与世界边界碰撞时的效果;实现说明文字的显示和影藏。步骤详细介绍: 第一步,进入游戏界面,显示文字说明; 第二步,根据需要查看游戏说明 第三步,空格进入游戏,设定初始时间为60秒,开始创造精灵,利用dSetSpriteVisble()隐藏无关文字。第四步,控制球的运动,计分计时。第五步,游戏结束;显示通关是否成功,成功的话显示本次所得的分数,失败则显示“游戏失败”文字。2.游戏的初始化操作功能:每局开始前进行初始化,清空上一局相关数据相关函数:void CGameMain:GameInit() m_iMoveState=0; ClearAllSprite(); InitLevel(); CreateAllSprite();3.游戏运行过程功能:1. 显示游戏剩余时间2. 计算游戏的分数3. 控制文字与图片的显示4. 控制球的运动状态和判断位置,控制关卡的转换相应函数:void CGameMain:GameRun( float fDeltaTime )m_iGameScore -= 2*fDeltaTime;m_fGameTime -= fDeltaTime;if(m_fGameTime 0)m_pTime-SetTextValue(int)m_fGameTime); /显示剩余时间m_pscore-SetTextValue(int)m_iGameScore); /显示剩余分数elsem_iCurLevel=1;InitLevel();m_iGameState = 0;CSystem:ShowCursor(true);m_pKaishi-SetSpriteVisible(true);m_jieshu-SetSpriteVisible( true );m_shuoming-SetSpriteVisible(true);if( 0 != m_iMoveState )floatfPosX=m_pControlBall-GetSpritePositionX();floatfPosY=m_pControlBall-GetSpritePositionY();intiIndexX=SpritePosXToIndexX( fPosX );intiIndexY=SpritePosYToIndexY( fPosY );/ 控制球已经出了边界,所以不需要再判断if( iIndexX = GRID_COUNT | iIndexY = GRID_COUNT )return;floatfNextPosX=fPosX;floatfNextPosY=fPosY;/if( 1 = m_iMoveState )fNextPosY -= m_fGridSize * 0.5f;else if( 2 = m_iMoveState )fNextPosY += m_fGridSize * 0.5f;else if( 3 = m_iMoveState )fNextPosX-= m_fGridSize * 0.5f;else if( 4 = m_iMoveState )fNextPosX+= m_fGridSize * 0.5f;intiNextIndexX=SpritePosXToIndexX( fNextPosX );int iNextIndexY=SpritePosYToIndexY( fNextPosY );/ 该边缘已经出了边界,不需要往下判断if( iNextIndexX = GRID_COUNT | iNextIndexY = GRID_COUNT )return;/1)是方块:if( RIGID_BLOCK = m_iGridDataiNextIndexYiNextIndexX |RIGID_BLOCK1 = m_iGridDataiNextIndexYiNextIndexX|RIGID_BLOCK2 = m_iGridDataiNextIndexYiNextIndexX|RIGID_BLOCK3 = m_iGridDataiNextIndexYiNextIndexX|RIGID_BLOCK4 = m_iGridDataiNextIndexYiNextIndexX)/ 清零移动状态m_iMoveState = 0;/ 速度清零,显示指示箭头m_pControlBall-SetSpriteLinearVelocity(0.f, 0.f);m_pGolfArrow-SetSpriteVisible(1);/ 把球和指示箭头设置在本方块的中心MoveSpriteToBlock( m_pControlBall, iIndexX, iIndexY );MoveSpriteToBlock( m_pGolfArrow, iIndexX, iIndexY );/2)是黑洞:else if( BLACK_HOLE = m_iGridDataiNextIndexYiNextIndexX )/ 将游戏状态设置为1,重新开始关卡m_iGameState=1;/3)是出口:else if( GOLF_EXIT = m_iGridDataiNextIndexYiNextIndexX )/ 将游戏状态设置为1,开始新关卡m_iGameState=1;/ 往下一关卡,如果已经是最大值,则返回第一关m_iCurLevel+;if( m_iCurLevel MAX_LEVEL )m_chenggong-SetSpriteVisible( true );m_fGameTime=0;m_iCurLevel = 1;InitLevel();m_iGameState = 0;CSystem:ShowCursor(true);m_pKaishi-SetSpriteVisible(true);m_chenggong-SetSpriteVisible( true );m_scoretext-SetSpriteVisible(true);m_pscore-SetSpriteVisible(true);m_shuoming-SetSpriteVisible(true);5. 鼠标单击事件功能:控制游戏说明的显示与消失控制游戏的暂停和继续函数代码:void CGameMain:OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY )if(iMouseType=0&(fMouseX=-12&fMouseX=18&fMouseYSetSpriteVisible( true );m_xiaoshi-SetSpriteVisible( true );if(iMouseType=0&(fMouseX=-18&fMouseX=-27&fMouseYSetSpriteVisible( false );m_xiaoshi-SetSpriteVisible( false );if(iMouseType=0&(fMouseX=22&fMouseX=-38&fMouseYSetSpriteVisible( true );m_iGameState = 4;if(iMouseType=0&(fMouseX=-17&fMouseX=24&fMouseYSetSpriteVisible( false );m_iGameState = 2;6. 键盘控制事件功能:1.按下空格游戏开始,按下时同时进行一些初始化操作2.通过上下左右按键来控制球的运动方向函数代码:void CGameMain:OnKeyDown( const int iKey, const bool bAltPress, const bool bShiftPress, const bool bCtrlPress )/ 游戏还未开始,按下空格键,游戏开始。if( KEY_SPACE = iKey & 0 = m_iGameState )PlaySound(d:Sound.wav, NULL, SND_FILENAME | SND_ASYNC);m_chenggong-SetSpriteVisible( false );m_jieshu-SetSpriteVisible( false );m_scoretext-SetSpriteVisible(false);m_pscore-SetSpriteVisible(false);m_shuoming-SetSpriteVisible(false);m_description-SetSpriteVisible( false );m_xiaoshi-SetSpriteVisible( false );m_iGameState=1; / 游戏开始m_iGameScore=0;m_fGameTime=60.f;/游戏剩余时间m_iGameScore=120.f;/ 每局游戏开始,初始得分为0/m_pScore-SetTextValue( m_iGameScore );/ 每局游戏开始,初始时间为60m_pTime-SetTextValue(int)m_fGameTime);/ 隐藏 空格开始 提示图片m_pKaishi-SetSpriteVisible( false );/ 隐藏鼠标CSystem:ShowCursor( false );if( 2 != m_iGameState | 0 != m_iMoveState )return;floatfPosX=m_pControlBall-GetSpritePositionX(); floatfPosY=m_pControlBall-GetSpritePositionY(); intiIndexX=SpritePosXToIndexX( fPosX );intiIndexY=SpritePosYToIndexY( fPosY );if( iIndexX = GRID_COUNT | iIndexY = GRID_COUNT )return;/1)如果是按下向上方向键:if( KEY_UP = iKey )if( iIndexY 0 & RIGID_BLOCK = m_iGridDataiIndexY - 1iIndexX )return;/ 给予控制球一个方向速度,并设置移动状态、隐藏指示箭头m_iMoveState=1;m_pControlBall-SetSpriteLinearVelocityY(-60.f);m_pGolfArrow-SetSpriteVisible(0);/如果是按下向下方向键:else if( KEY_DOWN = iKey )if( iIndexY SetSpriteLinearVelocityY(60.f);m_pGolfArrow-SetSpriteVisible(0);/3)如果是按下向左方向键:else if( KEY_LEFT = iKey )if( iIndexX 0 & RIGID_BLOCK = m_iGridDataiIndexYiIndexX - 1 )return;/ 给予控制球一个方向速度,并设置移动状态、隐藏指示箭头m_iMoveState=3;m_pControlBall-SetSpriteLinearVelocityX(-60.f);m_pGolfArrow-SetSpriteVisible(0);/4)如果是按下向右方向键:else if( KEY_RIGHT = iKey )if( iIndexX SetSpriteLinearVelocityX(60.f);m_pGolfArrow-SetSpriteVisible(0);7. 世界边界控制事件功能:1 如果球运动出世界边界,则重新这个关卡2 控制鱼的运动边界函数代码:void CGameMain:OnSpriteColWorldLimit( const char *szName, const int iColSide )/if(strcmp(szName, fish0)=0)m_pFish-SetSpriteLinearVelocity(0,0);/dSetSpriteFlipX(fish0, true);/*if(strcmp(szName, fish0)=0)m_pFish-SetSpriteLinearVelocity(0, 0);/dSetSpriteFlipX(fish0, true);*/boolbFlip;floatfSpeedX;CSprite *tmp;if(strcmp(szName, fish0)=0)if(iColSide = 1) / 右边bFlip = true;fSpeedX = -CSystem:RandomRange(10, 20);else if(iColSide = 0) / 左边bFlip = false;fSpeedX = CSystem:RandomRange(10, 20);m_pFish-SetSpriteFlipX(bFlip);m_pFish-SetSpriteLinearVelocity(fSpeedX,0);else if(tmp = FindSpriteByName(szName)!=NULL)/如果找到同szName同名的精灵if(iColSide = 1)tmp-SetSpriteLinearVelocityX(-15.f);tmp-SetSpriteFlipX(true);else if(iColSide = 0)tmp-SetSpriteLinearVelocityX(15.f);tmp-SetSpriteFlipX(false);float fSpeedY;if(iColSide = 2)/上面tmp-SetSpriteLinearVelocityY(15.f);else if(iColSide = 3)/下面tmp-SetSpriteLinearVelocityY(-15.f);/*mySprite-SetSpriteLinearVelocityX(fSpeedX);float fPosY;CSprite* tmpSprite=FindSpriteByName(szName);tmpSprite-SetSpriteFlipX(bFlip);tmpSprite-SetSpriteLinearVelocity(fSpeedX, 0);fPosY=CSystem:RandomRange(m_fScreenTop+10.f, m_fScreenBottom-10.f);/因为有不同的鱼,因此随机生成Y方向的速度后需要分配给不同的/鱼,这样多条鱼就不会重复了/tmpSprite-SetSpritePositionY(fPosY); */ 只处理控制的球if( strcmp( szName, m_pControlBall-GetName() != 0 )return;/ 将游戏状态设置为1,重新开始关卡m_iGameState=1;8. 清除精灵模板功能:每换一个关卡清除上一个关卡的精灵函数代码:void CGameMain: ClearAllSprite()intiLoop= 0;for( iLoop = 0; iLoop DeleteSprite();for( iLoop = 0; iLoop DeleteSprite();for( iLoop = 0; iLoop DeleteSprite();for( iLoop = 0; iLoop DeleteSprite();9. 每个关卡的初始化设置功能:复制当前关卡的地图,并交换场景函数代码:void CGameMain: InitLevel()/ 总数置0,重新创建m_iRigidBlockCount=0;m_iBlackHoleCount=0;m_iGolfExitCount=0;/ 根据当前关卡,选择关卡数据switch( m_iCurLevel )case 2:m_changjing1-SetSpriteVisible( false );m_iControlStartX=5;m_iControlStartY=9;memcpy( m_iGridData, m_iLevelData2, sizeof(int) * GRID_COUNT * GRID_COUNT );break;case 3:m_changjing2-SetSpriteVisible( false );m_iControlStartX=3;m_iControlStartY=6;memcpy( m_iGridData, m_iLevelData3, sizeof(int) * GRID_COUNT * GRID_COUNT );break;case 4:m_changjing3-SetSpriteVisible( false );m_iControlStartX=3;m_iControlStartY=5;memcpy( m_iGridData, m_iLevelData4, sizeof(int) * GRID_COUNT * GRID_COUNT );break;case 5:m_changjing4-SetSpriteVisible( false );m_changjing5-SetSpriteVisible( false );m_iControlStartX=5;m_iControlStartY=5;memcpy( m_iGridData, m_iLevelData5, sizeof(int) * GRID_COUNT * GRID_COUNT );break;/ Level1 或者g_iCurLevel错误case 1:default:m_changjing1-SetSpriteVisible( true );m_changjing2-SetSpriteVisible( true );m_changjing3-SetSpriteVisible( true );m_changjing4-SetSpriteVisible( true );m_changjing5-SetSpriteVisible( true );m_iControlStartX=5;m_iControlStartY=6;memcpy( m_iGridData, m_iLevelData1, sizeof(int) * GRID_COUNT * GRID_COUNT );break;10. 每个关卡的精灵创建功能:创建当前关卡的障碍物,黑洞和出口精灵,并添加一些特效函数代码:void CGameMain: CreateAllSprite()intiLoopX = 0, iLoopY = 0;CSprite* tmpSprite;char*szName = NULL;for( iLoopY = 0; iLoopY GRID_COUNT; iLoopY+ )for( int iLoopX = 0; iLoopX CloneSprite(RigidBlockTemplate);MoveSpriteToBlock( tmpSprite, iLoopX, iLoopY );m_vRigidBlock.push_back(tmpSprite);m_iRigidBlockCount+;/如果是土豆,则创建土豆精灵:if( RIGID_BLOCK1 = m_iGridDataiLoopYiLoopX )szName=CSystem:MakeSpriteName(RigidBlock,m_iRigidBlockCount );tmpSprite=new CSprite(szName);tmpSprite-CloneSprite(RigidBlock1Template);MoveSpriteToBlock( tmpSprite, iLoopX, iLoopY );m_vRigidBlock.push_back(tmpSprite);m_iRigidBlockCount+;/如果是金块,则创建金块:if( RIGID_BLOCK2 = m_iGridDataiLoopYiLoopX )szName=CSystem:MakeSpriteName(RigidBlock,m_iRigidBlockCount );tmpSprite=new CSprite(szName);tmpSprite-CloneSprite(RigidBlock2Template);MoveSpriteToBlock( tmpSprite, iLoopX, iLoopY );m_vRigidBlock.push_back(tmpSprite);m_iRigidBlockCount+;/如果是鱼,则创建鱼:if( RIGID_BLOCK3 = m_iGridDataiLoopYiLoopX )szName=CSystem:MakeSpriteName(RigidBlock,m_iRigidBlockCount );tmpSprite=new CSprite(szName);tmpSprite-CloneSprite(RigidBlock3Template);MoveSpriteToBlock( tmpSprite, iLoopX, iLoopY );m_vRigidBlock.push_back(tmpSprite);m_iRigidBlockCount+;if(m_iRigidBlockCount=1)/ 获取屏幕的边界值m_fScreenLeft = CSystem:GetScreenLeft();m_fScreenRight = CSystem:GetScreenRight();m_fScreenTop = CSystem:GetScreenTop();m_fScreenBottom = CSystem:GetScreenBottom();/ 设置精灵世界边界m_pFish-SetSpriteWorldLimit(WORLD_LIMIT_NULL, m_fScreenLeft, m_fScreenTop, m_fScreenRight, m_fScreenBottom);m_pFish-SetSpriteLinearVelocity( 15, 0);/ 生成多条鱼精灵for(int i=1; iCloneSprite(fish_muban);/创建鱼精灵fPosX = CSystem:RandomRange(m_fScreenLeft+10.f, m_fScreenRight-10.f);fPosY = CSystem:RandomRange(m_fScreenTop+10.f,m_fScreenBottom-10.f);tmpSprite-SetSpritePosition(fPosX, fPosY);tmpSprite-SetSpriteWorldLimit(WORLD_LIMIT_NULL, m_fScreenLeft-10.f, m_fScreenTop, m_fScreenRight+10.f, m_fScreenBottom);fSpeedX = CSystem:RandomRange(10, 20);fSpeedY = CSystem:RandomRange(10, 20);tmpSprite-SetSpriteLinearVelocity(fSpeedX, fSpeedY);m_vFish.push_back(tmpSprite);for(int j=5; jCloneSprite(fish_muban2);/创建鱼精灵fPosX = CSystem:RandomRange(m_fScreenLeft+10.f, m_fScreenRight-10.f);fPosY = CSystem:RandomRange(m_fScreenTop+10.f,m_fScreenBottom-10.f);tmpSprite-SetSpritePosition(fPosX, fPosY);tmpSprite-SetSpriteWorldLimit(WORLD_LIMIT_NULL, m_fScreenLeft-10.f, m_fScreenTop, m_fScreenRight+10.f, m_fScreenBottom);fSpeedX = CSystem:RandomRange(10, 20);fSpeedY = CSystem:RandomRange(10, 20);tmpSprite-SetSpriteLinearVelocity(fSpeedX, fSpeedY);m_vFish.push_back(tmpSprite);if(m_iRigidBlockCount=1)szName=CSystem:MakeSpriteName(RigidBlock,m_iRigidBlockCount );tmpSprite=new CSprite(szName);tmpSprite-CloneSprite(texiao);MoveSpriteToBlock( tmpSprite, 5, 5 );m_vRigidBlock.push_back(tmpSprite);m_iRigidBlockCount+;if(m_iRigidBlockCount=2)szName=CSystem:MakeSpriteName(RigidBlock,m_iRigidBlockCount );tmpSprite=new CSprite(szName);tmpSprite-CloneSprite(texiao);MoveSpriteToBlock( tmpSprite,5, 10 );m_vRigidBlock.push_back(tmpSprite);m_iRigidBlockCount+;/如果是飞碟,则创建飞碟:if( RIGID_BLOCK4 = m_iGridDataiLoopYiLoopX )szName=CSystem:MakeSpriteName(RigidBlock,m_iRigidBlockCount );tmpSprite=new CSprite(szName);tmpSprite-CloneSprite(RigidBlock4Template);MoveSpriteToBlock( tmpSprite, iLoopX, iLoopY );m_vRigidBlock.push_back(tmpSprite);m_iRigidBlockCount+;if(m_iRigidBlockCount=1)szName=CSystem:MakeSpriteName(RigidBlock,m_iRigidBlockCount );tmpSprite=new CSprite(szName);tmpSprite-CloneSprite(baopo);MoveSpriteToBlock( tmpSprite, 3, 3 );m_vRigidBlock.push_back(tmpSprite);m_iRigidBlockCount+;if(m_iRigidBlockCount=2)szName=CSystem:MakeSpriteName(RigidBlock,m_iRigidBlockCount );tmpSprite=new CSprite(szName);tmpSprite-CloneSprite(baopo);MoveSpriteToBlock( tmpSprite,3, 8 );m_vRigidBlock.push_back(tmpSprite);m_iRigidBlockCount+;if(m_iRigidBlockCount=4)szName=CSystem:MakeSpriteName(RigidBlock,m_iRigidBlockCount );tmpSprite=new CSprite(szName);tmpSprite-CloneSprite(baopo);MoveSpriteToBlock( tmpSprite,8, 3 );m_vRigidBlock.push_back(tmpSprite);m_iRigidBlockCount+;if(m_iRigidBlockCount=5)szName=CSystem:MakeSpriteName(RigidBlock,m_iRigidBlockCount );tmpSprite=new CSprite(szName);tmpSprite-CloneSprite(baopo);MoveSpriteToBlock( tmpSprite,8, 8 );m_vRigidBlock.push_back(tmpSprite);m_iRigidBlockCount+;if(

温馨提示

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

评论

0/150

提交评论