C语言课程设计_桌球

上传人:zw****58 文档编号:44171142 上传时间:2018-06-08 格式:DOC 页数:13 大小:1.87MB
返回 下载 相关 举报
C语言课程设计_桌球_第1页
第1页 / 共13页
C语言课程设计_桌球_第2页
第2页 / 共13页
C语言课程设计_桌球_第3页
第3页 / 共13页
C语言课程设计_桌球_第4页
第4页 / 共13页
C语言课程设计_桌球_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《C语言课程设计_桌球》由会员分享,可在线阅读,更多相关《C语言课程设计_桌球(13页珍藏版)》请在金锄头文库上搜索。

1、C 语言课程设计语言课程设计-桌球桌球一、实验内容一、实验内容玩家通过移动球杆到单一的桌球处碰撞桌球运动,当桌球于一定速度通过桌面右方的 同样颜色的球洞后,则该球进洞,在桌面左边重新分配新球开始游戏。要求如下: 1.游戏的初始界面如下,其中左边有一个体积较小的桌球,其 x 方向位置固定,y 方 向位置随机。右边有八个颜色不一样,体积较大的球洞,游戏的目的是使用左边 的桌球以一定小的速度穿过右边同样颜色的球洞就算桌球进洞,然后重新分配新 球。2.球杆随鼠标运动而运动,单击球杆,桌球获取一个前进的速度同时往前有运动。 桌球的前进方向有一段指示球运动方向的虚线。 3.右侧的球洞以移动的频率不断更换位

2、置。球洞的 x 左边不变,更换的是 y 坐标的 位置,即每一轮中每一个球洞移动到下一个球洞的位置,最下边的球洞则移动到 第一个球洞位置。所以的这些动作都要在一个频率的时间里面完成。因此当游戏 一某一个频率进行的时候,右侧的球洞就能实现循环变化的效果。 4.球碰撞到桌面边沿的时候以发射角的角度弹走。 5.球进洞的判断是球以一定的速度通过同样颜色的球洞时,桌球消失,表明球进洞 了,此时左侧随机生成新球。球运动到球洞的速度不能太大,太大则球直接运动 过球洞,如果速度太小,则球同样不进洞。二、实验指南二、实验指南实验一开始实验实验一开始实验【实验任务】 步骤一、打开 FunCode,创建一个的 C+语

3、言项目;步骤二、导入 snooker 模板。【实验思路】 按实验指导完成。【实验指导】 1、 打开 FunCode,点击“项目”菜单,选择“创建 C 语言工程”注意:工程名名称要求字母开头,只能包含字母和数字,且名字中间不能有空名字中间不能有空 格格。 2、 点击菜单“项目”中的“导入地图模块” ,如图一。跳出一个对话框,选中“snooker”模板,点击“导入到工程”按钮,如图二。图 一 图 二 3、导入成功后的,界面如下图所示:实验二初始化桌球和球杆同时在球的前进方向画虚线实验二初始化桌球和球杆同时在球的前进方向画虚线【实验内容】 步骤一、设置球的初始位置,球杆的初始朝向 步骤二、设置球杆随

4、鼠标移动 步骤三、在球的前进方向上画虚线【实验思路】 在设置初始球的时候要考虑随机本局的球数字,如果和上一局的不一致,则将上局的 球拉到屏幕外,将本局的球拉到屏幕内,在 Y 向上随机摆放球的出生位置,只随机 Y 方向坐标,不动 X 方向。对于球杆则通过系统的 dOnMouseMove 函数获取到鼠标移动 时的坐标位置,然后使用 dSetSpritePosition 函数同步设置桌球精灵的位置。通过获取 球的 X 和 Y 坐标,并求两个坐标平方和的平方根来得到球运动方向向量的大小,利用 循环调用系统画线函数画虚线。【实验指导】1.在 Main.cpp 中,初始化几个全局变量,代码如下:/ 游戏玩

5、法设计:上方有 8 个球洞,分别是数字 0-7,球洞间的数字按一定速率 滚/ 动,每局球都随机一个 0-7 的数字,对应的数字打入对应的球洞才胜利,开始打 球/ 状态g_iPlayState= 0;g_fRotateTime = 0.f;g_fHoleRollTime = 0.f;2.初始化精灵:/ 使用循环,给数组赋值:/ 将数组的 8 个值分别赋值 0-7 即可,无需随机。名字使用 dMakeSpriteName 分/ 别产生,为 BallHole0 - BallHole7/ 球洞精灵预先摆放在场景中,因此不需要创建intiLoop = 0;for( iLoop = 0; iLoop B

6、减去 A 得到一条由 A 指向 B 的向 量。/下面的计算,得到一条球杆坐标指向球坐标的向量floatfVectorX =fBallPosX - fCuePosX;floatfVectorY =fBallPosY - fCuePosY;3) 判断球和球杆不重合的时候就执行画线操作。所以还需要在上面的代码后面添 加一个 if 的判断,同时计算向量(fVectorX,fVectorY)的大小,以及将该向量 单位化:if( fVectorX 0.001f | fVectorX 0.001f | fVectorY 1.f )g_fHoleRollTime -= 1.f;4.在上面的 if 判断里面添加

7、下面代码:/ 取出最后一个值iLastData=g_iHoleNumber7;fLastPosY=dGetSpritePositionY( g_szHoleName7 );strcpy( szLastName, g_szHoleName7 );/ 从后往前遍历数组。注意只需要做 6 次循环(iLoop 由 7 递减至 1)for( iLoop = 7; iLoop 0; iLoop- )g_iHoleNumberiLoop =g_iHoleNumberiLoop - 1;/ 先保存需要更改坐标的精灵的 Y 坐标作为下一个精灵的坐标,然后再给它 / 赋值fTempPosY=dGetSpriteP

