修改以下c语言程序代码

修改以下c语言代码,要求能在Head函数里实时反映出两条蛇的长度。

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<malloc.h>
#include<time.h>
#include<stdbool.h>

//#define X 20
//#define Y 20
int X,Y;   //游戏边界
unsigned char smp_type;//难度系数 main函数中 通过增加蛇的长度 来增减难度
  void Change(unsigned char type); //根据游戏边界确定难度  ,0,1,2   type 难度类型
  
enum Dir {enum_east,enum_south,enum_west,enum_north};  //枚举类型 方向 

struct Snake                                            //蛇结构体 
{
    int iX,iY;
    enum Dir emDir;            
};

struct Node                                                //链表的节点 
{
    struct Snake stSnake;
    int iCount;
    struct Node *pPre;
    struct Node *pNext;    
};

struct Node *g_pHead=NULL;
struct Node *g_pEnd=NULL;
struct Node *g_pHead1=NULL;
struct Node *g_pEnd1=NULL;

char g_Back[1000][1000];
void Head(void);//头 英文 
void Frame(void);//框架 英文 
void GotoXY(unsigned short hang,unsigned short lie);//去某行某列 
void CreatSnake(int iCount);//创造蛇 
void CreatSnake1(int iCount);
void Free();
void Free1();
void DrawSnake(void); 
void DrawSnake1(void); 
void Move(void);
void Move1(void);
void Drop(void);
void Drop1(void);
void KeyState(void);//箭头控制转向 
void Food(void);
void Appand(void);//附加 英文 
void Appand1(void);
bool Eat(void);
bool Eat1(void);
bool IsDie(void); 
bool IsDie1(void);
void HideCursor(); // 用于隐藏光标

 void Change(unsigned char type) //游戏边界)   //目前无用
{

    switch (type)
    {
    case 3:  //  困难 
        X=20;Y=20;
        GotoXY(0, 0);
                 
        printf("中等");
        break;
    case 2:  // 中等
                X=15;Y=15;
        GotoXY(0, 0);
           //    g_speed = 200;
        printf("困难");
        break;
    case 1:  //简单
                X=10;Y=10;
        GotoXY(0, 0);
           //    g_speed = 500;
        printf("简单");
    }
//    g++;
}

int main(void)
{
        srand((unsigned int)time(NULL)); 
    while(1)
    {    
         smp_type=0;
         int tmp=0;
         printf("please press 1,2,3 select easy to diffrent!\n");
         while(1)
         {
              KeyState();//获取 按键
           if(smp_type>=1 &&smp_type<=3)break;
         }
        if(smp_type==1)tmp=3;     //蛇的大小
        if(smp_type==2)tmp=6;
        if(smp_type==3)tmp=9;
        Change(smp_type);
    Head();    //提示文字
    
    Frame();   //产生边框      
    //GotoXY(50,50);
    //g_pHead;
    CreatSnake(3);
    CreatSnake1(3);                    
    DrawSnake();
    DrawSnake1();
    Food();
    HideCursor();   //隐藏光标 
    while(1)
    {
        KeyState();
        if(true==Eat())
        {
            Food();
        }
        else if(true==Eat1())
        {
            Food();
        }
        
        /*if((true==IsDie1())||(true==IsDie()))
        {
            system("pause>0");
        }*/
        if((true==IsDie1())||(true==IsDie()))
        {
            system("pause>0");
            if(GetAsyncKeyState(VK_ESCAPE))
            return 0;
            else 
            {
            system("cls");break;
            }
        }
        Drop();    
        Drop1();    
        Move();
        Move1();
        DrawSnake();
        DrawSnake1();
        
        Sleep(300);
         
        
    }
    
    Free();
}
    return 0;
} 

void HideCursor() // 用于隐藏光标
{

CONSOLE_CURSOR_INFO cursor_info = {1, 0};  // 第二个值为0表示隐藏光标

SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);

}

bool IsDie(void)                                //撞边结束 
{
    if(1==g_Back[g_pHead->stSnake.iX][g_pHead->stSnake.iY-3])    //1表示墙 0表示空气 2表示食物 
    {
        GotoXY(15,49);
        printf("P1 Game over!");
        return true;
    }
    return false;
}

bool IsDie1(void)                                //撞边结束    xigai
{
    if(1==g_Back[g_pHead1->stSnake.iX][g_pHead1->stSnake.iY-3])    //1表示墙 0表示空气 2表示食物 
    {
        GotoXY(15,49);
        printf("P2 Game over!");
        return true;
    }
    return false;
}

void GotoXY(unsigned short hang,unsigned short lie)            //设置光标位置 
{
    COORD cd = {lie,hang};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cd);
}

void Appand(void)                                //吃食后增加长度 
{
    //创建节点 
    struct Node *pTemp=(struct Node*)malloc(sizeof(struct Node));
    if(NULL==pTemp)
        return;
    //节点成员赋值 
    pTemp->iCount++;
    pTemp->pPre=NULL;
    pTemp->pNext=NULL;
    pTemp->stSnake.emDir=g_pEnd->stSnake.emDir;
    switch(g_pEnd->stSnake.emDir)
    {
        case enum_east:
            pTemp->stSnake.iX=g_pEnd->stSnake.iX;
            pTemp->stSnake.iY=g_pEnd->stSnake.iY+1;
            break;
        case enum_south:
            pTemp->stSnake.iX=g_pEnd->stSnake.iX+1;
            pTemp->stSnake.iY=g_pEnd->stSnake.iY;
            break;
        case enum_west:
            pTemp->stSnake.iX=g_pEnd->stSnake.iX;
            pTemp->stSnake.iY=g_pEnd->stSnake.iY-1;
            break;
        case enum_north:
            pTemp->stSnake.iX=g_pEnd->stSnake.iX-1;
            pTemp->stSnake.iY=g_pEnd->stSnake.iY;
            break;
    }
    //链接到链表的尾巴上 
    pTemp->pPre=g_pEnd;
    g_pEnd->pNext=pTemp;
    g_pEnd=pTemp;
    
}

