c语言写双人贪吃蛇,双人模式下食物生成出现bug

我将贪吃蛇分为两个模式,用reStart控制选择进入单人模式(reStart1)还是双人模式(reStart2),进入单人模式能完美运行,但是进入双人模式时,画面卡着不动,去掉食物生成又可以运行。
我用的Vusial C++ 6.0,使用了Easy X插件来绘制游戏界面

img

源代码是


//头文件
#include<graphics.h>
#include<conio.h>
#include<ctime>

//窗口大小
int WindowX=640,WindowY=480;

//食物生成位置在框内
int FoodPositionX()
{
    srand((int)time(0));
    int foodPositionX;
    foodPositionX=(rand()%(WindowX/20-2)+1)*20+10;
    return foodPositionX;
}
int FoodPositionY()
{
    srand((int)time(0));
    int foodPositionY;
    foodPositionY=(rand()%(WindowY/20-2)+1)*20+10;
    return foodPositionY;
}
int Food2PositionX()
{
    srand((int)time(0));
    int food2PositionX;
    food2PositionX=(rand()%(WindowX/20-2)+1)*20+10;
    return food2PositionX;
}
int Food2PositionY()
{
    srand((int)time(0));
    int food2PositionY;
    food2PositionY=(rand()%(WindowY/20-2)+1)*20+10;
    return food2PositionY;
}
int Food3PositionX()
{
    srand((int)time(0));
    int food3PositionX;
    food3PositionX=(rand()%(WindowX/20-2)+1)*20+10;
    return food3PositionX;
}
int Food3PositionY()
{
    srand((int)time(0));
    int food3PositionY;
    food3PositionY=(rand()%(WindowY/20-2)+1)*20+10;
    return food3PositionY;
}


