C语言贪吃蛇

#include<stdio.h>
#include<conio.h>
#include<windows.h>
#define High 20                            //定义边界
#define Width 45
//定义全局变量
int canvas[High][Width]={0};                //定义元素;0为空格,-1为边界,1为蛇头,>1为蛇身,-2为食物
int food_x,food_y;                                  //食物坐标
int moveDirection;                              //蛇移动方向,1,2,3,4,对应上下左右
void HideCursor()                       //隐藏光标
{
 CONSOLE_CURSOR_INFO cursor_info = {1, 0};
 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void gotoxy(int x,int y)            //光标移动到(x,y)位置
{
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(handle,pos);
}
void startup()                              //数据初始化
{
    int i,j;
    //初始化食物坐标
    food_x=rand()%(High-5)+2;
    food_y=rand()%(Width-5)+2;
    canvas[food_x][food_y]=-2;
    //边界初始化
    for(i=0;i<High;i++)
    {
        canvas[i][Width-1]=-1;
        canvas[i][0]=-1;
    }

    for(j=0;j<Width;j++)
    {
        canvas[High-1][j]=-1;
        canvas[0][j]=-1;
    }

    //蛇头 蛇身初始化
    canvas[High/2][Width/2]=1;
    for(i=1;i<=4;i++)
        canvas[High/2][Width/2-i]=i+1;

    moveDirection=4;                    //初始化小蛇移动方向
    HideCursor();                       //隐藏光标
}
void moveSnakeByDirection()             //小蛇移动
{
    int i,j;
    int max=0;
    int oldTail_i,oldTail_j;                    //记录旧蛇尾
    int oldHead_i,oldHead_j;                //记录旧蛇头
    int newHead_i,newHead_j;           //记录新蛇头
    for(i=0;i<High-1;i++)
    {
        for(j=0;j<Width-1;j++)
        {
            if(canvas[i][j]>0)
            {
                canvas[i][j]++;
                if(max<canvas[i][j])
                {
                    max=canvas[i][j];
                    oldTail_i=i;                        //记录旧蛇尾坐标
                    oldTail_j=j;
                }
                if(canvas[i][j]==2)
                {
                    oldHead_i=i;            //记录旧蛇头坐标
                    oldHead_j=j;
                }
            }
        }
    }
        //新蛇头
        if(moveDirection==1)
        {
            newHead_i=oldHead_i-1;
            newHead_j=oldHead_j;
        }
         if(moveDirection==2)
        {
            newHead_i=oldHead_i+1;
            newHead_j=oldHead_j;
        }
         if(moveDirection==3)
        {
            newHead_i=oldHead_i;
            newHead_j=oldHead_j-1;
        }
         if(moveDirection==4)
        {
            newHead_i=oldHead_i;
            newHead_j=oldHead_j+1;
        }
        //判断小蛇吃到食物
        if(canvas[newHead_i][newHead_j]==-2)
        {
            canvas[food_x][food_y]=-0;                      //吃到食物,食物消失,生成新食物,长度自动加一
            food_x=rand()%(High-5)+2;
            food_y=rand()%(Width-5)+2;
            canvas[food_x][food_y]=-2;
        }
        else
            canvas[oldTail_i][oldTail_j]=0;                 //旧蛇尾为0
        //判断校舍是否撞到自身
        if(canvas[newHead_i][newHead_j]>0 ||  canvas[newHead_i][newHead_j]==-1)
        {
            printf("游戏结束\n");
            exit(0);
        }
        else
             canvas[newHead_i][newHead_j]=1;
}
void show()                                 //显示界面
{
    int i,j;
    gotoxy(0,0);                                //光标移动到(0,0)
    for(i=0;i<High;i++)
    {
        for(j=0;j<Width;j++)
        {
            if(canvas[i][j]==0)
                printf(" ");                                            //输出空格
            else if(canvas[i][j]==-1)
                printf("#");                                        //输出边界
            else if(canvas[i][j]==1)
                printf("@");                                    //输出蛇头
            else if(canvas[i][j]==-2)
                printf("@");                                        //输出食物
            else if(canvas[i][j]>1)
                printf("*");                                    //输出蛇身
        }
        printf("\n");
    }
    Sleep(100);
}
void updateWithoutInput()       //无需用户输入的更新
{
    moveSnakeByDirection();         //小蛇移动函数
}
void updateWithInput()              //需要用户输入的更新
{
    char input;
    if(kbhit())
    {
        input=getch();
        if(input=='w')
            moveDirection=1;
        else if(input=='s')
            moveDirection=2;
        else if(input=='a')
                moveDirection=3;
        else if(input=='d')
                moveDirection=4;
   }
}
int main()
{
    startup() ;                             //数据初始化
    while(1)
    {
        show() ;                                //显示界面
        updateWithoutInput();      //无需用户输入的更新
        updateWithInput();              //需要用户输入的更新
    }
}

猜你喜欢

转载自blog.csdn.net/qq_40685101/article/details/80379147