void Appand1(void)                                //吃食后增加长度   xiyga
{
    //创建节点 
    struct Node *pTemp1=(struct Node*)malloc(sizeof(struct Node));
    if(NULL==pTemp1)
        return;
    //节点成员赋值 
    pTemp1->iCount++;
    pTemp1->pPre=NULL;
    pTemp1->pNext=NULL;
    pTemp1->stSnake.emDir=g_pEnd1->stSnake.emDir;
    switch(g_pEnd1->stSnake.emDir)
    {
        case enum_east:
            pTemp1->stSnake.iX=g_pEnd1->stSnake.iX;
            pTemp1->stSnake.iY=g_pEnd1->stSnake.iY+1;
            break;
        case enum_south:
            pTemp1->stSnake.iX=g_pEnd1->stSnake.iX+1;
            pTemp1->stSnake.iY=g_pEnd1->stSnake.iY;
            break;
        case enum_west:
            pTemp1->stSnake.iX=g_pEnd1->stSnake.iX;
            pTemp1->stSnake.iY=g_pEnd1->stSnake.iY-1;
            break;
        case enum_north:
            pTemp1->stSnake.iX=g_pEnd1->stSnake.iX-1;
            pTemp1->stSnake.iY=g_pEnd1->stSnake.iY;
            break;
    }
    //链接到链表的尾巴上 
    pTemp1->pPre=g_pEnd1;
    g_pEnd1->pNext=pTemp1;
    g_pEnd1=pTemp1;
    
}

bool Eat(void)                                    //判断是否吃食 
{
    if(2==g_Back[g_pHead->stSnake.iX][g_pHead->stSnake.iY])
    {
        g_Back[g_pHead->stSnake.iX][g_pHead->stSnake.iY]=0;
        Appand();
        return true;    
    }    
    else if(3==g_Back[g_pHead->stSnake.iX][g_pHead->stSnake.iY])
    {
        g_Back[g_pHead->stSnake.iX][g_pHead->stSnake.iY]=0;
        Appand();
        Appand();
        return true;    
    }
    return false;
} 

bool Eat1(void)                                    //判断是否吃食   xigai
{
    if(2==g_Back[g_pHead1->stSnake.iX][g_pHead1->stSnake.iY])
    {
        g_Back[g_pHead1->stSnake.iX][g_pHead1->stSnake.iY]=0;
        Appand1();
        return true;    
    }    
    else if(3==g_Back[g_pHead1->stSnake.iX][g_pHead1->stSnake.iY])
    {
        g_Back[g_pHead1->stSnake.iX][g_pHead1->stSnake.iY]=0;
        Appand1();
        Appand1();
        return true;    
    }
    return false;
} 

void Food(void)                                    //食物   xiugai
{
    while(1)
    {
        //产生一组坐标 
        int x=rand()%(X-2)+1;
        int y=rand()%(Y-2)+4;
        //判断是否在蛇身上
        struct Node *pT=g_pHead;
        struct Node *pT1=g_pHead1;
        while(pT!=NULL)
        {
            if(x==pT->stSnake.iX&&y==pT->stSnake.iY)
                break;
            pT=pT->pNext;
        }
        while(pT1!=NULL)
        {
            if(x==pT1->stSnake.iX&&y==pT1->stSnake.iY)
                break;
            pT1=pT1->pNext;
        }
        //在的话就下一次 
        if((NULL!=pT1)&&(NULL!=pT))
            continue;
        //不在,那就是合理的位置
        else
        {
            int foodshape=rand()%3;
            if(foodshape==0)
            {
                foodshape=3;
            }
            else if(foodshape==1)
            {
                foodshape=2;
            }
            g_Back[x][y]=foodshape;
            GotoXY(9+x,y*2+30);    
            if(foodshape==2)
            {
                printf("□");
            }
            else if(foodshape==3)
            {
                printf("o");    
            }
            break;
        } 
    }
}

void KeyState(void)                                //箭头控制转向 xiugai
{
    if(GetAsyncKeyState(VK_UP))
    {
        g_pHead->stSnake.emDir=enum_north;
    }
    else if(GetAsyncKeyState(VK_DOWN))
    {
        g_pHead->stSnake.emDir=enum_south;
    }
    else if(GetAsyncKeyState(VK_LEFT))
    {
        g_pHead->stSnake.emDir=enum_west;
    }
    else if(GetAsyncKeyState(VK_RIGHT))
    {
        g_pHead->stSnake.emDir=enum_east;
    }
    
    if(GetAsyncKeyState('W'))
    {
        g_pHead1->stSnake.emDir=enum_north;
    }
    else if(GetAsyncKeyState('S'))
    {
        g_pHead1->stSnake.emDir=enum_south;
    }
    else if(GetAsyncKeyState('A'))
    {
        g_pHead1->stSnake.emDir=enum_west;
    }
    else if(GetAsyncKeyState('D'))
    {
        g_pHead1->stSnake.emDir=enum_east;
    }
        //------------------------------------------  以下为获取难度级别
            else if(GetAsyncKeyState('1'))
    {
        smp_type=1;
    }
        //------------------------------------------
            else if(GetAsyncKeyState('2'))
    {
    smp_type=2;
    }
        //------------------------------------------
            else if(GetAsyncKeyState('3'))
    {
    smp_type=3;
    }
}

void Move(void)                                    //移动蛇 
{
    if(NULL==g_pHead)
        return;
    struct Node *pT=g_pEnd;
    while(pT!=g_pHead)            
    {
        pT->stSnake=pT->pPre->stSnake;
        pT=pT->pPre;
    }
    switch (g_pHead->stSnake.emDir)
    {
        case enum_east:
            g_pHead->stSnake.iY++;
            break;
        case enum_south:
            g_pHead->stSnake.iX++;
            break;
        case enum_west:
            g_pHead->stSnake.iY--;
            break;
        case enum_north:
            g_pHead->stSnake.iX--;
            break;
    }
}

void Move1(void)                                    //移动蛇   xiugai 
{
    if(NULL==g_pHead1)
        return;
    struct Node *pT1=g_pEnd1; 
    while(pT1!=g_pHead1)            
    {
        pT1->stSnake=pT1->pPre->stSnake;
        pT1=pT1->pPre;
    }
    switch (g_pHead1->stSnake.emDir)
    {
        case enum_east:
            g_pHead1->stSnake.iY++;
            break;
        case enum_south:
            g_pHead1->stSnake.iX++;
            break;
        case enum_west:
            g_pHead1->stSnake.iY--;
            break;
        case enum_north:
            g_pHead1->stSnake.iX--;
            break;
    }
}

void Drop(void)                                    //消除尾巴 
{
    GotoXY(9+g_pEnd->stSnake.iX,g_pEnd->stSnake.iY*2+30);
    printf(" ");
}

