所以我一直在C中创建一个游戏,你从一堆房间开始,你必须将它们连接到走廊,所以我一直在做的是在屏幕上运行bfs,然后通过whereFrom阵列。但是到目前为止它只有在xStart和yStart是(0,0)时才有效,如果它们是输出中出现的奇怪的东西,我将首先向你显示我的代码。
u[0]=yStart;
u[1]=xStart;
eq(q,u);
int count = 0;
/*while there are elements in the q*/
while(dq(q,&u))
{
uX = u[1];
uY = u[0];
/*if(uX ==3)
mvprintw(++count,10,"%d %d",uY,uX);
*/
/*break if at the end*/
if((uX == xEnd) && (uY == yEnd))
{
break;
}
seen[uY][uX]=1;
/*Neighbours around the current cell*/
for(i=0;i<4;++i)
{
vX = uX + neighbours[i][1];
vY = uY + neighbours[i][0];
if(!bounds(vX,vY)||seen[vY][vX])
{
continue;
}
c=map[vY][vX];
if((c == '+')||(c=='|')||(c=='-')||(c=='.'))
{
continue;
}
if((p->prev[vY][vX][0]==9999)&&(p->prev[vY][vX][1]==9999))
{
p->prev[vY][vX][1]=uX;
p->prev[vY][vX][0]=uY;
}
u[0]=vY;
u[1]=vX;
/*enqueue*/
eq(q,u);
}
}
uX = xEnd;
uY = yEnd;
coord = malloc(sizeof(int)*2);
while((uX<COL)&&(uY<ROW)&&(p->prev[uY][uX][0]!=9999)&&(p->prev[uY][uX][1]!=9999))
{
count++;
coord[0]=uY;
coord[1]=uX;
uY = p->prev[uY][uX][0];
uX = p->prev[uY][uX][1];
if((uY!=coord[0])&&(coord[1]!=uX))
{
c = map[coord[0]][uX];
if((c == '|')||(c=='-')||(c=='+')||(c=='.'))
{
p->screen[uY][coord[1]]=1;
}
else
{
p->screen[coord[0]][uX]=1;
}
}
p->screen[coord[0]][coord[1]]=1
}
因此,即使我取出所有墙壁和障碍物,如果它从(0,0)开始,它只会构造一条路径,如果xStart和yStart非零,则路径甚至不会显示。顺便说一句,dq和eq分别出列和排队,并且它们完美地工作,我已经测试过了。