1、C 语言课程设计语言课程设计-桌球桌球 一、实验内容一、实验内容 玩家通过移动球杆到单一的桌球处碰撞桌球运动, 当桌球于一定速度通过桌面右方的同 样颜色的球洞后,则该球进洞,在桌面左边重新分配新球开始游戏。要求如下: 1. 游戏的初始界面如下,其中左边有一个体积较小的桌球,其 x 方向位置固定,y 方 向位置随机。右边有八个颜色不一样,体积较大的球洞,游戏的目的是使用左边的 桌球以一定小的速度穿过右边同样颜色的球洞就算桌球进洞,然后重新分配新球。 2. 球杆随鼠标运动而运动,单击球杆,桌球获取一个前进的速度同时往前有运动。桌 球的前进方向有一段指示球运动方向的虚线。 3. 右侧的球洞以移动的频
2、率不断更换位置。球洞的 x 左边不变,更换的是 y 坐标的位 置,即每一轮中每一个球洞移动到下一个球洞的位置,最下边的球洞则移动到第一 个球洞位置。所以的这些动作都要在一个频率的时间里面完成。因此当游戏一某一 个频率进行的时候,右侧的球洞就能实现循环变化的效果。 4. 球碰撞到桌面边沿的时候以发射角的角度弹走。 5. 球进洞的判断是球以一定的速度通过同样颜色的球洞时, 桌球消失, 表明球进洞了, 此时左侧随机生成新球。 球运动到球洞的速度不能太大, 太大则球直接运动过球洞, 如果速度太小,则球同样不进洞。 二、实二、实验指南验指南 实验一开始实验实验一开始实验 【实验任务】 步骤一、打开 Fu
3、nCode,创建一个的 C+语言项目; 步骤二、导入 snooker 模板。 【实验思路】 按实验指导完成。 【实验指导】 1、 打开 FunCode,点击“项目”菜单,选择“创建 C 语言工程” 注意: 工程名名称要求字母开头, 只能包含字母和数字, 且名字中间不能有空格名字中间不能有空格。 2、 点击菜单“项目”中的“导入地图模块” ,如图一。跳出一个对话框,选中“snooker” 模板,点击“导入到工程”按钮,如图二。 图 一 图 二 3、导入成功后的,界面如下图所示: 实验二初始化桌球和球杆同时在球的前进方向画虚线实验二初始化桌球和球杆同时在球的前进方向画虚线 【实验内容】 步骤一、设
4、置球的初始位置,球杆的初始朝向 步骤二、设置球杆随鼠标移动 步骤三、在球的前进方向上画虚线 【实验思路】 在设置初始球的时候要考虑随机本局的球数字, 如果和上一局的不一致, 则将上局的球 拉到屏幕外,将本局的球拉到屏幕内,在 Y 向上随机摆放球的出生位置,只随机 Y 方向 坐标, 不动 X 方向。 对于球杆则通过系统的 dOnMouseMove 函数获取到鼠标移动时的坐 标位置,然后使用 dSetSpritePosition 函数同步设置桌球精灵的位置。通过获取球的 X 和 Y 坐标,并求两个坐标平方和的平方根来得到球运动方向向量的大小,利用循环调用系 统画线函数画虚线。 【实验指导】 1.
5、在 Main.cpp 中,初始化几个全局变量,代码如下: / 游戏玩法设计:上方有 8 个球洞,分别是数字 0-7,球洞间的数字按一定速率滚 / 动,每局球都随机一个 0-7 的数字,对应的数字打入对应的球洞才胜利,开始打球 / 状态 g_iPlayState = 0; g_fRotateTime = 0.f; g_fHoleRollTime = 0.f; 2. 初始化精灵: / 使用循环,给数组赋值: / 将数组的 8 个值分别赋值 0-7 即可,无需随机。名字使用 dMakeSpriteName 分 / 别产生,为 BallHole0 - BallHole7 / 球洞精灵预先摆放在场景中,
6、因此不需要创建 int iLoop = 0; for( iLoop = 0; iLoop B 减去 A 得到一条由 A 指向 B 的向量。 /下面的计算,得到一条球杆坐标指向球坐标的向量 float fVectorX = fBallPosX - fCuePosX; float fVectorY = fBallPosY - fCuePosY; 3) 判断球和球杆不重合的时候就执行画线操作。所以还需要在上面的代码后面添 加一个 if 的判断,同时计算向量(fVectorX,fVectorY)的大小,以及将该向量 单位化: if( fVectorX 0.001f | fVectorX 0.001f | fVectorY 0; iLoop- ) g_iHoleNumberiLoop = g_iHoleNumberiLoop - 1; / 先保存需要更改坐标的精灵的 Y 坐标作为下一个精灵的坐标,然后再给它 / 赋值 fTempPosY = dGetSpritePositionY( g_szHoleNameiLoop - 1