int main(void)
{
    //常用变量命名
    int ctrl = 0;
    int i,j;
    //设置颜色
    COLORREF BackgroundColor = RGB(10,10,10);
    COLORREF BoundaryColor = RGB(255,150,50);
    COLORREF SnakeColor = RGB(50,250,100);
    COLORREF Snake2Color = RGB(50,250,100);
    COLORREF Snake3Color = RGB(50,250,100);
    COLORREF FoodColor = RGB(255,255,255);
    COLORREF Food2Color = RGB(255,255,255);
    COLORREF Food3Color = RGB(255,255,255);
    //设置设的最大长度为沾满屏幕的所有格子
    int SnakeMaxLength = ((WindowX/20)-1)*((WindowY/20)-1);
    int Snake2MaxLength = ((WindowX/20)-1)*((WindowY/20)-1)-3;
    int Snake3MaxLength = ((WindowX/20)-1)*((WindowY/20)-1)-3;
    //定义食物坐标
    int FoodX,FoodY;
    int Food2X,Food2Y;
    int Food3X,Food3Y;
    //定义蛇当前长度
    int SnakeLength;
    int Snake2Length,Snake3Length;
    int* SnakeX =new int[SnakeMaxLength];
    int* SnakeY =new int[SnakeMaxLength];
    int* Snake2X =new int[Snake2MaxLength];
    int* Snake2Y =new int[Snake2MaxLength];
    int* Snake3X =new int[Snake3MaxLength];
    int* Snake3Y =new int[Snake3MaxLength];
    //定义蛇的朝向
    int Towards,Towards2,Towards3;
    char ch,ch2,ch3;
    //绘制边界变量
    int BoundaryX,BoundaryY;
    //绘制游戏窗口
    initgraph(WindowX,WindowY);
    setbkcolor(BackgroundColor);
    cleardevice();
    //食物生成相关
    bool FoodCanPut = false;
    bool Food2CanPut = false;
    bool Food3CanPut = false;
    //--------每次游戏开始的位置---------
reStart:
    settextstyle(20,0,_T("Consolas"));              //??????????????
    cleardevice();
    outtextxy(WindowX / 2 - 60, WindowY / 2 - 30,_T("按“R”进入单人模式"));
    outtextxy(WindowX / 2 - 60, WindowY / 2 + 30,_T("按“D”进入双人模式"));
    while (1)
                {
                    ch = _getch();
                    if(ch == 'r' || ch == 'R')
                    {
                        goto reStart1;
                    }
                    else if(ch == 'd' || ch == 'D')
                    {
                        goto reStart2;
                    }
                }

reStart2:
        //设置三个食物的坐标
    FoodX = FoodPositionX();
    FoodY = FoodPositionY();
    while (FoodCanPut == false)
        { 
            if(FoodX != Snake2X[0] && FoodY != Snake2Y[0] && FoodX != Snake3X[0] && FoodY != Snake3Y[0] )
            {
                FoodCanPut = true;
            }
            else if(FoodX == Snake2X[0] && FoodY == Snake2Y[0] || FoodX == Snake3X[0] && FoodY == Snake3Y[0])
            {
                FoodX = FoodPositionX();
                FoodY = FoodPositionY();
                FoodCanPut = false;
            }
        }
    Food2X = Food2PositionX();
    Food2Y = Food2PositionY();
    while (Food2CanPut == false)
        { 
            if(Food2X != Snake2X[0] && Food2Y != Snake2Y[0] && Food2X != Snake3X[0] && Food2Y != Snake3Y[0] && Food2X != FoodX && Food2Y != FoodY)
            {
                Food2CanPut = true;
            }
            else if(FoodX == Snake2X[0] && Food2Y == Snake2Y[0] || Food2X == Snake3X[0] && Food2Y == Snake3Y[0] || Food2X == FoodX && Food2Y == FoodY)
            {
                Food2X = Food2PositionX();
                Food2Y = Food2PositionY();
                Food2CanPut = false;
            }
        }
    Food3X = Food3PositionX();
    Food3Y = Food3PositionY();
    while (Food3CanPut == false)
        { 
            if(Food3X != Snake2X[0] && Food3Y != Snake2Y[0] && Food3X != Snake3X[0] && Food3Y != Snake3Y[0] && Food3X != FoodX && Food3Y != FoodY && Food3X != Food2X && Food3Y != Food2Y)
            {
                Food3CanPut = true;
            }
            else if(Food3X == Snake2X[0] && Food3Y == Snake2Y[0] || Food3X == Snake3X[0] && Food3Y == Snake3Y[0] || Food3X == FoodX && Food3Y == FoodY || Food3X == Food2X && Food3Y == Food2Y)
            {
                Food3X = Food3PositionX();
                Food3Y = Food3PositionY();
                Food3CanPut = false;
            }
        }
//有字数限制,单人模式的reStart已经省略
    //--------------开始菜单
    settextstyle(20,0,_T("Consolas"));              
    cleardevice();
    outtextxy(WindowX / 2 - 60, WindowY / 2 - 30,_T("按wasd控制Snake2"));
    outtextxy(WindowX / 2 - 60, WindowY / 2 + 30,_T("按5123控制Snake3"));
    system("Pause");
    cleardevice();
    clearrectangle(20, 20, WindowX - 20,WindowY - 20);
    //初始化两条小蛇
    Snake2Length = 3;
    for(i = Snake2Length - 1; i >=0 ; i--)
    {
        Snake2X[i] = 30 + 20 * (Snake2Length - i - 1);
        Snake2Y[i] = 70;
    }
    Towards2 = 3;
    ch2 = 'd';
    Snake3Length = 3;
    for(i = Snake3Length - 1; i >=0 ; i--)
    {
        Snake3X[i] = WindowX-30 - 20 * (Snake3Length - i - 1);
        Snake3Y[i] = WindowY-70;
    }
    Towards3 = '1';
    ch3 = '1';

    //  绘制边界
    setlinecolor(BoundaryColor);
    for (i = 10 ; i <= WindowX-10 ; i +=20)
    {
        BoundaryX = i;
        if(i == 10 || i == WindowX - 10)
        {
            for(j = 10 ; j <= WindowY -10 ; j += 20)
            {
                BoundaryY = j;
                rectangle(BoundaryX - 9, BoundaryY - 9, BoundaryX + 9, BoundaryY + 9);
            }
        }
        rectangle(BoundaryX - 9, BoundaryY - 9, BoundaryX + 9, BoundaryY + 9);
        rectangle(BoundaryX - 9, 10 -9, BoundaryX + 9, 10 + 9);
        Sleep(WindowX / 20);
    }

    //倒计时动画
    settextstyle(72, 0, _T("Consolas"));
    outtextxy(WindowX / 2 - 10, WindowY / 2 - 40, _T("3"));
    Sleep(1000);
    clearrectangle(20, 20, WindowX - 20,WindowY - 20);
    outtextxy(WindowX / 2 - 10, WindowY / 2 - 40, _T("2"));
    Sleep(1000);
    clearrectangle(20, 20, WindowX - 20,WindowY - 20);
    outtextxy(WindowX / 2 - 10, WindowY / 2 - 40, _T("1"));
    Sleep(1000);
    clearrectangle(20, 20, WindowX - 20,WindowY - 20);
    outtextxy(WindowX / 2 - 80, WindowY / 2 - 40, _T("start"));
    Sleep(1000);
    clearrectangle(20, 20, WindowX - 20,WindowY -20);
    settextstyle(20, 0, _T("Consolas"));

    //游戏操作主体
    while (1)
    {
        if (_kbhit())
        {
            ch2=_getch();
            ch3=ch2;
        }
        ctrl++;
        while (ctrl > 100)
        {
            ctrl = 0;
            //清理除边界以外的所有东西
            clearrectangle(20, 20, WindowX -20, WindowY - 20);
            //小蛇2方向
            switch (ch2)
            {
            case 'a':
                if (Towards2 != 3)
                {
                    Towards2 = 1;
                }
                break;
            case 'w':
                if (Towards2 != 2)
                {
                    Towards2 = 5;
                }
                break;
            case 's':
                if (Towards2 != 5)
                {
                    Towards2 = 2;
                }
                break;
            case 'd':
                if (Towards2 != 1)
                {
                    Towards2 = 3;
                }
                break;
            default:
                break;
            }
            //小蛇3方向
            switch (ch3)
            {
            case '1':
                if (Towards3 != 3)
                {
                    Towards3 = 1;
                }
                break;
            case '2':
                if (Towards3 != 5)
                {
                    Towards3 = 2;
                }
                break;
            case '5':
                if (Towards3 != 2)
                {
                    Towards3 = 5;
                }
                break;
            case '3':
                if (Towards3 != 1)
                {
                    Towards3 = 3;
                }
                break;
            default:
                break;
            }


            //Snake2  是否吃到食物   food

            if (Snake2X[0] == FoodX && Snake2Y[0] == FoodY)
            {
                Snake2Length++;
                FoodX = FoodPositionX();
                FoodY = FoodPositionY();
                FoodCanPut = false;
                while (FoodCanPut == false)
                { 
                    if(FoodX != Snake2X[0] && FoodY != Snake2Y[0] && FoodX != Snake3X[0] && FoodY != Snake3Y[0] && FoodX != Food2X && FoodY != Food2Y && FoodX != Food3X && FoodY != Food3Y)
                    {
                        FoodCanPut = true;
                    }
                    else if(FoodX == Snake2X[0] && FoodY == Snake2Y[0] || FoodX == Snake3X[0] && FoodY == Snake3Y[0] || FoodX == Food2X && FoodY == Food2Y || FoodX == Food3X && FoodY == Food3Y)
                    {
                        FoodX = FoodPositionX();
                        FoodY = FoodPositionY();
                        FoodCanPut = false;
                    }
                }
            }
            //判断 snake3   吃掉  food
            if (Snake3X[0] == FoodX && Snake3Y[0] == FoodY)
            {
                Snake3Length++;
                FoodX = FoodPositionX();
                FoodY = FoodPositionY();
                FoodCanPut = false;
                while (FoodCanPut == false)
                { 
                    if(FoodX != Snake2X[0] && FoodY != Snake2Y[0] && FoodX != Snake3X[0] && FoodY != Snake3Y[0] && FoodX != Food2X && FoodY != Food2Y && FoodX != Food3X && FoodY != Food3Y)
                    {
                        FoodCanPut = true;
                    }
                    else if(FoodX == Snake2X[0] && FoodY == Snake2Y[0] || FoodX == Snake3X[0] && FoodY == Snake3Y[0] || FoodX == Food2X && FoodY == Food2Y || FoodX == Food3X && FoodY == Food3Y)
                    {
                        FoodX = FoodPositionX();
                        FoodY = FoodPositionY();
                        FoodCanPut = false;
                    }
                }
            }

            //snake2 和 food2
            if (Snake2X[0] == Food2X && Snake2Y[0] == Food2Y)
            {
                Snake2Length++;
                Food2X = Food2PositionX();
                Food2Y = Food2PositionY();
                Food2CanPut = false;
                while (Food2CanPut == false)
                { 
                    if(Food2X != Snake2X[0] && Food2Y != Snake2Y[0] && Food2X != Snake3X[0] && Food2Y != Snake3Y[0] && Food2X != FoodX && Food2Y != FoodY && Food2X != Food3X && Food2Y != Food3Y)
                    {
                        Food2CanPut = true;
                    }
                    else if(Food2X == Snake2X[0] && Food2Y == Snake2Y[0] || Food2X == Snake3X[0] && Food2Y == Snake3Y[0] || Food2X == FoodX && Food2Y == FoodY || Food2X == Food3X && Food2Y == Food3Y)
                    {
                        Food2X = Food2PositionX();
                        Food2Y = Food2PositionY();
                        Food2CanPut = false;
                    }
                }
            }

            //snake3 和 food2
            if (Snake3X[0] == Food2X && Snake3Y[0] == Food2Y)
            {
                Snake3Length++;
                Food2X = Food2PositionX();
                Food2Y = Food2PositionY();
                Food2CanPut = false;
                while (Food2CanPut == false)
                { 
                    if(Food2X != Snake2X[0] && Food2Y != Snake2Y[0] && Food2X != Snake3X[0] && Food2Y != Snake3Y[0] && Food2X != FoodX && Food2Y != FoodY && Food2X != Food3X && Food2Y != Food3Y)
                    {
                        Food2CanPut = true;
                    }
                    else if(Food2X == Snake2X[0] && Food2Y == Snake2Y[0] || Food2X == Snake3X[0] && Food2Y == Snake3Y[0] || Food2X == FoodX && Food2Y == FoodY || Food2X == Food3X && Food2Y == Food3Y)
                    {
                        Food2X = Food2PositionX();
                        Food2Y = Food2PositionY();
                        Food2CanPut = false;
                    }
                }
            }

            //snake3 和 food3
            if (Snake3X[0] == Food3X && Snake3Y[0] == Food3Y)
            {
                Snake3Length++;
                Food3X = Food2PositionX();
                Food3Y = Food2PositionY();
                Food3CanPut = false;
                while (Food3CanPut == false)
                { 
                    if(Food3X != Snake2X[0] && Food3Y != Snake2Y[0] && Food3X != Snake3X[0] && Food3Y != Snake3Y[0] && Food3X != FoodX && Food3Y != FoodY && Food3X != Food2X && Food3Y != Food2Y)
                    {
                        Food3CanPut = true;
                    }
                    else if(Food3X == Snake2X[0] && Food3Y == Snake2Y[0] || Food3X == Snake3X[0] && Food3Y == Snake3Y[0] || Food3X == FoodX && Food3Y == FoodY || Food3X == Food2X && Food3Y == Food2Y)
                    {
                        Food3X = Food3PositionX();
                        Food3Y = Food3PositionY();
                        Food3CanPut = false;
                    }
                }
            }

            //snake2 和 food3
            if (Snake2X[0] == Food3X && Snake2Y[0] == Food3Y)
            {
                Snake2Length++;
                Food3X = Food2PositionX();
                Food3Y = Food2PositionY();
                Food3CanPut = false;
                while (Food3CanPut == false)
                { 
                    if(Food3X != Snake2X[0] && Food3Y != Snake2Y[0] && Food3X != Snake3X[0] && Food3Y != Snake3Y[0] && Food3X != FoodX && Food3Y != FoodY && Food3X != Food2X && Food3Y != Food2Y)
                    {
                        Food3CanPut = true;
                    }
                    else if(Food3X == Snake2X[0] && Food3Y == Snake2Y[0] || Food3X == Snake3X[0] && Food3Y == Snake3Y[0] || Food3X == FoodX && Food3Y == FoodY || Food3X == Food2X && Food3Y == Food2Y)
                    {
                        Food3X = Food3PositionX();
                        Food3Y = Food3PositionY();
                        Food3CanPut = false;
                    }
                }
            }
            //计算尾巴坐标
            for (i = Snake2Length - 1;i >= 0; i--)
            {
                if(i != 0)
                {
                    Snake2X[i] = Snake2X[i-1];
                    Snake2Y[i] = Snake2Y[i-1];
                }
            }
            for (i = Snake3Length - 1;i >= 0; i--)
            {
                if(i != 0)
                {
                    Snake3X[i] = Snake3X[i-1];
                    Snake3Y[i] = Snake3Y[i-1];
                }
            }
            //蛇头坐标
            switch (Towards2)
            {
            case 1:
                Snake2X[0] -= 20;
                break;
            case 2:
                Snake2Y[0] += 20;
                break;
            case 3:
                Snake2X[0] += 20;
                break;
            case 5:
                Snake2Y[0] -= 20;
                break;
            }
            switch (Towards3)
            {
            case 1:
                Snake3X[0] -= 20;
                break;
            case 2:
                Snake3Y[0] += 20;
                break;
            case 3:
                Snake3X[0] += 20;
                break;
            case 5:
                Snake3Y[0] -= 20;
                break;
            }
            //小蛇撞身子后
            for (i = 1; i < Snake2Length; i++)
            {
                if(Snake3X[1] != Snake2X[0] && Snake3Y[1] != Snake2Y[0])
                if(Snake2X[i] == Snake3X[0] && Snake2Y[i] == Snake3Y[0])
                {
                    Snake3X[0] = 10;
                }
            }
            for (i = 1; i < Snake3Length; i++)
            {
                if(Snake2X[1] != Snake3X[0] && Snake2Y[1] != Snake3Y[0])
                if(Snake3X[i] == Snake2X[0] && Snake3Y[i] == Snake2Y[0])
                {
                    Snake2X[0] = 10;
                }
            }
            if(Snake2X[0] == Snake3X[1] && Snake2Y[0] == Snake3Y[1])
            if(Snake3X[0] == Snake2X[1] && Snake3Y[0] == Snake2Y[1])
            {
                if(Snake2Length > Snake3Length)
                {
                    Snake3X[0] = 10;
                }
                else if(Snake2Length < Snake3Length)
                {
                    Snake2X[0] = 10;
                }
                else if(Snake2Length = Snake3Length)
                {
                    outtextxy(WindowX / 2 -20, WindowY / 2 - 40, _T("^ W ^"));
                    outtextxy(WindowX / 2 -50, WindowY / 2, _T("Snake2(平)_VS_Snake3(平)"));
                    outtextxy(WindowY / 2 +30, WindowY / 2 + 40, _T("按任意键继续"));
                    system("pause");
                    cleardevice();
                    outtextxy(WindowX / 2 -20, WindowY / 2 - 40, _T("^ O ^"));
                    outtextxy(WindowX / 2 - 75, WindowY / 2 - 10, _T("按“Y”重新选游戏模式"));
                    outtextxy(WindowX / 2 - 75, WindowY / 2 + 10, _T("按“N”退出游戏私下斗"));
                    while(1)
                    {
                        ch = _getch();
                        if(ch == 'y' || ch == 'Y')
                        {
                            goto reStart;
                        }
                        else if(ch == 'n' || ch == 'N')
                        {
                            goto endGame;
                        }
                    } 
                }
            }
            //结束时刻--Snake3胜利
            if (Snake2X[0] >= WindowX - 10 || Snake2X[0] <= 10 || Snake2Y[0] >= WindowY - 10 || Snake2Y[0] <= 10)
            {
                cleardevice();
                outtextxy(WindowX / 2 -20, WindowY / 2 - 40, _T("^ W ^"));
                outtextxy(WindowX / 2 -50, WindowY / 2, _T("Snake2(败)_VS_Snake3(胜)"));
                outtextxy(WindowY / 2 +30, WindowY / 2 + 40, _T("按任意键继续"));
                system("pause");
                cleardevice();
                outtextxy(WindowX / 2 -20, WindowY / 2 - 40, _T("^ O ^"));
                outtextxy(WindowX / 2 - 75, WindowY / 2 - 10, _T("按“Y”重新选游戏模式"));
                outtextxy(WindowX / 2 - 75, WindowY / 2 + 10, _T("按“N”退出游戏私下斗"));
                while(1)
                {
                    ch = _getch();
                    if(ch == 'y' || ch == 'Y')
                    {
                        goto reStart;
                    }
                    else if(ch == 'n' || ch == 'N')
                    {
                        goto endGame;
                    }
                } 
            }
            //结束时刻--Snake2胜利
            if (Snake3X[0] >= WindowX - 10 || Snake3X[0] <= 10 || Snake3Y[0] >= WindowY - 10 || Snake3Y[0] <= 10)
            {
                cleardevice();
                outtextxy(WindowX / 2 -20, WindowY / 2 - 40, _T("^ W ^"));
                outtextxy(WindowX / 2 -50, WindowY / 2, _T("Snake2(胜)_VS_Snake3(败)"));
                outtextxy(WindowY / 2 +30, WindowY / 2 + 40, _T("按任意键继续"));
                system("pause");
                cleardevice();
                outtextxy(WindowX / 2 -20, WindowY / 2 - 40, _T("^ O ^"));
                outtextxy(WindowX / 2 - 75, WindowY / 2 - 10, _T("按“Y”重新选游戏模式"));
                outtextxy(WindowX / 2 - 75, WindowY / 2 + 10, _T("按“N”退出游戏私下斗"));
                while(1)
                {
                    ch = _getch();
                    if(ch == 'y' || ch == 'Y')
                    {
                        goto reStart;
                    }
                    else if(ch == 'n' || ch == 'N')
                    {
                        goto endGame;
                    }
                } 
            }
            //设置细节
            BeginBatchDraw();
            setlinecolor(FoodColor);
            rectangle(FoodX - 5, FoodY - 5, FoodX + 5, FoodY + 5);
            setlinecolor(Food2Color);
            rectangle(Food2X - 5, Food2Y - 5, Food2X + 5, Food2Y + 5);
            setlinecolor(Food3Color);
            rectangle(Food3X - 5, Food3Y - 5, Food3X + 5, Food3Y + 5);
            setlinecolor(Snake2Color);
            for (i = 0; i < Snake2Length; i++)
            {
                rectangle(Snake2X[i] - 8, Snake2Y[i] - 8, Snake2X[i] + 8, Snake2Y[i] + 8);
            }
            EndBatchDraw();
            setlinecolor(Snake3Color);
            for (i = 0; i < Snake3Length; i++)
            {
                rectangle(Snake3X[i] - 8, Snake3Y[i] - 8, Snake3X[i] + 8, Snake3Y[i] + 8);
            }
            EndBatchDraw();
            Sleep(100);
        }
    }
endGame:
    delete[] SnakeX;
    delete[] SnakeY;

    return 0;
} 

