C语言课程设计--打飞碟
一、游戏介绍
打飞碟游戏是玩家通过鼠标控制大炮发射炮弹以及大炮发射时指向的方向,击毁从天空落下的飞碟。飞碟每次从不同的位置、以不同的速度向下落。打中不同的飞碟可以得到不同的分数。我们可以显示当前的得分。
二、实验目的
综合应用C语言知识开发一款小游戏。
三、实验内容
1、 游戏初始界面如下图。 2、 按下空格键后,“空格开始”消失,一局游戏开始。 3、 游戏开始后:
1) 鼠标变成十字星;
2) 地面上有一门大炮,玩家通过移动鼠标可以控制炮口在一定范围内上下移动; 3) 单击鼠标左键,大炮发射炮弹;
4) 每局游戏时间为30秒,在屏幕左上方显示,并适时更新游戏剩余时间; 5) 有大中小三种飞碟,按不同时间频率随机从屏幕顶部的某个位置落下。炮弹击中大飞碟加1分,击中中飞碟加2分,击中小飞碟加10分。得分显示在屏幕左上角。 6) 游戏时间到后,游戏停止,重新显示游戏初始界面。
7) 记录最高的5次游戏得分,按从高到低顺序显示在游戏底部。
游戏初始界面
四、实验准备
本实验中可能用到的C语言标准库函数和FunCode API Stdio.h 函数原型 功能与返回值 参数说明与应用举例 char szName[128]; int i=0; sprintf(szName, ”feichong_%d”, i); 将字符串”feichong_0”写入到szName中 int sprintf( char 把格式化的数组写入某个字*buffer, const char 符串。 *format, 返回值:字符串长度 [ argument] ? ) ; Math.h 函数原型 功能与返回值 参数说明与应用举例 float ftan = atan2( (y1-y0), (x1-x0) ); 计算通过点(x1,y1)到点(x0,y0)的连成的直线与X轴之间的夹角。 double atan2( double y, 计算y/x的反正切值。 double x ); 返回值:以弧度表示并介于 -pi 到 pi 之间(不包括 -pi)。如需使用角度,需要转换。 String.h 函数原型 功能与返回值 参数说明与应用举例 extern char 找出str2字符串在str1字strstr(szName, *strstr(char *str1, 符串中第一次出现的位置“feichong”) != NULL char *str2); (不包括str2的串结束符)。 说明szName中包含feichong 返回值:返回该位置的指针, 如找不到,返回空指针。 extern int 比较字符串s1和s2。 strcmp(const char 当s1s2时,返回值>0 FunCode API 函数原型 float dGetScreenLeft(); float dGetScreenRight(); float dGetScreenTop(); float dGetScreenBottom(); float dGetSpritePositionX(const char* szName); 功能与返回值 获取屏幕左边界值 获取屏幕右边界值 获取屏幕上边界值 获取屏幕下边界值 获取精灵中心点的X坐标值 参数说明与应用举例 szName – 精灵名称。所有API均相同。 游戏中的精灵的名称不能相同。 strcmp(szName, “feichong_0”) == 0 说明szName与feichong_0相等 float dGetSpritePositionY(const char* szName); float dSetSpritePositionX(const char* szName); float dSetSpritePositionY(const char* szName); void dSetSpritePosition(const char* szName, const float fPosX, const float fPosY); 获取精灵中心点的Y坐标值 设置精灵中心点的X坐标值 设置精灵中心点的Y坐标值 设置精灵中心点的X和Y坐标值,用来将精灵放置在某个指定位置。 dSetSpritePosition(“feichong_0”, 0, 0); 将名称为”feichong_0”的精灵的中心点设置在坐标(0, 0)上 void 设置精灵X轴方向速dSetSpriteLinearVelocityX(度 const char* szName, const float fVelX); void 设置精灵Y轴方向速dSetSpriteLinearVelocityY(度 const char* szName, const float fVelY); void 设置精灵X轴和Y轴方dSetSpriteLinearVelocity(c向速度 onst char* szName, const float fVelX, const float fVelY); float dGetSpriteRotation(const char* szName); 获取精灵的旋转角度 原图的角度 调整后的角度 获得的旋转角度即为两张图片的角度差 float 设置图片的旋转角度 dSetSpriteRotation(const char* szName, float fRot); void dSetTextValue(const 设置文字精灵的整数char* szName, int iVal); 数值 fRot>0,图片顺时针旋转; fRot<0,图片逆时针旋转。 dSetTextValue(“score”, 100); 名称为score的文字精灵显示100 bVisible为true,可见; 为false,不可见。 void 设置精灵可见或不可dSetSpriteVisible(const 见 char* szName, bool bVisible); void dShowCursor(const bool 设置鼠标可见或不可bShow); 见 void dDeleteSprite(const 删除精灵 char* szName); bool 判断某个坐标点dIsPointInSprite(const (fPosX, fPosY)是否char* szName, const float 在精灵内部 fPosX, const float fPosY); bool dCloneSprite(const 复制一个精灵。 char* szSrcName, const 返回值:1 – 复制成char* szTarName); 功; 0 – 复制失败。地图中没有找到对应名称的精灵用于复制。 void dSetSpriteWorldLimit(const char*szName, const EWorldLimit Limit, const float fLeft, const float fTop, const float fRight, const float fBottom) 设置精灵的世界边界,精灵碰到边界时,会激发精灵与边界的碰撞事件。因此,设置精灵位置时,考虑到精灵自身大小,最好离开边界一段距离。 bShow为true,可见; 为false,不可见。 常用于判断一个物体是不是碰到另外一个物体 做法:一般在地图上摆放一个精灵作为模板,并设置好各种属性。不仅复制图片,还复制属性。 szSrcName – 作为模板的精灵 szTarName – 新的精灵名称 fLeft - 左边界值 fTop - 上边界值 fRight - 右边界值 fBottom- 下边界值 Limit - 统一使用 WORLD_LIMIT_NULL fPosX:目标点的X坐标值 fPosY:目标点的Y坐标值 fSpeed:移动速度 iAutoStop:移动到终点之后是否自动停止, true 停止 false 不停止 void让精灵从当前位置飞 dSpriteMoveTo(const 向另外一点 char *szName, const float fPosX, const float fPosY, const float fSpeed, const bool iAutoStop ); int dRandomRange(const int 获取一个位于[iMin, int d = dRandomRange[0,3] iMin, const int iMax); iMax]之间的随机整数 d值可能为0, 1, 2或3 五、实验指南
实验一 游戏的开始和结束
【实验内容】
步骤一、按空格键,游戏开始,“空格开始”字样消失,设置初始时间为30,初始积分为0,鼠标消失。
步骤二、移动鼠标,控制炮筒上下旋转。
步骤三、游戏开始后,左上角实时显示剩余时间。
步骤四、当超过30秒,游戏结束,重新显示“空格开始“字样,游戏时间设为0,重新显示鼠标,炮口回到初始位置。
【实验思路】