c语言版贪吃蛇
全局设置
//设置
#define SNAKE_MAX_LENGTH 20
#define SNAKE_HEAD 'H'
#define SNAKE_BODY 'X'
#define BLANK_CELL ' '
#define SNAKE_FOOD '$'
#define WALL_CELL '*'
void snakeMove(int,int);//贪吃蛇的移动
void print();//输出
void put_food(void);//食物的放置
char map[15][15] =
{"************",
"*XXXXH *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"************"};
int flag=0;//判断蛇死活 ,0代表live,1代表dead
int food=0;//判断是否有食物,0代表无,1代表有
//snake的存储
int snakeX[SNAKE_MAX_LENGTH]={1,1,1,1,1};
int snakeY[SNAKE_MAX_LENGTH]={1,2,3,4,5};
int snakeLength = 5;
//食物坐标
int foodX,foodY;
//步骤
char step;
实现:
1.关于snake的移动思路:
1.简单移动版本
此时只要简单的将蛇的头向移动的方向移动,蛇其它位置移动到原来蛇身的前一部分即可
void snakeMove(int dx,int dy)
{
//dx , dy是得到移动的方向
int i;
//判断有没有自己碰到自己或者碰墙
if(snakeY[snakeLength - 1] + dy == snakeY[snakeLength - 2] && snakeX[snakeLength - 1] + dx == snakeX[snakeLength - 2])
return;
else if (map[snakeX[snakeLength - 1] + dx][snakeY[snakeLength - 1] + dy] == 'X'||map[snakeX[snakeLength - 1] + dx][snakeY[snakeLength - 1] + dy] == '*')
flag=1;
else
{ //实现移动
map[snakeX[0]][snakeY[0]]=' ';
//先移动蛇身体部分
for(i=0;i<snakeLength-1;i++)
{
snakeX[i] = snakeX[i + 1];
snakeY[i] = snakeY[i + 1];
}
snakeX[snakeLength - 1] += dx;
snakeY[snakeLength - 1] += dy;
//处理头部同时进行标记
map[snakeX[snakeLength-1]][snakeY[snakeLength-1]]='H';
//标记移动后的蛇
for (i = 0; i < snakeLength - 1; i++)
map[snakeX[i]][snakeY[i]] = 'X';
}
}
2.食物版本(在简单移动的基础上考虑食物)
void snakeMove(int dx,int dy)
{
int i;
if(snakeY[snakeLength - 1] + dy == snakeY[snakeLength - 2] && snakeX[snakeLength - 1] + dx == snakeX[snakeLength - 2])
return;
else if (map[snakeX[snakeLength - 1] + dx][snakeY[snakeLength - 1] + dy] == 'X'||map[snakeX[snakeLength - 1] + dx][snakeY[snakeLength - 1] + dy] == '*')
flag=1;
else
{
if(map[snakeX[snakeLength - 1] + dx][snakeY[snakeLength - 1] + dy] != '$')
{
map[snakeX[0]][snakeY[0]]=' ';
for(i=0;i<snakeLength-1;i++)
{
snakeX[i] = snakeX[i + 1];
snakeY[i] = snakeY[i + 1];
}
snakeX[snakeLength - 1] += dx;
snakeY[snakeLength - 1] += dy;
map[snakeX[snakeLength-1]][snakeY[snakeLength-1]]='H';
for (i = 0; i < snakeLength - 1; i++)
map[snakeX[i]][snakeY[i]] = 'X';
}
else
{
food=0;
put_food();
snakeLength++;
map[snakeX[snakeLength-2]][snakeY[snakeLength-2]]='X';
snakeX[snakeLength-1]=snakeX[snakeLength - 2]+dx;
snakeY[snakeLength-1]=snakeY[snakeLength - 2]+dy;
map[snakeX[snakeLength-1]][snakeY[snakeLength-1]]='H';
}
}
}
2.放置食物:
/*
if(地图内有无食物)
{
生成食物;
if(食物在贪吃蛇上)
重新生成;
}
*/
void put_food(void)
{
if(food==0)
{
srand(time(NULL));
foodX=rand()%10+1;
foodY=rand()%10+1;
if(map[foodX][foodY]==' ')
map[foodX][foodY]='$';
else put_food();
food=1;
}
}
3.输出
void print(void)
{
/*输出当前字符矩阵*/
int i,j;
for(i=0;i<=11;i++)
{
for(j=0;j<=11;j++)
printf("%c",map[i][j]);
printf("\n");
}
}
主函数
int main()
{
put_food();
print();
while(scanf(" %c",&step)!=EOF)
{
switch(toupper(step))
{
case 'A':
snakeMove(0,-1);
break;
case 'D':
snakeMove(0,1);
break;
case 'W':
snakeMove(-1,0);
break;
case 'S':
snakeMove(1,0);
break;
}
if(flag==1)
{
printf("GAME OVER!\n");
break;
}
else
print();
}
return 0;
}
总结:
贪吃蛇的实现主要难在其移动上,但是如果能理解其移动的时候变的部分其实只有头和尾巴,那么就十分简单了