我对于双人模式,是想让两条蛇同时争夺三个食物,只需要判定食物生成和蛇头以及其他食物不重合就行了。双人模式蛇可以过自己的身子,但是不能碰到另一条蛇的身子,如果是头对头相撞,则比较长度来判断胜负(个人觉得如果要使用for循环来判定食物不在两条蛇身子上,运算次数几何倍增,电脑算不过来。)。我检擦了很久都没找不问题,请帮帮我。

第一个问题
加载食物会卡住,是因为你那里生成食物条件没有绝对出口,if ... else if ,经过我调试,会有某个食物坐标生成是没法满足if ...else if 这两个条件,导致一直在死循环中,所以就卡在了,你要改成这样就好了!


    //设置三个食物的坐标
    FoodX = FoodPositionX();
    FoodY = FoodPositionY();
    while (FoodCanPut == false) {
        if (FoodX != Snake2X[0] && FoodY != Snake2Y[0] && FoodX != Snake3X[0] && FoodY != Snake3Y[0]) {
            FoodCanPut = true;
        } else /*if (FoodX == Snake2X[0] && FoodY == Snake2Y[0] || FoodX == Snake3X[0] && FoodY == Snake3Y[0])*/ {
            FoodX = FoodPositionX();
            FoodY = FoodPositionY();
            FoodCanPut = false;
        }
    }
    Food2X = Food2PositionX();
    Food2Y = Food2PositionY();
    while (Food2CanPut == false) {
        if (Food2X != Snake2X[0] && Food2Y != Snake2Y[0] && Food2X != Snake3X[0] && Food2Y != Snake3Y[0] && Food2X != FoodX && Food2Y != FoodY) {
            Food2CanPut = true;
        } else /*if (FoodX == Snake2X[0] && Food2Y == Snake2Y[0] || Food2X == Snake3X[0] && Food2Y == Snake3Y[0] || Food2X == FoodX && Food2Y == FoodY)*/ {
            Food2X = Food2PositionX();
            Food2Y = Food2PositionY();
            Food2CanPut = false;
        }
    }
    Food3X = Food3PositionX();
    Food3Y = Food3PositionY();
    while (Food3CanPut == false) {
        if (Food3X != Snake2X[0] && Food3Y != Snake2Y[0] && Food3X != Snake3X[0] && Food3Y != Snake3Y[0] && Food3X != FoodX && Food3Y != FoodY && Food3X != Food2X && Food3Y != Food2Y) {
            Food3CanPut = true;
        } else /*if (Food3X == Snake2X[0] && Food3Y == Snake2Y[0] || Food3X == Snake3X[0] && Food3Y == Snake3Y[0] || Food3X == FoodX && Food3Y == FoodY || Food3X == Food2X && Food3Y == Food2Y)*/ {
            Food3X = Food3PositionX();
            Food3Y = Food3PositionY();
            Food3CanPut = false;
        }
    }