void Drop1(void)                                    //消除尾巴   xigai
{
    GotoXY(9+g_pEnd1->stSnake.iX,g_pEnd1->stSnake.iY*2+30);
    printf(" ");
}

void DrawSnake(void)                            //画蛇 
{
    if(NULL==g_pHead)
        return;
    struct Node *pT=g_pHead;
    while(pT!=NULL)
    {
        GotoXY(9+pT->stSnake.iX,pT->stSnake.iY*2+30);
        printf("O");
        pT=pT->pNext;
    }
} 

void DrawSnake1(void)                            //画蛇   xigai
{
    if(NULL==g_pHead1)
        return;
    struct Node *pT1=g_pHead1;
    while(pT1!=NULL)
    {
        GotoXY(9+pT1->stSnake.iX,pT1->stSnake.iY*2+30);
        printf("@");
        pT1=pT1->pNext;
        
    }
} 

void CreatSnake(int iCount)                    //链表、节点  创造蛇的大小 
{
    if(iCount<=0)
        return;
        int i;
    for(i=0;i<iCount;i++)
    {
        //创建节点 
        struct Node *pT=(struct Node*)malloc(sizeof(struct Node));
        if(NULL==pT)
            return ;
        //节点成员赋值 
        pT->iCount=0;
        pT->pNext=NULL;
        pT->pPre=NULL;
        pT->stSnake.emDir=enum_west;
        pT->stSnake.iX=0;
        pT->stSnake.iY=0;
        // 将节点连在链表上
        if(NULL==g_pHead)
        {
            g_pHead=pT;
            g_pEnd=pT;
            
            g_pHead->iCount=1;

            //g_pHead->stSnake.iX=rand()%(X-2)+1;         //随机数取余数,确保iX小于(X-2)+1 
            //g_pHead->stSnake.iY=rand()%(Y-iCount-1)+3;  //随机数取余数,确保iY小于(Y-iCount)+1
            g_pHead->stSnake.iX=7;
            g_pHead->stSnake.iY=13;
        } 
        else
        {
            g_pEnd->pNext=pT;
            pT->pPre=g_pEnd;
            g_pEnd=pT;
            
            g_pHead->iCount+=1;
            
            g_pEnd->stSnake.iX=g_pEnd->pPre->stSnake.iX;
            
            g_pEnd->stSnake.iY=g_pEnd->pPre->stSnake.iY+1;
        }
    }
}

void CreatSnake1(int iCount)                    //链表、节点  创造蛇的大小   xiuagui
{
    if(iCount<=0)
        return;
        int i;
    for(i=0;i<iCount;i++)
    {
        //创建节点 
        struct Node *pT1=(struct Node*)malloc(sizeof(struct Node));
        if(NULL==pT1)
            return ;
        //节点成员赋值 
        pT1->iCount=0;
        pT1->pNext=NULL;
        pT1->pPre=NULL;
        pT1->stSnake.emDir=enum_east;
        pT1->stSnake.iX=0;
        pT1->stSnake.iY=0;
        // 将节点连在链表上
        if(NULL==g_pHead1)
        {
            g_pHead1=pT1;
            g_pEnd1=pT1;
            
            g_pHead1->iCount=1;

            //g_pHead1->stSnake.iX=rand()%(X-2)+1;         //随机数取余数,确保iX小于(X-2)+1 
            //g_pHead1->stSnake.iY=rand()%(Y-iCount-1)+3;  //随机数取余数,确保iY小于(Y-iCount)+1
            g_pHead1->stSnake.iX=11; 
            g_pHead1->stSnake.iY=12;
        } 
        else
        {
            g_pEnd1->pNext=pT1;
            pT1->pPre=g_pEnd1;
            g_pEnd1=pT1;
            
            g_pHead1->iCount+=1;
            
            g_pEnd1->stSnake.iX=g_pEnd1->pPre->stSnake.iX;
            
            g_pEnd1->stSnake.iY=g_pEnd1->pPre->stSnake.iY+1;
        }
    }
}

void Free(void)
{
    if(NULL==g_pHead)
        return;
    struct Node *pT=g_pHead;
    while(NULL!=pT)
    {
        //记录被删除的节点
        struct Node *pp=pT; 
        //节点往下走 
        pT=pT->pNext;
        //释放记录 
        free(pp);
    }
    g_pHead=NULL;
    g_pEnd=NULL;
}

void Free1(void)                                 //xiufvai
{
    if(NULL==g_pHead1)
        return;
    struct Node *pT1=g_pHead1;
    while(NULL!=pT1)
    {
        //记录被删除的节点
        struct Node *pp1=pT1; 
        //节点往下走 
        pT1=pT1->pNext;
        //释放记录 
        free(pp1);
    }
    g_pHead1=NULL;
    g_pEnd1=NULL;
}

void Frame(void)                                            //边框赋值 
{
    int i;
    for(i=0;i<X;i++)
    {
        int j;
        for(j=0;j<Y;j++)
        {
            if(i==0||j==0||i==X-1||j==Y-1)
                g_Back[i][j]=1;
            else g_Back[i][j]=0;
        }
    }
    for(i=0;i<X;i++)
    {
        GotoXY(i+9, 0);
        printf("\t\t\t\t    ");
        int j;
        for(j=0;j<Y;j++)
        {

            if(g_Back[i][j]==1)
                printf("■ ");
             
            else 
                printf("  ");
        }
        putchar('\n');
    }    
}


