C语言,枚举啥的不太懂

这个代码错哪里了?怎么改?
我是新萌,

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/958823495486127.png "#left")

#include<stdio.h>
#include<process.h>
#include<windows.h>
#include<conio.h>
#include<time.h>
#include<stdlib.h>
#define WIDTH 40
#define HEIGH 12
enum direction //方向枚举类型
{
    LEFT,RIGHT,UP,DOWN
};
struct structFood//食物结构体
{
    int x;
    int y;
};
struct structNode//蛇身的结构
{
    int x;
    int y;
    struct structNode*pNext;
};
struct structSnake//蛇属性解构体
{
    int lenth;//长度
    enum direction dir;//方向
};
struct structFood*pFood;
struct structSnake*pSnake;
struct structpNode*pNode,*pTail;
int speech=200;//速度
int score=0;//分数
int smark=0;//吃食物标记
int stop=0;
void hideCursor(void);//隐藏光标
void gotoXY(int x,int y);//定位光标
void inittSnake(void);//构造蛇
void addNode(int x,int y);//增加蛇身
void initFood(void);//产生食物
void homePage(void);//主界面
void keybordHit(void);//监控键盘按钮
void move(void);//蛇移动
void draw(void);//画蛇
void eatFood(void);//吃到食物
void addTail(void);//增加蛇尾
int main(void)
{
    homePage();
    while(!stop)
    {
        keybordHit();//监控键盘按钮
        move();//蛇移动
        draw();//画蛇
        Sleep(speech);//暂时挂起线程
    }
    return 0;
}
void hideCursor(void)//隐藏光标
{
    CONSOLE_CURSOR_INFO cursorInfo={1,0};
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursorInfo);
}
void gotoXY(int x,int y)//定位光标
{
    COORD pos;
    pos.X=x-1;
    pos.Y=y-1;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void addNode(int x,int y)//增加蛇身
{
    struct structNode*newnode=
    (struct structNode*)malloc(sizeof(struct structNode));
    struct structNode*p=pNode;
    newnode->pNext=pNode;
    newnode->x=x;
    newnode->y=y;
    pNode=newnode;
    if(x<2 || x>=WIDTH || y<2 || y>=HEIGH)//碰到边界,失败
    {
        stop=1;
        gotoXY(10,19);
        printf("撞墙,游戏结束,按任意键退出!\n");
        getch();
        free(pNode);
        free(pSnake);
        exit(0);
    }
    while(p!=NULL)
    {
        if(p->pNext!=NULL)
           if((p->x==x)&&(p->y==y))
           {
               stop=1;
               gotoXY(10,19);
               printf("撞到自身,游戏结束,按任意键退出!\n");
               getch();
               free(pNode);
               free(pSnake);
               exit(0);
           }
           p=p->pNext;
    }
}
void initSnake(void)//构造蛇
{
    int i;
    pSnake=(struct structSnake*)malloc(sizeof(struct structSnake));
    pFood=(struct structFood*)malloc(sizeof(struct structFood));
    pSnake->lenth=5;
    pSnake->dir=RIGHT;
    for(i=2;i<=pSnake->lenth+2;i++)
    addNode(i,2);
}
void homePage(void)//主界面
{
    hideCursor();
    printf("------------------------------------------\n");
    printf("|\t\t\t\t       |\n");
    printf("|\t\t\t\t       |\n");
    printf("|\t\t\t\t       |\n");
    printf("|\t\t\t\t       |\n");
    printf("|\t\t\t\t       |\n");
    printf("|\t\t\t\t       |\n");
    printf("|\t\t\t\t       |\n");
    printf("|\t\t\t\t       |\n");
    printf("|\t\t\t\t       |\n");
    printf("|\t\t\t\t       |\n");
    printf("------------------------------------------\n");
    gotoXY(5,13);
    printf("按任意键开始游戏!按W.A.S.D控制方向");
    getch();
    initSnake();
    initFood();
    gotoXY(5,13);
    printf("                                 ");
}
void keybordHit(void)
{
    char ch;
    if(kbhit())
    {
        ch=getch();
        switch(ch)
        {
            case 'W':
            case 'w':
            //如果蛇本身方向向下,则按相反方向无效
            if(pSnake->dir==DOWN)
            break;
            else
            pSnake->dir=UP;
            break;
            case 'A':
            case 'a'://如果蛇身方向本身向右,则按相反方向无效
            if(pSnake->dir==RIGHT)
            break;
            else
            pSnake->dir=LEFT;
            break;
            case 'S':
            case 's'://如果蛇身本来方向是向上,则按相反方向无效
            if(pSnake->dir==UP)
            break;
            else
            pSnake->dir=DOWN;
            break;
            case 'D':
            case 'd':
                //如果蛇身本来向左,则按相反方向无效
                if(pSnake->dir==LEFT)
                break;
                else
                pSnake->dir=RIGHT;
                break;
            case 'O':
            case 'o':
                if(speech>=150)//减速
                speech=speech-50;
                break;
            case 'P':
            case 'p':
                    if(speech<=400)//加速
                    speech=speech+50;
                    break;
                    case ' ':
                        gotoXY(15,18);
                        printf("游戏已暂停,按任意键恢复游戏");
                        system("pause>nul");
                        gotoXY(15,18);
                        printf("                            ");
                        break;
                        default:break;
        }
    }
}
void initFood(void)//产生食物
{
    struct structNode*p=pNode;
    int mark=1;
    srand((unsigned)time(NULL));//以时间为种子产生随机数
    while(1)
    {
        pFood->x=rand()%(WIDTH-2)+2;//食物X坐标
        pFood->y=rand()%d(HEIGH-2)+2;//食物Y坐标
        while(p!=NULL)
        {
            //如果食物产生在蛇身上,则重新生成食物
            if((pFood->x==p->x)&&(pFood->y==p->y))
            {
                mark=0;
                break;
            }
            p=p->pNext;
        }
        if(mark==1)
        {
            gotoXY(pFood->x,pFood->y);
            printf("%c",3);
            break;
        }
        mark=1;
        p=pNode;
    }
}
void move(void)//蛇移动
{
    struct structNode*q,*p=pNode;
    if(pSnake->dir==RIGHT)
    {
        addNode(p->x+1,p->y);
        if(smark==0)
        {
            while(p->pNext!=NULL)
            {
                q=p;
                p=p->pNext;
            }
            q->pNext=NULL;
            free(p);
        }
    }
    if(pSnake->dir==LEFT)
    {
        addNode(p->x-1,p->y);
        if(smark==0)
        {
            while(p->pNext!=NULL)
            {
                q=p;
                p=p->pNext;
            }
            q->pNext=NULL;
            free(p);
        }
    }
    if(pSnake->dir==UP)
    {
        addNode(p->x,p->y-1);
        if(smark==0)
        {
            while(p->pNext!=NULL)
            {
                q=p;
                p=p->pNext;
            }
            q->pNext=NULL;
            free(p);
        }
    }
    if(pSnake->dir==DOWN)
    {
        addNode(p->x,p->y+1);
        if(smark==0)
        {
            while(p->pNext!=NULL)
            {
                q=p;
                p=p->pNext;
            }
            q->pNext=NULL;
            free(p);
        }
    }
}
void draw(void)//画蛇
{
    struct structNode*p=pNode;
    while(p!=NULL)
    {
        gotoXY(p->x,p->y);
        printf("%c",2);
        pTail=p;
        p=p->pNext;
    }
    if(pNode->x==pFood->x&&pNode->y==pFood->y)
    {
        smark=1;
        eatFood();
        initFood();            }
    if(smark==0)
    {
        gotoXY(pTail->x,pTail->y);
        printf("%c",' ');
    }
    else
    {
        gotoXY(pTail->x,pTail->y);
        printf("%c",' ');
        smark=0;
    }
    gotoXY(50,12);
    printf("食物:%d,%d",pFood->x,pFood->y);
    gotoXY(50,5);
    printf("分数:%d",score);
    gotoXY(50,7);
    printf("速度:%d",speech);
    gotoXY(15,14);
    printf("按O键加速");
    gotoXY(15,15);
    printf("按P键减速");
    gotoXY(15,16);
    printf("按空格键暂停");
}
void eatFood(void)//吃到食物
{
    addTail();
    score++;
}
void addTail(void)//增加蛇尾
{
    struct structNode*newnode
    =(struct structNode*)malloc(sizeof(struct structNode));
    struct structNode*p=pNode;
    pTail->pNext=newnode;
    newnode->x=50;
    newnode->y=20;
    newnode->pNext=NULL;
    pTail=newnode;
}
    

img

  • 先看截图

img

  • 修改如下【报错的位置添加了"修改描述"】:
 
#include<stdio.h>
#include<process.h>
#include<windows.h>
#include<conio.h>
#include<time.h>
#include<stdlib.h>
#define WIDTH 40
#define HEIGH 12
enum direction //方向枚举类型
{
    LEFT,RIGHT,UP,DOWN
};
struct structFood//食物结构体
{
    int x;
    int y;
};
struct structNode//蛇身的结构
{
    int x;
    int y;
    struct structNode*pNext;
};
struct structSnake//蛇属性解构体
{
    int lenth;//长度
    enum direction dir;//方向
};
struct structFood*pFood;
struct structSnake*pSnake;
struct structNode*pNode,*pTail; // 修改,没有 structpNode
int speech=200;//速度
int score=0;//分数
int smark=0;//吃食物标记
int stop=0;
void hideCursor(void);//隐藏光标
void gotoXY(int x,int y);//定位光标
void inittSnake(void);//构造蛇
void addNode(int x,int y);//增加蛇身
void initFood(void);//产生食物
void homePage(void);//主界面
void keybordHit(void);//监控键盘按钮
void move(void);//蛇移动
void draw(void);//画蛇
void eatFood(void);//吃到食物
void addTail(void);//增加蛇尾
int main(void)
{
    homePage();
    while(!stop)
    {
        keybordHit();//监控键盘按钮
        move();//蛇移动
        draw();//画蛇
        Sleep(speech);//暂时挂起线程
    }
    return 0;
}
void hideCursor(void)//隐藏光标
{
    CONSOLE_CURSOR_INFO cursorInfo={1,0};
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursorInfo);
}
void gotoXY(int x,int y)//定位光标
{
    COORD pos;
    pos.X=x-1;
    pos.Y=y-1;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void addNode(int x,int y)//增加蛇身
{
    struct structNode*newnode=
    (struct structNode*)malloc(sizeof(struct structNode));
    struct structNode*p=pNode;
    newnode->pNext=pNode;
    newnode->x=x;
    newnode->y=y;
    pNode=newnode;
    if(x<2 || x>=WIDTH || y<2 || y>=HEIGH)//碰到边界,失败
    {
        stop=1;
        gotoXY(10,19);
        printf("撞墙,游戏结束,按任意键退出!\n");
        getch();
        free(pNode);
        free(pSnake);
        exit(0);
    }
    while(p!=NULL)
    {
        if(p->pNext!=NULL)
           if((p->x==x)&&(p->y==y))
           {
               stop=1;
               gotoXY(10,19);
               printf("撞到自身,游戏结束,按任意键退出!\n");
               getch();
               free(pNode);
               free(pSnake);
               exit(0);
           }
        p=p->pNext; // 修改,往前缩进一个tab键
    }
}
void initSnake(void)//构造蛇
{
    int i;
    pSnake=(struct structSnake*)malloc(sizeof(struct structSnake));
    pFood=(struct structFood*)malloc(sizeof(struct structFood));
    pSnake->lenth=5;
    pSnake->dir=RIGHT;
    for(i=2;i<=pSnake->lenth+2;i++)
    addNode(i,2);
}
void homePage(void)//主界面
{
    hideCursor();
    printf("------------------------------------------\n");
    printf("|\t\t\t\t       |\n");
    printf("|\t\t\t\t       |\n");
    printf("|\t\t\t\t       |\n");
    printf("|\t\t\t\t       |\n");
    printf("|\t\t\t\t       |\n");
    printf("|\t\t\t\t       |\n");
    printf("|\t\t\t\t       |\n");
    printf("|\t\t\t\t       |\n");
    printf("|\t\t\t\t       |\n");
    printf("|\t\t\t\t       |\n");
    printf("------------------------------------------\n");
    gotoXY(5,13);
    printf("按任意键开始游戏!按W.A.S.D控制方向");
    getch();
    initSnake();
    initFood();
    gotoXY(5,13);
    printf("                                 ");
}
void keybordHit(void)
{
    char ch;
    if(kbhit())
    {
        ch=getch();
        switch(ch)
        {
            case 'W':
            case 'w':
            //如果蛇本身方向向下,则按相反方向无效
            if(pSnake->dir==DOWN)
            break;
            else
            pSnake->dir=UP;
            break;
            case 'A':
            case 'a'://如果蛇身方向本身向右,则按相反方向无效
            if(pSnake->dir==RIGHT)
            break;
            else
            pSnake->dir=LEFT;
            break;
            case 'S':
            case 's'://如果蛇身本来方向是向上,则按相反方向无效
            if(pSnake->dir==UP)
            break;
            else
            pSnake->dir=DOWN;
            break;
            case 'D':
            case 'd':
                //如果蛇身本来向左,则按相反方向无效
                if(pSnake->dir==LEFT)
                break;
                else
                pSnake->dir=RIGHT;
                break;
            case 'O':
            case 'o':
                if(speech>=150)//减速
                speech=speech-50;
                break;
            case 'P':
            case 'p':
                    if(speech<=400)//加速
                    speech=speech+50;
                    break;
                    case ' ':
                        gotoXY(15,18);
                        printf("游戏已暂停,按任意键恢复游戏");
                        system("pause>nul");
                        gotoXY(15,18);
                        printf("                            ");
                        break;
                        default:break;
        }
    }
}
void initFood(void)//产生食物
{
    struct structNode*p=pNode;
    int mark=1;
    srand((unsigned)time(NULL));//以时间为种子产生随机数
    while(1)
    {
        pFood->x=rand()%(WIDTH-2)+2;//食物X坐标
        pFood->y=rand()%(HEIGH-2)+2;//食物Y坐标  修改 ,多写了一个d
        while(p!=NULL)
        {
            //如果食物产生在蛇身上,则重新生成食物
            if((pFood->x==p->x)&&(pFood->y==p->y))
            {
                mark=0;
                break;
            }
            p=p->pNext;
        }
        if(mark==1)
        {
            gotoXY(pFood->x,pFood->y);
            printf("%c",3);
            break;
        }
        mark=1;
        p=pNode;
    }
}
void move(void)//蛇移动
{
    struct structNode*q,*p=pNode;
    if(pSnake->dir==RIGHT)
    {
        addNode(p->x+1,p->y);
        if(smark==0)
        {
            while(p->pNext!=NULL)
            {
                q=p;
                p=p->pNext;
            }
            q->pNext=NULL;
            free(p);
        }
    }
    if(pSnake->dir==LEFT)
    {
        addNode(p->x-1,p->y);
        if(smark==0)
        {
            while(p->pNext!=NULL)
            {
                q=p;
                p=p->pNext;
            }
            q->pNext=NULL;
            free(p);
        }
    }
    if(pSnake->dir==UP)
    {
        addNode(p->x,p->y-1);
        if(smark==0)
        {
            while(p->pNext!=NULL)
            {
                q=p;
                p=p->pNext;
            }
            q->pNext=NULL;
            free(p);
        }
    }
    if(pSnake->dir==DOWN)
    {
        addNode(p->x,p->y+1);
        if(smark==0)
        {
            while(p->pNext!=NULL)
            {
                q=p;
                p=p->pNext;
            }
            q->pNext=NULL;
            free(p);
        }
    }
}
void draw(void)//画蛇
{
    struct structNode*p=pNode;
    while(p!=NULL)
    {
        gotoXY(p->x,p->y);
        printf("%c",2);
        pTail=p;
        p=p->pNext;
    }
    if(pNode->x==pFood->x&&pNode->y==pFood->y)
    {
        smark=1;
        eatFood();
        initFood();            }
    if(smark==0)
    {
        gotoXY(pTail->x,pTail->y);
        printf("%c",' ');
    }
    else
    {
        gotoXY(pTail->x,pTail->y);
        printf("%c",' ');
        smark=0;
    }
    gotoXY(50,12);
    printf("食物:%d,%d",pFood->x,pFood->y);
    gotoXY(50,5);
    printf("分数:%d",score);
    gotoXY(50,7);
    printf("速度:%d",speech);
    gotoXY(15,14);
    printf("按O键加速");
    gotoXY(15,15);
    printf("按P键减速");
    gotoXY(15,16);
    printf("按空格键暂停");
}
void eatFood(void)//吃到食物
{
    addTail();
    score++;
}
void addTail(void)//增加蛇尾
{
    struct structNode*newnode
    =(struct structNode*)malloc(sizeof(struct structNode));
    struct structNode*p=pNode;
    pTail->pNext=newnode;
    newnode->x=50;
    newnode->y=20;
    newnode->pNext=NULL;
    pTail=newnode;
}
   

额,有一个地方拼写错误

img

还有就是将getch()函数更换为_getch()函数,