第二个问题,当蛇吃到食物后,重写加载另一个食物也会卡住,问题和上面是一样的。改一下就好了!


//Snake2  是否吃到食物   food
if (Snake2X[0] == FoodX && Snake2Y[0] == FoodY) {
    Snake2Length++;
    FoodX = FoodPositionX();
    FoodY = FoodPositionY();
    FoodCanPut = false;
    while (FoodCanPut == false) {
        if (FoodX != Snake2X[0] && FoodY != Snake2Y[0] && FoodX != Snake3X[0] && FoodY != Snake3Y[0] && FoodX != Food2X && FoodY != Food2Y && FoodX != Food3X && FoodY != Food3Y) {
            FoodCanPut = true;
        } else /*if (FoodX == Snake2X[0] && FoodY == Snake2Y[0] || FoodX == Snake3X[0] && FoodY == Snake3Y[0] || FoodX == Food2X && FoodY == Food2Y || FoodX == Food3X && FoodY == Food3Y)*/ {
            FoodX = FoodPositionX();
            FoodY = FoodPositionY();
            FoodCanPut = false;
        }
    }
}
//判断 snake3   吃掉  food
if (Snake3X[0] == FoodX && Snake3Y[0] == FoodY) {
    Snake3Length++;
    FoodX = FoodPositionX();
    FoodY = FoodPositionY();
    FoodCanPut = false;
    while (FoodCanPut == false) {
        if (FoodX != Snake2X[0] && FoodY != Snake2Y[0] && FoodX != Snake3X[0] && FoodY != Snake3Y[0] && FoodX != Food2X && FoodY != Food2Y && FoodX != Food3X && FoodY != Food3Y) {
            FoodCanPut = true;
        } else /*if (FoodX == Snake2X[0] && FoodY == Snake2Y[0] || FoodX == Snake3X[0] && FoodY == Snake3Y[0] || FoodX == Food2X && FoodY == Food2Y || FoodX == Food3X && FoodY == Food3Y)*/ {
            FoodX = FoodPositionX();
            FoodY = FoodPositionY();
            FoodCanPut = false;
        }
    }
}