void Head(void)                                                //提示文字 
{
    printf("\t\t\t\t\t>>>>>>>>>>  贪吃蛇  <<<<<<<<<<\n");
    printf("\t\t\t\t\t>>>>>  Enter 启动/暂停   <<<<<\n");
    printf("\t\t\t\t\t>>>>> ↑←↓→ 控制方向  <<<<<\n");
    printf("\t\t\t\t\t>>>>>   1 查看历史记录   <<<<<\n");
    printf("\t\t\t\t\t>>>>>   Q 重新开始       <<<<<\n");
    printf("\t\t\t\t\t>>>>>    切换难度: 简单 <<<<<\n");
    printf("\t\t\t\t\t>>>>>    蛇1当前长度:    <<<<<\n");
    printf("\t\t\t\t\t>>>>>    蛇2当前长度: 0     <<<<<\n");
    printf("\t\t\t\t\t>>>>>   ESC  退出游戏    <<<<<\n");
    printf("\t\t\t\t\t>>>>>>>>>>>>>>><<<<<<<<<<<<<<<\n");
}


  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7810350
  • 这篇博客你也可以参考下:C语言链表:函数内部对头结点head的修改为什么不会改变外面的head?
  • 除此之外, 这篇博客: 飞机大战控制台小游戏代码(包括个人记录和玩家排名)(纯C,多文件)(大一课程设计)中的 head.h 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #ifndef HEAD1_H_INCLUDED
    #define HEAD1_H_INCLUDED
    
    #include<stdio.h>
    #include<windows.h>
    #include<conio.h>
    #include <time.h>
    #include"struct.h"
    //file
    char* generFname(char n[]);
    sonl* readPastS(char fname[],int cis);
    void readPastB();
    void writeSon(char fname[],sonl* sonh);
    void writeBig();
    //page
    void to_g2(char *na );
    void to_g3(char *na );
    //game.c
    void HideCursor();
    void gotoxy(int x,int y);
    void chioce10();
    void withInpute();
    void enemySpeed(int mx);
    void bulletMove();
    void show();
    void startup();
    void startGame1(int mx,char *na );
    void startGame0(int mx,char *na );
    
    //link
    stu* createBig(char n[] );
    sonl* insertSon(sonl *sonh,int mx,int score);
    void deleteBig(char n[] );
    void update(int score,int mx,stu *point );
    void printCL();
    stu* findSon(char n[] );
    void printPR(sonl *h);
    
    #endif // HEAD1_H_INCLUDED
    
    

你函数里已经有了获取蛇长度的函数,你只是没有调用,Header里加上打印出来蛇的长度就可以了:

int snake1Length = Free();
int snake2Length = Free1();
printf("\t\t\t\t\t>>>>>    蛇1当前长度:    <<<<<\n");
printf(snake1Length);
printf("\t\t\t\t\t>>>>>    蛇2当前长度: 0     <<<<<\n");
printf(snake2Length);

做了点修改,参考一下:

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<malloc.h>
#include<time.h>
#include<stdbool.h>

//#define X 20
//#define Y 20
int X, Y;   //游戏边界
unsigned char smp_type;//难度系数 main函数中 通过增加蛇的长度 来增减难度
void Change(unsigned char type); //根据游戏边界确定难度  ,0,1,2   type 难度类型

enum Dir { enum_east, enum_south, enum_west, enum_north };  //枚举类型 方向 

struct Snake                                            //蛇结构体 
{
    int iX, iY;
    enum Dir emDir;
};

struct Node                                                //链表的节点 
{
    struct Snake stSnake;
    int iCount;
    struct Node *pPre;
    struct Node *pNext;
};

struct Node *g_pHead = NULL;
struct Node *g_pEnd = NULL;
struct Node *g_pHead1 = NULL;
struct Node *g_pEnd1 = NULL;

char g_Back[1000][1000];
void Head(void);//头 英文 
void Frame(void);//框架 英文 
void GotoXY(unsigned short hang, unsigned short lie);//去某行某列 
void CreatSnake(int iCount);//创造蛇 
void CreatSnake1(int iCount);
void Free();
void Free1();
void DrawSnake(void);
void DrawSnake1(void);
void Move(void);
void Move1(void);
void Drop(void);
void Drop1(void);
void KeyState(void);//箭头控制转向 
void Food(void);
void Appand(void);//附加 英文 
void Appand1(void);
bool Eat(void);
bool Eat1(void);
bool IsDie(void);
bool IsDie1(void);
void HideCursor(); // 用于隐藏光标

void Change(unsigned char type) //游戏边界)   //目前无用
{

    switch (type)
    {
    case 3:  //  困难 
        X = 20; Y = 20;
        GotoXY(1, 0);

        printf("中等");
        break;
    case 2:  // 中等
        X = 15; Y = 15;
        GotoXY(1, 0);
        //    g_speed = 200;
        printf("困难");
        break;
    case 1:  //简单
        X = 10; Y = 10;
        GotoXY(1, 0);
        //    g_speed = 500;
        printf("简单");
    }
    //    g++;
}

int main(void)
{
    srand((unsigned int)time(NULL));
    while (1)
    {
        smp_type = 0;
        int tmp = 0;
        printf("please press 1,2,3 select easy to diffrent!\n");
        while (1)
        {
            KeyState();//获取 按键
            if (smp_type >= 1 && smp_type <= 3)break;
        }
        if (smp_type == 1)tmp = 3;     //蛇的大小
        if (smp_type == 2)tmp = 6;
        if (smp_type == 3)tmp = 9;
        Change(smp_type);
        Head();    //提示文字

        Frame();   //产生边框      
                   //GotoXY(50,50);
                   //g_pHead;
        CreatSnake(3);
        CreatSnake1(3);
        DrawSnake();
        DrawSnake1();
        Food();
        HideCursor();   //隐藏光标 
        while (1)
        {
            KeyState();
            if (true == Eat())
            {
                Food();
            }
            else if (true == Eat1())
            {
                Food();
            }

            /*if((true==IsDie1())||(true==IsDie()))
            {
            system("pause>0");
            }*/
            if ((true == IsDie1()) || (true == IsDie()))
            {
                system("pause>0");
                if (GetAsyncKeyState(VK_ESCAPE))
                    return 0;
                else
                {
                    system("cls"); break;
                }
            }
            Drop();
            Drop1();
            Move();
            Move1();
            DrawSnake();
            DrawSnake1();

            Sleep(300);


        }

        Free();
    }
    return 0;
}

void HideCursor() // 用于隐藏光标
{

    CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };  // 第二个值为0表示隐藏光标

    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);

}

bool IsDie(void)                                //撞边结束 
{
    if (1 == g_Back[g_pHead->stSnake.iX][g_pHead->stSnake.iY - 3])    //1表示墙 0表示空气 2表示食物 
    {
        GotoXY(15, 49);
        printf("P1 Game over!");
        return true;
    }
    return false;
}

bool IsDie1(void)                                //撞边结束    xigai
{
    if (1 == g_Back[g_pHead1->stSnake.iX][g_pHead1->stSnake.iY - 3])    //1表示墙 0表示空气 2表示食物 
    {
        GotoXY(15, 49);
        printf("P2 Game over!");
        return true;
    }
    return false;
}

void GotoXY(unsigned short hang, unsigned short lie)            //设置光标位置 
{
    COORD cd = { lie,hang };
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cd);
}

