当前位置:文档之家› 10 C语言课程设计_坦克大战(提高篇)

10 C语言课程设计_坦克大战(提高篇)


int
strcmp(const char
*s1,const char * s2);
比较字符串 s1 和 s2。 当 s1<s2 时,返回值<0 当 s1=s2 时,返回值=0 当 s1>s2 时,返回值>0
strcmp(szName, “feichong_0”) == 0 说 明 szName 与 feichong_0 相 等
struct Weapon{
char
szName[128];
//
// 精灵坐标
float
fSpeedX, fSpeedY; // X 和 Y 方向上速度
float
fFireTime;
// 敌方坦克距下一次开炮的剩余时间
int iHp;
// 生命值
int iDir;
功能与返回值 获取屏幕左边界值 获取屏幕右边界值 获取屏幕上边界值 获取屏幕下边界值 获取精灵中心点的 X 坐标值
获取精灵中心点的 Y 坐标值
设置精灵中心点的 X 坐标值
设置精灵中心点的 Y 坐标值
设置精灵中心点的 X 和 Y 坐标值,用来将精 灵放置在某个指定位 置。
设置精灵 X 轴方向速 度
设置精灵 Y 轴方向速 度
属性。不仅复制图片,还复制
0 – 复制失败。地图 属性。
中没有找到对应名称 szSrcName – 作 为 模 板 的 精
的精灵用于复制。 灵
szTarName – 新的精灵名称
设置精灵的世界边界, fLeft - 左边界值
精灵碰到边界时,会激 fTop - 上边界值
发精灵与边界的碰撞 fRight - 右边界值
char szName[128];
int i=0;
sprintf(szName,

feichong_%d”, i);
将 字 符 串 ” feichong_0 ” 写 入
到 szName 中
Math.h
函数原型 double atan2( double y, double x );
功能与返回值 计算 y/x 的反正切值。 返回值:以弧度表示并介于 -pi 到 pi 之 间 ( 不 包 括 -pi )。如 需 使 用 角 度 ,需 要 转换。
void
dSetSpriteVisible(const
char*
szName,
bool
bVisible);
void dShowCursor(const bool
bShow);
void dDeleteSprite(const
char* szName);
bool
dIsPointInSprite(const
词来表示这种数字的含义。
enum Direction{
UP
= 0,
// 上方
RIGHT = 1,
// 右方
DOWN = 2,
// 下方
LEFT };
=3
// 左方
enum Role
{
MYTANK
= 0,
// 我方坦克
ENEMYTANK = 1,
// 敌方坦克
MYBULLET = 2,
// 我方子弹
参数说明与应用举例
找出 str2 字符串在 str1 字 strstr(szName,
符 串 中 第 一 次 出 现 的 位 置 “feichong”) != NULL
(不包括 str2 的串结束符)。 说明 szName 中包含 feichong
返回值:返回该位置的指针,
如找不到,返回空指针。
extern
ENEMYBULLET = 3
// 敌方子弹
};
除此之外,我们还需要定义一些全局变量来控制程序,根据程序需求,我们目前能考虑
到表示游戏状态的变量、表示游戏得分的变量、游戏剩余时间变量以及距离下一辆坦克产生
的时间等变量;
// 游戏地图,0 表示此处为空,1 表示此处有墙。根据游戏空间大小、墙以及坦克大小,
FunCode API
函数原型 float dGetScreenLeft(); float dGetScreenRight(); float dGetScreenTop(); float dGetScreenBottom(); float dGetSpritePositionX(const char* szName);
五、程序初步设计
如果程序规模比较小的时候,我们习惯一上手就写代码,边写边调整。但是当程序越来
越大,代码越来越多的时候,如果我们还用这种方式编程,程序写到一半的时候,你可能会
恨不得重写一遍。
此,我们在写代码之前,先把程序功能细化一下,并初步设计好程序结构,包括数据结
构和自定义函数。有了比较清晰的思路以后,再开始开发程序。
四、实验准备
本实验中可能用到的 C 语言标准库函数和 FunCode API
Stdio.h
函数原型 int sprintf( char *buffer, const char *format, [ argument] … ) ;
功能与返回值 把格式化的数组写入某个字 符串。 返回值:字符串长度
参数说明与应用举例
float dGetSpriteRotation(const char* szName);
获取精灵的旋转角度
原图的角度
float dSetSpriteRotation(const char* szName, float fRot); void dSetTextValue(const char* szName, int iVal);
参数说明与应用举例 float ftan = atan2( (y1-y0), (x1-x0) ); 计算通过点(x1,y1)到点(x0,y0) 的连成的直线与 X 轴之间的夹 角。
String.h
函数原型 extern *strstr(char char *str2);
char *str1,
功能与返回值
C 语言课程设计--坦克大战
一、游戏介绍
玩家坦克与敌方坦克在街道中进行巷战,玩家坦克被击中、玩家指挥部被击中或游戏时 间到,一局游戏结束。
二、实验目的
综合应用 C 语言知识和设计知识开发一款小游戏。
三、实验内容
初始界面如下图。 按下空格键后游戏开始,“空格开始”消失,载入地图,并把玩家坦克设置在指挥部左 侧。 游戏时间到,比如 30 秒,玩家坦克被敌方坦克摧毁,或者玩家指挥部被摧毁,一局游 戏结束,游戏回到初始界面,并显示上一局的分数。 游戏区域为下图中最内部的黑色区域,左上角坐标[-26, -22],右下角坐标为[26, 22]。 墙为正方形,边长为 4,坦克也是正方形,比墙略小一点。 玩家用 WASD 键控制坦克上、下、左、右运行,按 J 键开炮。玩家坦克碰到墙就停下来, 需要调转方向才能继续前进。玩家坦克开炮,一炮就能摧毁一块墙,或者一辆敌方坦克。玩 家没摧毁一辆敌方坦克,加 1 分。 玩家指挥部被坦克或者炮弹(不管玩家还是敌方)碰上,都会被摧毁。 每隔几秒钟,比如 3 秒,就会产生一辆敌方坦克。敌方坦克每隔一段时间,比如 1 秒, 就自动开炮。敌方坦克遇到墙就会停下来。停下来的坦克,前方的墙如果被摧毁了,又能继 续前进。每隔几秒钟,比如 2 秒,敌方坦克就会顺时针变换一个方向前进。
const
EWorldLimit Limit, const
float fLeft, const float
fTop, const float fRight,
const float fBottom)
void
dSpriteMoveTo(const
char *szName, const float
fPosX, const float fPosY,
void dSetSpriteLinearVelocityX( const char* szName, const float fVelX); void dSetSpriteLinearVelocityY( const char* szName, const float fVelY); void dSetSpriteLinearVelocity(c onst char* szName, const float fVelX, const float fVelY);
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);
设置图片的旋转角度
调整后的角度 获得的旋转角度即为两张图片的 角度差 fRot>0,图片顺时针旋转; fRot<0,图片逆时针旋转。
设置文字精灵的整数 数值
设置精灵可见或不可 见
dSetTextValue( “ score ” , 100); 名称为 score 的文字精灵显示 100 bVisible 为 true,可见; 为 false,不可见。
在本项目中,我们要操作的对象有 6 个:玩家坦克、敌方坦克、玩家子弹、敌方子弹、
墙、玩家指挥部。
其中,墙和指挥部都比较简单,主要是前 4 种,而且它们有共通性:名称、速度、位置,
因此,可以考虑用一个结构体来表示。此外,我们需要用一种数据结构来管理它们。由于敌
方坦克、子弹的数量都无法事先确定,所以我们选择链表而不是数组来管理它们。
// 我们把地图分成 11 行,13 列,每格大小刚好放一块墙。
相关主题