8、ositionY( g_szHoleNameiLoop - 1 );dSetSpritePositionY( g_szHoleNameiLoop - 1, fLastPosY );fLastPosY =fTempPosY;strcpy( g_szHoleNameiLoop, g_szHoleNameiLoop - 1 );/ 将取出来的最后一个值赋值给第一个g_iHoleNumber0 =iLastData;strcpy( g_szHoleName0, szLastName );dSetSpritePositionY( g_szHoleName0, fLastPosY );5.至此,球洞循环来

9、回滚动的实验结束。实验四实验四 击打桌球击打桌球【实验内容】 步骤一、处理鼠标单击事件,球杆角度变化 步骤二、球杆击打之后,桌球获取一个向前运动的速度【实验思路】 获取系统鼠标点击的消息,判断游戏是否在进行以及球是否可以击打(即 g_iPlayState 不等于 0) ,然后球杆旋转,模拟打球的操作。之后获取球和球杆之间的向量用来计算 速度,最后利用 dSetSpriteLinearVelocity 函数给该球一个速度,同时用 dSetSpriteDamping 函数给球一个减速系数。【实验指导】1.在 Main.cpp 中添加如下变量声明:float g_fRotateTime;/ 球杆拍下

10、时,做个角度旋转,持续一小段时间,模拟拍下的动作2.进入 Main.cpp 中对变量 g_fRotateTime 进行初始化:g_fRotateTime=0.f;3.在 dOnMouseClick 中填入如下代码:1) 只响应游戏中可以点击打球的状态if( 2 != g_iGameState | 0 != g_iPlayState )return;2) 改变球的状态,同时给球杆一个旋转,模拟打球动作,这个过程持续一定的时 间g_iPlayState = 1;g_fRotateTime=0.2f;dSetSpriteRotation( “BallCue“, g_fOldRotation + 10

11、.f );3) 获取球和球杆之间的变量(通过获取坐标得到)/ 球的位置floatfPosX=dGetSpritePositionX( g_szBallName );floatfPosY=dGetSpritePositionY( g_szBallName );/ 有 A,B 两点坐标,求两点间向量 = B 减去 A 得到一条由 A 指向 B 的向量。/ 下面的计算,得到一条鼠标坐标指向球坐标的向量floatfVectorX =fPosX - fMouseX;floatfVectorY =fPosY - fMouseY;4) 通过上面的变量计算球的速度,同时让球运动已经添加一个减速系数使其慢慢 减

12、速到静止。/ 将该向量放大,得到我们想要的速度fVectorX *= 12.f;fVectorY *= 12.f;/ 给球设置该速度,以及设置一个速度衰减系数,使其逐渐停止dSetSpriteLinearVelocity( g_szBallName, fVectorX, fVectorY );dSetSpriteDamping( g_szBallName, 1.6f );4.球杆按下之后做了旋转,需要对其进行复位。在 while 循环的最后面添加下面的代 码:/ 球杆按下之后,做了个旋转。时间到了,将球杆复位if( g_fRotateTime 0.f )g_fRotateTime-= fDel

13、taTime;if( g_fRotateTime “碰撞”里选中“发送碰撞”2 同样,依次在地图中点击上图中的四个桌球台边沿精灵,分别给左右上下的边起 名字为:VerSide1、VerSide0、HorSide0、HorSide1 进入精灵与精灵碰撞函数,碰 撞的算法是这样的:碰到垂直的边的时候,将当前球的 X 方向速度取反即可得到反 弹效果。水平方向则是对 Y 取反.如下图:水平方向上:3 垂直方向上:1) 判断是否是我们控制的球碰撞到边界if( strcmp( szSrcName, g_szBallName ) = 0 | strcmp( szTarName, g_szBallName )

14、 = 02) 在上面的 if 里面再进行判断,如果球碰到水平边(即上下边沿)则按下面代码 处理:3) 判断碰撞到垂直还是水平边if( strstr( szSrcName, “VerSide“ ) | strstr( szTarName, “VerSide“ ) )floatfVelX=dGetSpriteLinearVelocityX( g_szBallName );dSetSpriteLinearVelocityX( g_szBallName, fVelX * -1.f );4) 如果球碰到垂直边(即左右边沿)则按下面代码处理:else if( strstr( szSrcName, “Hor

15、Side“ ) | strstr( szTarName, “HorSide“ ) )floatfVelY=dGetSpriteLinearVelocityY( g_szBallName );dSetSpriteLinearVelocityY( g_szBallName, fVelY * -1.f );至此,本实验结束。实验六桌球进洞实验六桌球进洞【实验内容】 步骤、桌球以一定速度移动到球洞中,则判为进洞,将球移出屏幕,生成新球【实验思路】 判断球是否正在运动,是的话则获取该球的速度,同时判断该球的速度是否符合进洞 速度要求以及该球的坐标是否在同款颜色的球洞精灵中,是的话则认为球进洞,将球 移出

16、屏幕,左侧生成新球。【实验指导】1.在 Main.cpp 的 while 循环当中,前面以及有过判断球是否运动的 if( 0 = g_iPlayState )操作了,只需要在后面添加一个 else 语句,判断球进洞的操作在 else 里面执行。2.在球洞精灵初始化的后面,填入如下代码:/ 判断球是否位于球洞内。floatfVelX=dGetSpriteLinearVelocityX( g_szBallName );floatfVelY=dGetSpriteLinearVelocityY( g_szBallName );/ 计算速度向量的大小.sqrt 是开平方函数floatfSpeedValue=sqrt( fVelX * fVelX + fVelY * fVelY );3.判断球的速度,小于 30.f 时获取球的坐标,g_spBallHoleg_i

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号