void Appand(void)                                //吃食后增加长度 
{
    //创建节点 
    struct Node *pTemp = (struct Node*)malloc(sizeof(struct Node));
    if (NULL == pTemp)
        return;
    //节点成员赋值 
    pTemp->iCount++;
    pTemp->pPre = NULL;
    pTemp->pNext = NULL;
    pTemp->stSnake.emDir = g_pEnd->stSnake.emDir;
    switch (g_pEnd->stSnake.emDir)
    {
    case enum_east:
        pTemp->stSnake.iX = g_pEnd->stSnake.iX;
        pTemp->stSnake.iY = g_pEnd->stSnake.iY + 1;
        break;
    case enum_south:
        pTemp->stSnake.iX = g_pEnd->stSnake.iX + 1;
        pTemp->stSnake.iY = g_pEnd->stSnake.iY;
        break;
    case enum_west:
        pTemp->stSnake.iX = g_pEnd->stSnake.iX;
        pTemp->stSnake.iY = g_pEnd->stSnake.iY - 1;
        break;
    case enum_north:
        pTemp->stSnake.iX = g_pEnd->stSnake.iX - 1;
        pTemp->stSnake.iY = g_pEnd->stSnake.iY;
        break;
    }
    //链接到链表的尾巴上 
    pTemp->pPre = g_pEnd;
    g_pEnd->pNext = pTemp;
    g_pEnd = pTemp;

}

void Appand1(void)                                //吃食后增加长度   xiyga
{
    //创建节点 
    struct Node *pTemp1 = (struct Node*)malloc(sizeof(struct Node));
    if (NULL == pTemp1)
        return;
    //节点成员赋值 
    pTemp1->iCount++;
    pTemp1->pPre = NULL;
    pTemp1->pNext = NULL;
    pTemp1->stSnake.emDir = g_pEnd1->stSnake.emDir;
    switch (g_pEnd1->stSnake.emDir)
    {
    case enum_east:
        pTemp1->stSnake.iX = g_pEnd1->stSnake.iX;
        pTemp1->stSnake.iY = g_pEnd1->stSnake.iY + 1;
        break;
    case enum_south:
        pTemp1->stSnake.iX = g_pEnd1->stSnake.iX + 1;
        pTemp1->stSnake.iY = g_pEnd1->stSnake.iY;
        break;
    case enum_west:
        pTemp1->stSnake.iX = g_pEnd1->stSnake.iX;
        pTemp1->stSnake.iY = g_pEnd1->stSnake.iY - 1;
        break;
    case enum_north:
        pTemp1->stSnake.iX = g_pEnd1->stSnake.iX - 1;
        pTemp1->stSnake.iY = g_pEnd1->stSnake.iY;
        break;
    }
    //链接到链表的尾巴上 
    pTemp1->pPre = g_pEnd1;
    g_pEnd1->pNext = pTemp1;
    g_pEnd1 = pTemp1;

}

bool Eat(void)                                    //判断是否吃食 
{
    if (2 == g_Back[g_pHead->stSnake.iX][g_pHead->stSnake.iY])
    {
        g_Back[g_pHead->stSnake.iX][g_pHead->stSnake.iY] = 0;
        Appand();
        return true;
    }
    else if (3 == g_Back[g_pHead->stSnake.iX][g_pHead->stSnake.iY])
    {
        g_Back[g_pHead->stSnake.iX][g_pHead->stSnake.iY] = 0;
        Appand();
        Appand();
        return true;
    }
    return false;
}

bool Eat1(void)                                    //判断是否吃食   xigai
{
    if (2 == g_Back[g_pHead1->stSnake.iX][g_pHead1->stSnake.iY])
    {
        g_Back[g_pHead1->stSnake.iX][g_pHead1->stSnake.iY] = 0;
        Appand1();
        return true;
    }
    else if (3 == g_Back[g_pHead1->stSnake.iX][g_pHead1->stSnake.iY])
    {
        g_Back[g_pHead1->stSnake.iX][g_pHead1->stSnake.iY] = 0;
        Appand1();
        Appand1();
        return true;
    }
    return false;
}

void Food(void)                                    //食物   xiugai
{
    while (1)
    {
        //产生一组坐标 
        int x = rand() % (X - 2) + 1;
        int y = rand() % (Y - 2) + 4;
        //判断是否在蛇身上
        struct Node *pT = g_pHead;
        struct Node *pT1 = g_pHead1;
        while (pT != NULL)
        {
            if (x == pT->stSnake.iX&&y == pT->stSnake.iY)
                break;
            pT = pT->pNext;
        }
        while (pT1 != NULL)
        {
            if (x == pT1->stSnake.iX&&y == pT1->stSnake.iY)
                break;
            pT1 = pT1->pNext;
        }
        //在的话就下一次 
        if ((NULL != pT1) && (NULL != pT))
            continue;
        //不在,那就是合理的位置
        else
        {
            int foodshape = rand() % 3;
            if (foodshape == 0)
            {
                foodshape = 3;
            }
            else if (foodshape == 1)
            {
                foodshape = 2;
            }
            g_Back[x][y] = foodshape;
            GotoXY(9 + x, y * 2 + 30);
            if (foodshape == 2)
            {
                printf("□");
            }
            else if (foodshape == 3)
            {
                printf("o");
            }
            break;
        }
    }
}

void KeyState(void)                                //箭头控制转向 xiugai
{
    if (GetAsyncKeyState(VK_UP))
    {
        if (!g_pHead)
            return;
        g_pHead->stSnake.emDir = enum_north;
    }
    else if (GetAsyncKeyState(VK_DOWN))
    {
        if (!g_pHead)
            return;
        g_pHead->stSnake.emDir = enum_south;
    }
    else if (GetAsyncKeyState(VK_LEFT))
    {
        if (!g_pHead)
            return;
        g_pHead->stSnake.emDir = enum_west;
    }
    else if (GetAsyncKeyState(VK_RIGHT))
    {
        if (!g_pHead)
            return;
        g_pHead->stSnake.emDir = enum_east;
    }

    if (GetAsyncKeyState('W'))
    {
        if (!g_pHead1)
            return;
        g_pHead1->stSnake.emDir = enum_north;
    }
    else if (GetAsyncKeyState('S'))
    {
        if (!g_pHead1)
            return;
        g_pHead1->stSnake.emDir = enum_south;
    }
    else if (GetAsyncKeyState('A'))
    {
        if (!g_pHead1)
            return;
        g_pHead1->stSnake.emDir = enum_west;
    }
    else if (GetAsyncKeyState('D'))
    {
        if (!g_pHead1)
            return;
        g_pHead1->stSnake.emDir = enum_east;
    }
    //------------------------------------------  以下为获取难度级别
    else if (GetAsyncKeyState('1'))
    {
        smp_type = 1;
    }
    //------------------------------------------
    else if (GetAsyncKeyState('2'))
    {
        smp_type = 2;
    }
    //------------------------------------------
    else if (GetAsyncKeyState('3'))
    {
        smp_type = 3;
    }
}