//snake2 和 food2
if (Snake2X[0] == Food2X && Snake2Y[0] == Food2Y) {
    Snake2Length++;
    Food2X = Food2PositionX();
    Food2Y = Food2PositionY();
    Food2CanPut = false;
    while (Food2CanPut == false) {
        if (Food2X != Snake2X[0] && Food2Y != Snake2Y[0] && Food2X != Snake3X[0] && Food2Y != Snake3Y[0] && Food2X != FoodX && Food2Y != FoodY && Food2X != Food3X && Food2Y != Food3Y) {
            Food2CanPut = true;
        } else /*if (Food2X == Snake2X[0] && Food2Y == Snake2Y[0] || Food2X == Snake3X[0] && Food2Y == Snake3Y[0] || Food2X == FoodX && Food2Y == FoodY || Food2X == Food3X && Food2Y == Food3Y)*/ {
            Food2X = Food2PositionX();
            Food2Y = Food2PositionY();
            Food2CanPut = false;
        }
    }
}

//snake3 和 food2
if (Snake3X[0] == Food2X && Snake3Y[0] == Food2Y) {
    Snake3Length++;
    Food2X = Food2PositionX();
    Food2Y = Food2PositionY();
    Food2CanPut = false;
    while (Food2CanPut == false) {
        if (Food2X != Snake2X[0] && Food2Y != Snake2Y[0] && Food2X != Snake3X[0] && Food2Y != Snake3Y[0] && Food2X != FoodX && Food2Y != FoodY && Food2X != Food3X && Food2Y != Food3Y) {
            Food2CanPut = true;
        } else /*if (Food2X == Snake2X[0] && Food2Y == Snake2Y[0] || Food2X == Snake3X[0] && Food2Y == Snake3Y[0] || Food2X == FoodX && Food2Y == FoodY || Food2X == Food3X && Food2Y == Food3Y)*/ {
            Food2X = Food2PositionX();
            Food2Y = Food2PositionY();
            Food2CanPut = false;
        }
    }
}

