《C语言课程设计桌球》由会员分享,可在线阅读,更多相关《C语言课程设计桌球(17页珍藏版)》请在金锄头文库上搜索。
1、C语言课程设计桌球C语言课程设计-桌球 一、实验内容 玩家通过移动球杆到单一的桌球处碰撞桌球运动,当桌球于一定速度通过桌面右方的同样颜色的球洞后,则该球进洞,在桌面左边重新分配新球开始游戏。要求如下: 1. 游戏的初始界面如下,其中左边有一个体积较小的桌球,其x方向位置固定,y方向位置随机。右边有八个颜色不一样,体积较大的球洞,游戏的目的是使用左边的桌球以一定小的速度穿过右边同样颜色的球洞就算桌球进洞,然后重新分配新球。 2. 3. 4. 5. 球杆随鼠标运动而运动,单击球杆,桌球获取一个前进的速度同时往前有运动。桌球的前进方向有一段指示球运动方向的虚线。 右侧的球洞以移动的频率不断更换位置。
2、球洞的x左边不变,更换的是y坐标的位置,即每一轮中每一个球洞移动到下一个球洞的位置,最下边的球洞则移动到第一个球洞位置。所以的这些动作都要在一个频率的时间里面完成。因此当游戏一某一个频率进行的时候,右侧的球洞就能实现循环变化的效果。 球碰撞到桌面边沿的时候以发射角的角度弹走。 球进洞的判断是球以一定的速度通过同样颜色的球洞时,桌球消失,表明球进洞了,此时左侧随机生成新球。球运动到球洞的速度不能太大,太大则球直接运动过球洞,如果速度太小,则球同样不进洞。 二、实验指南 实验一开始实验 步骤一、打开FunCode,创建一个的C+语言项目; 步骤二、导入snooker模板。 按实验指导完成。 1、
3、打开FunCode,点击“项目”菜单,选择“创建C语言工程” 注意:工程名名称要求字母开头,只能包含字母和数字,且名字中间不能有空格。 2、 点击菜单“项目”中的“导入地图模块”,如图一。跳出一个对话框,选中“snooker”模板,点击“导入到工程”按钮,如图二。 图 一 图 二 3、导入成功后的,界面如下图所示: 实验二初始化桌球和球杆同时在球的前进方向画虚线 步骤一、设置球的初始位置,球杆的初始朝向 步骤二、设置球杆随鼠标移动 步骤三、在球的前进方向上画虚线 在设置初始球的时候要考虑随机本局的球数字,如果和上一局的不一致,则将上局的球拉到屏幕外,将本局的球拉到屏幕内,在Y向上随机摆放球的出
4、生位置,只随机Y方向坐标,不动X方向。对于球杆则通过系统的dOnMouseMove函数获取到鼠标移动时的坐标位置,然后使用dSetSpritePosition函数同步设置桌球精灵的位置。通过获取球的X和Y坐标,并求两个坐标平方和的平方根来得到球运动方向向量的大小,利用循环调用系统画线函数画虚线。 1. 在Main.cpp中,初始化几个全局变量,代码如下: / 游戏玩法设计:上方有8个球洞,分别是数字0-7,球洞间的数字按一定速率滚 / 动,每局球都随机一个0-7的数字,对应的数字打入对应的球洞才胜利,开始打球 / 状态 g_iPlayState = 0; g_fRotateTime = 0.f
5、; g_fHoleRollTime = 0.f; 2. 初始化精灵: / 使用循环,给数组赋值: / 将数组的8个值分别赋值0-7即可,无需随机。名字使用dMakeSpriteName分 / 别产生,为BallHole0 - BallHole7 / 球洞精灵预先摆放在场景中,因此不需要创建 int iLoop = 0; for( iLoop = 0; iLoop B减去A得到一条由A指向B的向量。 /下面的计算,得到一条球杆坐标指向球坐标的向量 float fVectorX = float fVectorY = fBallPosX - fCuePosX; fBallPosY - fCuePos
6、Y; fBallPosX = fBallPosY = fCuePosX = fCuePosY = dGetSpritePositionX( g_szBallName ); dGetSpritePositionY( g_szBallName ); dGetSpritePositionX( BallCue ); dGetSpritePositionY( BallCue ); 3) 判断球和球杆不重合的时候就执行画线操作。所以还需要在上面的代码后面添加一个if的判断,同时计算向量的大小,以及将该向量单位化: if( fVectorX 0.001f | fVectorX 0.001f | fVecto
7、rY -0.001f ) / 计算该向量的大小,以及将该向量单位化(sqrt函数是开平方函数,回想下/ 数学里如何求单位向量) float fVectorSize = sqrt( fVectorX * fVectorX + fVectorY * fVectorY ); float fDirX = fVectorX / fVectorSize; float fDirY = fVectorY / fVectorSize; 4) 用循环,与上一个if判断平行,画出球前进方向的虚线: / 我们用循环画12段首尾相连的线段,如果全部画出来就是一条实线,如果循环/ 变量为偶数就画,为奇数就不画,那么就得到
8、一条虚线 / 画一条线需要前后两个点: 一个点使用LastPos,一个点使用NewPos。循环12/ 次,按照下面步骤写代码: / NewPos等于LastPos加上Dir乘以PosStep(单位向量乘以长度值等于该向量上/ 的一个坐标点) / 当循环变量为偶数的时候,使用dDrawLine画一根线 / 在画了线之后,将NewPos赋值给LastPos int iLoop = 0; float fLastPosX = fBallPosX, fLastPosY = fBallPosY; float fNewPosX float fPosStep = 0.f, fNewPosY = 0.f; =
9、fVectorSize / 10.f; for( iLoop = 0; iLoop 12; iLoop+ ) / 新坐标等于前一坐标加上向量方向上的一个距离值 fNewPosX fNewPosY = fLastPosX + fDirX * fPosStep; = fLastPosY + fDirY * fPosStep; / 偶数段就画 if( iLoop % 2 = 0 ) dDrawLine( fLastPosX, fLastPosY, fNewPosX, fNewPosY, 2.f, 0, 0, 255, 0, 255 ); / 坐标往前移动(NewPos赋值给LastPos) fLastPosX = fNewPosX; fLastPosY = fNewPosY; 实验三 球洞来回循环滚动 步骤、循环改变球洞的位置实现来回滚动 使用循环,将数组值分别往后移动一位,最后一位移动到第一位。同时移动精灵名字数组,移动对应的精灵Y坐标(移动精灵。使用dGetSpritePositionY获取精灵的位置,交换一下,用dSetSpritePositionY赋值回去) 思路:先取出最后一个的值、名字、Y坐标,由后往前遍历数组,依次将前一个的值覆盖当前的值,最后将取出来的值赋值给第一个(这一步是在循环结束后做) 1. 在Main.cpp中