void Move(void)                                    //移动蛇 
{
    if (NULL == g_pHead)
        return;
    struct Node *pT = g_pEnd;
    while (pT != g_pHead)
    {
        pT->stSnake = pT->pPre->stSnake;
        pT = pT->pPre;
    }
    switch (g_pHead->stSnake.emDir)
    {
    case enum_east:
        g_pHead->stSnake.iY++;
        break;
    case enum_south:
        g_pHead->stSnake.iX++;
        break;
    case enum_west:
        g_pHead->stSnake.iY--;
        break;
    case enum_north:
        g_pHead->stSnake.iX--;
        break;
    }
}

void Move1(void)                                    //移动蛇   xiugai 
{
    if (NULL == g_pHead1)
        return;
    struct Node *pT1 = g_pEnd1;
    while (pT1 != g_pHead1)
    {
        pT1->stSnake = pT1->pPre->stSnake;
        pT1 = pT1->pPre;
    }
    switch (g_pHead1->stSnake.emDir)
    {
    case enum_east:
        g_pHead1->stSnake.iY++;
        break;
    case enum_south:
        g_pHead1->stSnake.iX++;
        break;
    case enum_west:
        g_pHead1->stSnake.iY--;
        break;
    case enum_north:
        g_pHead1->stSnake.iX--;
        break;
    }
}

void Drop(void)                                    //消除尾巴 
{
    GotoXY(9 + g_pEnd->stSnake.iX, g_pEnd->stSnake.iY * 2 + 30);
    printf(" ");
}

void Drop1(void)                                    //消除尾巴   xigai
{
    GotoXY(9 + g_pEnd1->stSnake.iX, g_pEnd1->stSnake.iY * 2 + 30);
    printf(" ");
}

void DrawSnake(void)                            //画蛇 
{
    if (NULL == g_pHead)
        return;
    struct Node *pT = g_pHead;
    while (pT != NULL)
    {
        GotoXY(9 + pT->stSnake.iX, pT->stSnake.iY * 2 + 30);
        printf("O");
        pT = pT->pNext;
    }
}

void DrawSnake1(void)                            //画蛇   xigai
{
    if (NULL == g_pHead1)
        return;
    struct Node *pT1 = g_pHead1;
    while (pT1 != NULL)
    {
        GotoXY(9 + pT1->stSnake.iX, pT1->stSnake.iY * 2 + 30);
        printf("@");
        pT1 = pT1->pNext;

    }
}

void CreatSnake(int iCount)                    //链表、节点  创造蛇的大小 
{
    if (iCount <= 0)
        return;
    int i;
    for (i = 0; i<iCount; i++)
    {
        //创建节点 
        struct Node *pT = (struct Node*)malloc(sizeof(struct Node));
        if (NULL == pT)
            return;
        //节点成员赋值 
        pT->iCount = 0;
        pT->pNext = NULL;
        pT->pPre = NULL;
        pT->stSnake.emDir = enum_west;
        pT->stSnake.iX = 0;
        pT->stSnake.iY = 0;
        // 将节点连在链表上
        if (NULL == g_pHead)
        {
            g_pHead = pT;
            g_pEnd = pT;

            g_pHead->iCount = 1;

            //g_pHead->stSnake.iX=rand()%(X-2)+1;         //随机数取余数,确保iX小于(X-2)+1 
            //g_pHead->stSnake.iY=rand()%(Y-iCount-1)+3;  //随机数取余数,确保iY小于(Y-iCount)+1
            g_pHead->stSnake.iX = 7;
            g_pHead->stSnake.iY = 13;
        }
        else
        {
            g_pEnd->pNext = pT;
            pT->pPre = g_pEnd;
            g_pEnd = pT;

            g_pHead->iCount += 1;

            g_pEnd->stSnake.iX = g_pEnd->pPre->stSnake.iX;

            g_pEnd->stSnake.iY = g_pEnd->pPre->stSnake.iY + 1;
        }
    }
}

void CreatSnake1(int iCount)                    //链表、节点  创造蛇的大小   xiuagui
{
    if (iCount <= 0)
        return;
    int i;
    for (i = 0; i<iCount; i++)
    {
        //创建节点 
        struct Node *pT1 = (struct Node*)malloc(sizeof(struct Node));
        if (NULL == pT1)
            return;
        //节点成员赋值 
        pT1->iCount = 0;
        pT1->pNext = NULL;
        pT1->pPre = NULL;
        pT1->stSnake.emDir = enum_east;
        pT1->stSnake.iX = 0;
        pT1->stSnake.iY = 0;
        // 将节点连在链表上
        if (NULL == g_pHead1)
        {
            g_pHead1 = pT1;
            g_pEnd1 = pT1;

            g_pHead1->iCount = 1;

            //g_pHead1->stSnake.iX=rand()%(X-2)+1;         //随机数取余数,确保iX小于(X-2)+1 
            //g_pHead1->stSnake.iY=rand()%(Y-iCount-1)+3;  //随机数取余数,确保iY小于(Y-iCount)+1
            g_pHead1->stSnake.iX = 11;
            g_pHead1->stSnake.iY = 12;
        }
        else
        {
            g_pEnd1->pNext = pT1;
            pT1->pPre = g_pEnd1;
            g_pEnd1 = pT1;

            g_pHead1->iCount += 1;

            g_pEnd1->stSnake.iX = g_pEnd1->pPre->stSnake.iX;

            g_pEnd1->stSnake.iY = g_pEnd1->pPre->stSnake.iY + 1;
        }
    }
}

void Free(void)
{
    if (NULL == g_pHead)
        return;
    struct Node *pT = g_pHead;
    while (NULL != pT)
    {
        //记录被删除的节点
        struct Node *pp = pT;
        //节点往下走 
        pT = pT->pNext;
        //释放记录 
        free(pp);
    }
    g_pHead = NULL;
    g_pEnd = NULL;
}

