1、10 C语言课程设计坦克大战提高篇C语言课程设计-坦克大战一、游戏介绍玩家坦克与敌方坦克在街道中进行巷战,玩家坦克被击中、玩家指挥部被击中或游戏时间到,一局游戏结束。二、实验目的综合应用C语言知识和设计知识开发一款小游戏。三、实验内容初始界面如下图。按下空格键后游戏开始,“空格开始”消失,载入地图,并把玩家坦克设置在指挥部左侧。游戏时间到,比如30秒,玩家坦克被敌方坦克摧毁,或者玩家指挥部被摧毁,一局游戏结束,游戏回到初始界面,并显示上一局的分数。游戏区域为下图中最内部的黑色区域,左上角坐标-26, -22,右下角坐标为26, 22。墙为正方形,边长为4,坦克也是正方形,比墙略小一点。玩家用W
2、ASD键控制坦克上、下、左、右运行,按J键开炮。玩家坦克碰到墙就停下来,需要调转方向才能继续前进。玩家坦克开炮,一炮就能摧毁一块墙,或者一辆敌方坦克。玩家没摧毁一辆敌方坦克,加1分。玩家指挥部被坦克或者炮弹(不管玩家还是敌方)碰上,都会被摧毁。每隔几秒钟,比如3秒,就会产生一辆敌方坦克。敌方坦克每隔一段时间,比如1秒,就自动开炮。敌方坦克遇到墙就会停下来。停下来的坦克,前方的墙如果被摧毁了,又能继续前进。每隔几秒钟,比如2秒,敌方坦克就会顺时针变换一个方向前进。四、实验准备本实验中可能用到的C语言标准库函数和FunCode APIStdio.h函数原型功能与返回值参数说明与应用举例int sp
3、rintf( char *buffer, const char *format, argument ) ;把格式化的数组写入某个字符串。返回值:字符串长度char szName128;int i=0;sprintf(szName, ”feichong_%d”, i);将字符串”feichong_0”写入到szName中Math.h函数原型功能与返回值参数说明与应用举例double atan2( double y, double x );计算y/x的反正切值。返回值:以弧度表示并介于 -pi 到 pi 之间(不包括 -pi)。如需使用角度,需要转换。float ftan = atan2( (y1
4、-y0), (x1-x0) );计算通过点(x1,y1)到点(x0,y0)的连成的直线与X轴之间的夹角。String.h函数原型功能与返回值参数说明与应用举例extern char *strstr(char *str1, char *str2);找出str2字符串在str1字符串中第一次出现的位置(不包括str2的串结束符)。 返回值:返回该位置的指针,如找不到,返回空指针。strstr(szName, “feichong”) != NULL说明szName中包含feichongextern int strcmp(const char *s1,const char * s2);比较字符串s1和
5、s2。当s1s2时,返回值s2时,返回值0strcmp(szName, “feichong_0”) = 0说明szName与feichong_0相等FunCode API函数原型功能与返回值参数说明与应用举例float dGetScreenLeft();获取屏幕左边界值float dGetScreenRight();获取屏幕右边界值float dGetScreenTop();获取屏幕上边界值float dGetScreenBottom();获取屏幕下边界值float dGetSpritePositionX(const char* szName);获取精灵中心点的X坐标值szName 精灵名称。
6、所有API均相同。游戏中的精灵的名称不能相同。float dGetSpritePositionY(const char* szName);获取精灵中心点的Y坐标值float dSetSpritePositionX(const char* szName);设置精灵中心点的X坐标值float dSetSpritePositionY(const char* szName);设置精灵中心点的Y坐标值void dSetSpritePosition(const char* szName, const float fPosX, const float fPosY);设置精灵中心点的X和Y坐标值,用来将精灵放
7、置在某个指定位置。dSetSpritePosition(“feichong_0”, 0, 0);将名称为”feichong_0”的精灵的中心点设置在坐标(0, 0)上void dSetSpriteLinearVelocityX(const char* szName, const float fVelX);设置精灵X轴方向速度void dSetSpriteLinearVelocityY(const char* szName, const float fVelY);设置精灵Y轴方向速度void dSetSpriteLinearVelocity(const char* szName, const f
8、loat fVelX, const float fVelY);设置精灵X轴和Y轴方向速度float dGetSpriteRotation(const char* szName);获取精灵的旋转角度 原图的角度 调整后的角度获得的旋转角度即为两张图片的角度差float dSetSpriteRotation(const char* szName, float fRot);设置图片的旋转角度fRot0,图片顺时针旋转;fRot 0.f) / 一局游戏进行中 else / 一局游戏结束 g_bStart = false; else / 游戏结束后处理 6、 一局游戏开始后,在WinMain函数中的主循
9、环里,通过dSetTextValue把(int)g_fGameTime的数值显示在名为“time”的文字精灵里,从而实时显示剩余时间(显示整秒的时间)。7、 一局游戏进行中,每循环一次,g_fGameTime减去一次刷屏的时间。当g_fGameTime0,说明一局游戏时间已完,游戏停止,重新显示“空格开始“字样。注意:g_iStart要改为0,否则下一局就不能正确判断游戏开始或结束。8、 我们定义一个MoveMyTank函数来处理玩家坦克的运动。因为玩家坦克是用键盘控制的,所以需要传递两个参数,一个用来表示按下或松开了哪个键盘,一个用来表示是按下还是松开。按下W键,设置玩家坦克向上的速度;按下
10、A键,设置向左速度;按下S键,设置向下的速度,按下D键,设置向右速度。松开键盘,坦克速度为0。此外,按下键盘时,还需要相应设置坦克朝向iDir。注意:如果函数定义写在函数调用之后,需要在函数调用前面进行声明。void MoveMyTank(int iKey, int iPress)9、 完成函数,我们在dOnKeyDown和dOnKeyUp函数中进行调用。/ 按下键盘if(g_bStart) / 一局游戏进行中 if(iKey = KEY_W | iKey = KEY_A | iKey = KEY_S | iKey = KEY_D ) MoveMyTank(iKey, 1); / 松开键盘if
11、(g_bStart)if(iKey = KEY_W | iKey = KEY_A | iKey = KEY_S | iKey = KEY_D ) MoveMyTank(iKey, 0);10、 玩家坦克开到边界时,让它停止运动。我们在dOnSpriteColWorldLimit函数中,设设置玩家坦克速度为0。if(strcmp(szName, g_pMyTank-szName)=0) / 玩家坦克 dSetSpriteLinearVelocity(g_pMyTank-szName, 0.f, 0.f);11、 因为增加了新功能,我们在一局游戏结束时,就必须考虑到新情况:游戏结束时,坦克已经不在
12、原来位置了;坦克朝向发生变化;游戏结束的时候,玩家正好按下某个控制键,给坦克设置了速度。我们该如何处理这三种情况?实验二 玩家坦克在街道中运行【实验内容】步骤一、一局游戏开始时载入地图。步骤二、一局游戏结束后删除地图。步骤三、玩家坦克碰到墙的话,不能继续前行。【实验思路】 利用数组的值来载入地图,值为0,说明此处为空;值为1,说明此处有墙。 游戏开始后载入地图,但只能载入一次。如果不停载入,会占有大量资源。 游戏结束时,需要把地图中墙都删除。创建一个新的精灵,首先需要给它命名。有规则地给精灵命名,有利于我们对精灵进行处理。我们按照墙生成的先后顺序,分别给精灵命名为:wall0,wall1,wa
13、ll2 设置玩家坦克的碰撞属性,并专门定义一个函数处理玩家坦克发生碰撞后,玩家坦克的响应。【实验指导】1、 增加新的全局变量定义int g_iWallCount = 0; / 记录墙的数量int g_iMap1113; / 地图数组 一局游戏结束后,我们需要卸载地图,也就是把墙都删除了。因此,我们需要知道墙的数量。2、 定义LoadMap函数,用来载入地图。定义一个局部数组并初始化,然后依次赋值给全局数组。局部数组初始化如下:int iMap1113= 0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,0,1,0,1,0,1,0,1,0,1,0, 0,1,0,1,0,1,0,1,0,1,0,1,0, 0,1,0,1,0,1,1,1,0,1,0,1,0, 0,1,0,1,0,1,0,1,0,1,0,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,0,0,0,0,0, 0,1,0,1,0,0,0,0,0,1,0,1,0,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1