说明一下:目前实现了 时间显示、碰撞、蛇身的增加 、转向。剩下的就是障碍的出现还有地图的设置。这些就留给朋友们自己发挥创意了。
总共分四个文件。 贪吃蛇头文件、时间显示头文件、常用设置头文件还有主函数文件。
//SNake.h
//贪吃蛇头文件
/******************** 常量定义区 *******************/
//一个节点的宽
#define FTB_W 27
//一个节点的高
#define FTB_H 27
//蛇的最大长度
#define SK_MAX 15
/******************* 表面定义区 ********************/
//节点
SDL_Surface *fc_ftb = NULL;
/******************* 全局变量声明区 *********************/
//足球两种状态的坐标
struct point football[2] = {
{0,0}, {0,27}};
//当前蛇的长度
unsigned int body_length = 0;
//蛇身的组
struct object body_list[SK_MAX];
/******************* 函数定义区 ********************/
//初始化蛇的节点表面
void Init_Snake(char *pic)
{
fc_ftb = IMG_Load(pic);
if(fc_ftb == NULL) printf("Error[Init_Snake()]:Init snake failed!/n");
}
//蛇的图片变换
void ChangPic()
{
for(int i = body_length-1; i > 0; i--)
{
if(body_list[i].seq == 1) body_list[i].seq = 0;
else body_list[i].seq = 1;
body_list[i].xs = football[body_list[i].seq].xpos;
body_list[i].ys = football[body_list[i].seq].ypos;
}
}
//增加节点
void AddNode()
{
body_list[body_length].seq = 0;
body_length++;
}
//蛇头可否转向的判定 0不可转
int CanTurn(struct object *head, int direction)
{
if(head->direction == 1 || head->direction == 2)
switch(direction)
{
case 1:
break;
case 2:
break;
case 3:
head->direction = 3;
return 3;
case 4:
head->direction = 4;
return 4;
default:
break;
}
if(head->direction == 3 || head->direction == 4)
switch(direction)
{
case 1:
head->direction = 1;
return 1;
case 2:
head->direction = 2;
return 2;
case 3:
break;
case 4:
break;
default:
break;
}
return 0;
}
//获得键盘
void GetKey(struct object *body)
{
Uint8 *keys = SDL_GetKeyState(NULL);
int LEFT = 1, RIGHT = 2, UP = 3, DOWN = 4;
if(keys[SDLK_DOWN])
CanTurn(body,DOWN);
else if(keys[SDLK_UP])
CanTurn(body,UP);
else if(keys[SDLK_LEFT])
CanTurn(body,LEFT);
else if(keys[SDLK_RIGHT])
CanTurn(body,RIGHT);
}
//蛇的身体的移动<