void Free1(void)                                 //xiufvai
{
    if (NULL == g_pHead1)
        return;
    struct Node *pT1 = g_pHead1;
    while (NULL != pT1)
    {
        //记录被删除的节点
        struct Node *pp1 = pT1;
        //节点往下走 
        pT1 = pT1->pNext;
        //释放记录 
        free(pp1);
    }
    g_pHead1 = NULL;
    g_pEnd1 = NULL;
}

void Frame(void)                                            //边框赋值 
{
    int i;
    for (i = 0; i<X; i++)
    {
        int j;
        for (j = 0; j<Y; j++)
        {
            if (i == 0 || j == 0 || i == X - 1 || j == Y - 1)
                g_Back[i][j] = 1;
            else g_Back[i][j] = 0;
        }
    }
    for (i = 0; i<X; i++)
    {
        GotoXY(i + 9, 0);
        printf("\t\t\t\t    ");
        int j;
        for (j = 0; j<Y; j++)
        {

            if (g_Back[i][j] == 1)
                printf("■ ");

            else
                printf("  ");
        }
        putchar('\n');
    }
}


void Head(void)                                                //提示文字 
{
    printf("\t\t\t\t\t>>>>>>>>>>  贪吃蛇  <<<<<<<<<<\n");
    printf("\t\t\t\t\t>>>>>  Enter 启动/暂停   <<<<<\n");
    printf("\t\t\t\t\t>>>>> ↑←↓→ 控制方向  <<<<<\n");
    printf("\t\t\t\t\t>>>>>   1 查看历史记录   <<<<<\n");
    printf("\t\t\t\t\t>>>>>   Q 重新开始       <<<<<\n");
    printf("\t\t\t\t\t>>>>>    切换难度: 简单 <<<<<\n");
    int n1 = 0;
    if (g_pHead)
        n1 = g_pHead->iCount;
    printf("\t\t\t\t\t>>>>>    蛇1当前长度:%d    <<<<<\n", n1);
    int n2 = 0;
    if (g_pHead1)
        n2 = g_pHead1->iCount;
    printf("\t\t\t\t\t>>>>>    蛇2当前长度: %d     <<<<<\n", n2);
    printf("\t\t\t\t\t>>>>>   ESC  退出游戏    <<<<<\n");
    printf("\t\t\t\t\t>>>>>>>>>>>>>>><<<<<<<<<<<<<<<\n");
}



写个while(1)的无限循环函数,定时回调,打印实时长度

C语言 要求能在Head函数里实时反映出两条蛇的长度。


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <curses.h>
#include <time.h>
 
int dir_y[] = {-1, 1, 0, 0};
int dir_x[] = {0, 0, -1, 1};
int vis[100][100];
int scord;
 
typedef struct body
{
    int y, x;
    struct body *pre, *sub;
} Body;
 
 
typedef struct
{
    Body *head, *tail;
    int DIRECTION;
    int HEAD_X;
    int HEAD_Y;
    int FOOD_X;
    int FOOD_Y;
    char food;
    char H;
} Snake;
 
//随机函数
int Get_Rand_Number(int k)
{    
    static int first_time = 0;
    if(!first_time){
        first_time = 1;
        srand((unsigned int)(time(NULL)));
    }
    return rand()%k + 1;
}
 
bool kbhit()
{
    if(ERR != halfdelay(0)) return 1;
    else return 0;
}
 
void Add(Snake *snake)
{
    Body *s;
    s = (Body *)malloc(sizeof(Body));
    s->y = snake->HEAD_Y;
    s->x = snake->HEAD_X;
    s->pre = NULL;
    s->sub = snake->head;
    snake->head->pre = s;
    snake->head = s;
}
 
void Free(Body *head)
{
    if(NULL == head) return;
    Free(head->sub);
    free(head);
}
 
int Judge_Kill(Snake *snake)
{
    if(snake->HEAD_Y == LINES - 1 || snake->HEAD_X == COLS - 1 || snake->HEAD_Y == 0 || snake->HEAD_X == 0) return 1;
    if(1 == vis[snake->HEAD_Y][snake->HEAD_X]) return 1;
    return 0;
}
 
void Initialization(Snake *snake, int y, int x)
{
    snake->DIRECTION = 0;
    int &FOOD_Y = snake->FOOD_Y;
    int &FOOD_X = snake->FOOD_X;
    snake->HEAD_Y = y;
    snake->HEAD_X = x;
 
    while(1)
    {
        FOOD_Y = Get_Rand_Number(LINES - 3);
        FOOD_X = Get_Rand_Number(COLS - 3);
        if(!vis[FOOD_Y][FOOD_X]){
            vis[FOOD_Y][FOOD_X] = 2;
            break;
        }
    }
    move(FOOD_Y, FOOD_X);
    printw("%c", snake->food);
 
 
    snake->head = (Body *)malloc(sizeof(Body));
    snake->head->y = y;
    snake->head->x = x;
    snake->head->pre = snake->head->sub = NULL;
    snake->tail = snake->head;
    move(y, x);
    printw("%c", snake->H);
    refresh();
}
 
void New_Food(Snake *snake)
{
    scord++;
    int &FOOD_Y = snake->FOOD_Y;
    int &FOOD_X = snake->FOOD_X;
    while(1){
        FOOD_Y = Get_Rand_Number(LINES - 3);
        FOOD_X = Get_Rand_Number(COLS - 3);
        if(!vis[FOOD_Y][FOOD_X]){
            vis[FOOD_Y][FOOD_X] = 2;
            break;
        }
    }
    move(FOOD_Y, FOOD_X);
    printw("%c", snake->food);
}
 
int Reverse_Direction(Snake *snake, int fy, int fx)
{
    int &HEAD_Y = snake->HEAD_Y;
    int &HEAD_X = snake->HEAD_X;
    Body *&head = snake->head;
 
    HEAD_Y += dir_y[snake->DIRECTION];
    HEAD_X += dir_x[snake->DIRECTION];
 
    if(HEAD_Y == fy && HEAD_X == fx) return 1;
 
    //在蛇长不为1时,下一个移动跟蛇运动方向相反
    if(head->sub && HEAD_Y == head->sub->y && HEAD_X == head->sub->x){
        if(HEAD_Y == head->y){
            if(HEAD_X > head->x) HEAD_X = head->x - 1;
            else HEAD_X = head->x + 1;
        }
        else{
            if(HEAD_Y > head->y) HEAD_Y = head->y - 1;
            else HEAD_Y = head->y + 1;
        }
    }
    return 0;
}
 