//snake3 和 food3
if (Snake3X[0] == Food3X && Snake3Y[0] == Food3Y) {
    Snake3Length++;
    Food3X = Food2PositionX();
    Food3Y = Food2PositionY();
    Food3CanPut = false;
    while (Food3CanPut == false) {
        if (Food3X != Snake2X[0] && Food3Y != Snake2Y[0] && Food3X != Snake3X[0] && Food3Y != Snake3Y[0] && Food3X != FoodX && Food3Y != FoodY && Food3X != Food2X && Food3Y != Food2Y) {
            Food3CanPut = true;
        } else /*if (Food3X == Snake2X[0] && Food3Y == Snake2Y[0] || Food3X == Snake3X[0] && Food3Y == Snake3Y[0] || Food3X == FoodX && Food3Y == FoodY || Food3X == Food2X && Food3Y == Food2Y)*/ {
            Food3X = Food3PositionX();
            Food3Y = Food3PositionY();
            Food3CanPut = false;
        }
    }
}

//snake2 和 food3
if (Snake2X[0] == Food3X && Snake2Y[0] == Food3Y) {
    Snake2Length++;
    Food3X = Food2PositionX();
    Food3Y = Food2PositionY();
    Food3CanPut = false;
    while (Food3CanPut == false) {
        if (Food3X != Snake2X[0] && Food3Y != Snake2Y[0] && Food3X != Snake3X[0] && Food3Y != Snake3Y[0] && Food3X != FoodX && Food3Y != FoodY && Food3X != Food2X && Food3Y != Food2Y) {
            Food3CanPut = true;
        } else /*if (Food3X == Snake2X[0] && Food3Y == Snake2Y[0] || Food3X == Snake3X[0] && Food3Y == Snake3Y[0] || Food3X == FoodX && Food3Y == FoodY || Food3X == Food2X && Food3Y == Food2Y)*/ {
            Food3X = Food3PositionX();
            Food3Y = Food3PositionY();
            Food3CanPut = false;
        }
    }
}
         

至此,你所遇到的卡住问题应该得到了解决!
花了好多时间看你的代码和调试,点个采纳吧!

Easy X,
以前也捯饬过一阵, 官方群氛围还是挺好的,其实可以直接在里面提问的。

稍等,我看下代码能不能里出来代码逻辑。

生成食物的话,可以用一个坐标数组保存非蛇体坐标,并计数为count,然后rand一个数[0,count)就行,这个数就是数组中非蛇身的坐标

生成实物那里和蛇的坐标冲突了

生成食物前,先判断两条蛇的坐标,然后用随机数获取食物坐标,生成坐标