我将贪吃蛇分为两个模式,用reStart控制选择进入单人模式(reStart1)还是双人模式(reStart2),进入单人模式能完美运行,但是进入双人模式时,画面卡着不动,去掉食物生成又可以运行。
我用的Vusial C++ 6.0,使用了Easy X插件来绘制游戏界面
源代码是
//头文件
#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)就行,这个数就是数组中非蛇身的坐标
生成实物那里和蛇的坐标冲突了
生成食物前,先判断两条蛇的坐标,然后用随机数获取食物坐标,生成坐标