void Move(Snake *snake)
{
    int &FOOD_Y = snake->FOOD_Y;
    int &FOOD_X = snake->FOOD_X;
    int &HEAD_Y = snake->HEAD_Y;
    int &HEAD_X = snake->HEAD_X;
    Body *&head = snake->head;
    Body *&tail = snake->tail;
 
    //输出蛇头
    move(HEAD_Y, HEAD_X);
    printw("%c", snake->H);
    vis[HEAD_Y][HEAD_X] = 1;
 
    //如果有蛇身,输出之
    if(head->sub){
        move(head->sub->y, head->sub->x);
        printw("#");
    }
        
    if(HEAD_Y == FOOD_Y && HEAD_X == FOOD_X){
        New_Food(snake);//吃到食物
    }
    else{//什么都没有吃到
        move(tail->y, tail->x);
        printw(" ");
        vis[tail->y][tail->x] = 0;
        if(tail->pre){
            Body *tmp = tail;
            tail = tail->pre;
            tail->sub = NULL;
            free(tmp);
        }
    }
}
 
int main()
{
 
    initscr();
 
    curs_set(0);//隐藏物理指针
    noecho();//不回显输入
    box(stdscr, '|', '-');//画框
 
    Snake snake1, snake2;
    snake1.food = '$';
    snake2.food = '*';
    snake1.H = '@';
    snake2.H = '+';
    //两条蛇的初始化位置(小蛇放中间比较舒服)
    int init1_y = LINES / 2;
    int init1_x = COLS / 2 - 1;
    int init2_y = LINES / 2;
    int init2_x = COLS / 2 + 1;
    vis[init1_y][init1_x] = 1;
 
    //初始化两条蛇位置跟食物位置
    Initialization(&snake1, init1_y, init1_x);
    Initialization(&snake2, init2_y, init2_x);
 
    keypad(stdscr, true);//开启键盘功能键
    int key = 0;
    key = getch();
    while(1)
    {
#if 0
        if(kbhit() != 0) //检查当前是否有键盘输入,若有则返回一个非0值,否则返回0 
         {   
              while(kbhit() != 0)  //可能存在多个按键,要全部取完,以最后一个为主 
                  key = getch(); //将按键从控制台中取出并保存到key中
        }
#endif
        if(KEY_UP == key) snake1.DIRECTION = 0;
        else if(KEY_DOWN == key) snake1.DIRECTION = 1;
        else if(KEY_LEFT == key) snake1.DIRECTION = 2;
        else if(KEY_RIGHT == key) snake1.DIRECTION = 3;
        else if('w' == key) snake2.DIRECTION = 0;
        else if('s'== key) snake2.DIRECTION = 1;
        else if('a' == key) snake2.DIRECTION = 2;
        else if('d' == key) snake2.DIRECTION = 3;
        else if(' ' == key){
            while((key = getch()) != ' ');
            key = 0;
        }
        //else if('p' == key) getch();
        //getch();
 
 
        //获取向前移动的坐标及判断是否跟蛇运动方向相反(一条长度不为1的运动着的蛇
        //是有一个方向是不能走的)
        int over1 = 0, over2 = 0;
        over1 = Reverse_Direction(&snake1, snake2.FOOD_Y, snake2.FOOD_X);
        over2 = Reverse_Direction(&snake2, snake1.FOOD_Y, snake1.FOOD_X);
 
        //判断游戏是否结束
        if(Judge_Kill(&snake1) || Judge_Kill(&snake2) || over1 || over2){
            //释放内存,很重要
            Free(snake1.head);
            Free(snake2.head);
            break;
        }
 
        //往各自的链表添加蛇身
        Add(&snake1);
        Add(&snake2);
        
        //移动蛇及判断是否吃到另一条蛇的食物
        Move(&snake1);
        Move(&snake2);
 
        refresh();
        usleep(150*1000);//停留150毫秒
        if(ERR != halfdelay(1)) key = getch();//在100毫秒内等待输入,如无输入,往下执行
        //halfdelay(1);
        //key = getch();
    }
    sleep(3);
    endwin();
    exit(0);
}
 
 

下面是修改后的代码,其中在Head函数中实时更新了两条蛇的长度显示:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <stdbool.h>

int X, Y; // 游戏边界
unsigned char smp_type; // 难度系数
unsigned int snake1_length = 3; // 蛇1长度
unsigned int snake2_length = 3; // 蛇2长度

// 其他函数声明

void Head(void);
void Frame(void);
void GotoXY(unsigned short hang, unsigned short lie);
void KeyState(void);

int main(void) {
    // 其他代码...

    while (1) {
        // 其他代码...

        while (1) {
            KeyState();

            // 更新蛇的长度
            GotoXY(11, 34);
            printf("%d", snake1_length);
            GotoXY(12, 34);
            printf("%d", snake2_length);

            // 其他代码...
        }

        // 其他代码...
    }

    return 0;
}

// 其他函数实现...


在主函数中,声明了两个全局变量 snake1_length 和 snake2_length,分别用于存储两条蛇的长度。在游戏循环中,通过更新这两个变量,并在每次循环时更新显示,即可实现实时反映两条蛇的长度。修改后的代码只包含关键部分,你需要将其添加到原始代码中的适当位置。

请注意,由于在原始代码中没有提供蛇的长度更新的具体逻辑,你需要根据实际游戏逻辑进行相应的修改和更新。

加两个全局变量,实时存储长度,然后打印就可以了

按照以下修改下就可以了
在Head函数里,用两个全局变量g_length1和g_length2来存储两条蛇的长度,并用printf函数输出。
在CreatSnake和CreatSnake1函数里,每次创建一个节点时,就把对应的全局变量加一。
在Appand和Appand1函数里,每次增加一个节点时,也把对应的全局变量加一。
在Drop和Drop1函数里,每次消除一个节点时,就把对应的全局变量减一

要实时显示蛇的长度,可以定义一个全局的变量来记录当前蛇的长度,在其他处理过程中对这个变量进行更新,在你需要的head中实时读取这个变量的值就可以了。
挂壁与C语言贪吃蛇的代码,可以参考:
c语言版贪吃蛇游戏,C语言版贪吃蛇游戏:https://blog.csdn.net/weixin_30069591/article/details/117181679