首先关于贪吃蛇的程序基本的功能无非就是让蛇移动,生成食物,吃到自己或者吃到墙就死了的结束判定,蛇吃食长大这几个部分。
1. 蛇移动可用如下函数实现:
其中包含了移动和吃食两种功能。
void snakeMove(int x, int y)
{
if(map[snakeY[snakeLength-1]+y][snakeX[snakeLength-1]+x] != '$')//如果下一步没有食物则正常走
{
int i, j;
int a = snakeY[snakeLength-1];
int b = snakeX[snakeLength-1];
map[snakeY[snakeLength-1]][snakeX[snakeLength-1]] = 'X';//先假设蛇都是'X',以便之后对于蛇身进行移动
map[snakeY[0]][snakeX[0]] = ' ';//蛇尾走了后就变成' '。
for(i = 1; i<snakeLength-1; i++)
{
map[snakeY[i]][snakeX[i]] = map[snakeY[i+1]][snakeX[i+1]];//移动蛇身
}
snakeX[snakeLength-1] += x;
snakeY[snakeLength-1] += y;
map[snakeY[snakeLength-1]][snakeX[snakeLength-1]] = 'H';
for(j = 0; j<snakeLength-2; j++)//接下来更新对于蛇身的坐标。
{
snakeX[j] = snakeX[j+1];
snakeY[j] = snakeY[j+1];
}
snakeY[snakeLength-2] = a;//注意这里蛇头的坐标赋给第二个时要赋未改变位置时的值。
snakeX[snakeLength-2] = b;
}
else//如果下一步有食物,则将数组界加一,把新加的那个坐标定为食物的坐标也即为蛇头,其余坐标均为身子
{
snakeLength += 1;
snakeX[snakeLength-1] = snakeX[snakeLength-2]+x;
snakeY[snakeLength-1] = snakeY[snakeLength-2]+y;
int i;
for(i = 0; i < snakeLength-1; i++)
{
map[snakeY[i]][snakeX[i]] = 'X';
}
map[snakeY[snakeLength-1]][snakeX[snakeLength-1]] = 'H';
ok = 0;
}
}
2. 生成食物
利用随机数来随机在地图内生成食物
void put_money()
{
int x, y;
while(ok == 0)
{
srand(time(0));
x = rand() % (9) + 1;
y = rand() % (9) + 1;
if(map[y][x] == ' ')
{
map[y][x] = '$';//用随机数在地图空白处生成食物
ok = 1;
break;
}
}
}
3. 游戏结束的判定
如果蛇吃到了墙或者自己就死了
void gameover()
{
int a = snakeX[snakeLength-1];
int b = snakeY[snakeLength-1];
if(a == 0 || b == 0 || a == 11 || b == 11)//判断是否在边界
{
judge = 0;
}
int i;
for(i = 0; i < snakeLength-1; i++)
{
if(b == snakeY[i] && a == snakeX[i])//判断是否吃到了身子
{
judge = 0;
}
}
}
除了上述功能外,还要通过不断输出和清屏来实现蛇的连续移动。
主函数如下:
int main(void) {
output();
char ch;
while(judge)//judge用来判断蛇是否越界
{
put_money();
ch =_getch();
switch (ch) {
case 'W':
snakeMove(0, -1);//向上
break;
case 'D':
snakeMove(1, 0);//向右
break;
case 'A':
snakeMove(-1, 0);//向左
break;
case 'S':
snakeMove(0, 1);//向下
break;
}
gameover();
if(judge == 0)
{
break;
}
system("cls");
output();
}
printf("game over!");
return 0;
}
这样就可以写成一个简单的通过WASD来移动吃食的贪吃蛇了。