📄 maze3d.java
字号:
if (xNext > maxX)
++adjacency;
else
if (yNext < 0)
++adjacency;
else
if (yNext > maxY)
++adjacency;
else
{
if (computerPage[yNext][xNext] == '\001')
++adjacency;
}
}
}
}
x-=2*hexDeltaX[stack[stackHead].index1][0];
y-=2*hexDeltaY[stack[stackHead--].index1][0];
++numRoomsInSolution;
}
for (deltaIndex=0; deltaIndex < 6; ++deltaIndex)
{
xNext=x+hexDeltaX[deltaIndex][0];
yNext=x+hexDeltaY[deltaIndex][0];
if (computerPage[yNext][xNext] != '\002')
{
if (computerPage[yNext][xNext] == '\000')
{
xNext+=hexDeltaX[deltaIndex][0];
yNext+=hexDeltaY[deltaIndex][0];
if (xNext < 0)
++adjacency;
else
if (xNext > maxX)
++adjacency;
else
if (yNext < 0)
++adjacency;
else
if (yNext > maxY)
++adjacency;
else
{
if (computerPage[yNext][xNext] == '\001')
++adjacency;
}
}
}
}
return;
}
private void hexGenerateMaze(
int seed [])
{
int columnNum;
int deltaIndex1;
int deltaIndex2;
boolean passageFound;
int rN [];
int rNIndex1;
int rNIndex2;
int rowNum;
boolean searchComplete;
int stackHead;
int temInt;
int x;
int xMod8;
int xNext;
int y;
int yMod4;
int yNext;
yNext=0;
xNext=0;
rN=new int [8];
rN[0]=seed[0]+1;
rN[1]=seed[1]+1;
rN[2]=seed[2]+1;
rN[3]=seed[3]+1;
rN[4]=seed[4]+1;
rN[5]=seed[5]+1;
rN[6]=seed[6]+1;
rN[7]=seed[7]+1;
yMod4=1;
for (y=0; y <= maxY; ++y)
{
if (yMod4 == 1)
{
xMod8=1;
for (x=0; x <= maxX; ++x)
{
if ((((xMod8 == 0) && (y != 0) && (y != maxY))
|| (xMod8 == 3) || (xMod8 == 4) || (xMod8 == 5)))
computerPage[y][x]='\000';
else
computerPage[y][x]='\002';
if (++xMod8 >= 8)
xMod8=0;
}
}
else
if ((yMod4 == 0) || (yMod4 == 2))
{
xMod8=1;
for (x=0; x <= maxX; ++x)
{
if ((xMod8 == 2) || (xMod8 == 6))
computerPage[y][x]='\000';
else
computerPage[y][x]='\002';
if (++xMod8 >= 8)
xMod8=0;
}
}
else
{
xMod8=1;
for (x=0; x <= maxX; ++x)
{
if ((xMod8 == 0) || (xMod8 == 1) || (xMod8 == 4)
|| (xMod8 == 7))
computerPage[y][x]='\000';
else
computerPage[y][x]='\002';
if (++xMod8 >= 8)
xMod8=0;
}
}
if (++yMod4 >= 4)
yMod4=0;
}
columnNum=rN[0];
rNIndex1=0;
rNIndex2=1;
while (rNIndex2 < 8)
{
temInt=rN[rNIndex2];
rN[rNIndex1]=temInt;
columnNum+=temInt;
if (columnNum >= 727)
columnNum-=727;
rNIndex1=rNIndex2++;
}
rN[7]=columnNum;
columnNum%=numColumns;
x=4*columnNum+3;
rowNum=rN[0];
rNIndex1=0;
rNIndex2=1;
while (rNIndex2 < 8)
{
temInt=rN[rNIndex2];
rN[rNIndex1]=temInt;
rowNum+=temInt;
if (rowNum >= 727)
rowNum-=727;
rNIndex1=rNIndex2++;
}
rN[7]=rowNum;
if (columnNum%2 == 0)
{
rowNum%=numRows;
y=4*rowNum+2;
}
else
{
rowNum%=(numRows-1);
y=4*rowNum+4;
}
computerPage[y][x]='\002';
stackHead=-1;
do
{
deltaIndex1=0;
do
{
deltaIndex2=rN[0];
rNIndex1=0;
rNIndex2=1;
while (rNIndex2 < 8)
{
temInt=rN[rNIndex2];
rN[rNIndex1]=temInt;
deltaIndex2+=temInt;
if (deltaIndex2 >= 727)
deltaIndex2-=727;
rNIndex1=rNIndex2++;
}
rN[7]=deltaIndex2;
}
while (deltaIndex2 >= 720);
passageFound=false;
searchComplete=false;
while (! searchComplete)
{
while ((deltaIndex1 < 6) && (! passageFound))
{
xNext=x+2*hexDeltaX[deltaIndex1][deltaIndex2];
if (xNext <= 0)
++deltaIndex1;
else
if (xNext > maxX)
++deltaIndex1;
else
{
yNext=y+2*hexDeltaY[deltaIndex1][deltaIndex2];
if (yNext <= 0)
++deltaIndex1;
else
if (yNext > maxY)
++deltaIndex1;
else
if (computerPage[yNext][xNext] == '\000')
passageFound=true;
else
++deltaIndex1;
}
}
if (! passageFound)
{
if (stackHead >= 0)
{
deltaIndex1=stack[stackHead].index1;
deltaIndex2=stack[stackHead--].index2;
x-=2*hexDeltaX[deltaIndex1][deltaIndex2];
y-=2*hexDeltaY[deltaIndex1++][deltaIndex2];
}
}
searchComplete
=(passageFound || ((stackHead == -1) && (deltaIndex1 >= 6)));
}
if (passageFound)
{
stack[++stackHead].index1=(short) deltaIndex1;
stack[stackHead].index2=(short) deltaIndex2;
computerPage[yNext][xNext]='\002';
computerPage[(y+yNext)/2][(x+xNext)/2]='\002';
x=xNext;
y=yNext;
}
}
while (stackHead != -1);
computerPage[0][3]='\001';
computerPage[maxY][maxX-3]='\002';
return;
}
private void hexSelectMaze()
{
Date today;
double elapsedTime;
int minAdjacency;
int numRoomsInSolutionAtMin;
int seedByte [];
int seedByteAtMin [];
double startTime;
adjacency=0;
numRoomsInSolution=0;
seedByte=new int [8];
seedByteAtMin=new int [8];
counter0=seed[0];
counter1=seed[1];
counter2=seed[2];
counter3=seed[3];
counter4=seed[4];
counter5=seed[5];
counter6=seed[6];
counter7=seed[7];
hash();
minAdjacency=4*numRoomsInMaze+1;
numRoomsInSolutionAtMin=0;
seedByteAtMin[0]=counter0;
seedByteAtMin[1]=counter1;
seedByteAtMin[2]=counter2;
seedByteAtMin[3]=counter3;
seedByteAtMin[4]=counter4;
seedByteAtMin[5]=counter5;
seedByteAtMin[6]=counter6;
seedByteAtMin[7]=counter7;
today=new Date();
startTime=((double) today.getTime())/1000.0;
do
{
seedByte[0]=counter0;
seedByte[1]=counter1;
seedByte[2]=counter2;
seedByte[3]=counter3;
seedByte[4]=counter4;
seedByte[5]=counter5;
seedByte[6]=counter6;
seedByte[7]=counter7;
hexGenerateMaze(seedByte);
hexSolveMaze();
if (3*numRoomsInSolution >= numRoomsInMaze)
{
if (adjacency < minAdjacency)
{
minAdjacency=adjacency;
numRoomsInSolutionAtMin=numRoomsInSolution;
seedByteAtMin[0]=seedByte[0];
seedByteAtMin[1]=seedByte[1];
seedByteAtMin[2]=seedByte[2];
seedByteAtMin[3]=seedByte[3];
seedByteAtMin[4]=seedByte[4];
seedByteAtMin[5]=seedByte[5];
seedByteAtMin[6]=seedByte[6];
seedByteAtMin[7]=seedByte[7];
}
else
{
if (adjacency == minAdjacency)
{
if (numRoomsInSolution > numRoomsInSolutionAtMin)
{
numRoomsInSolutionAtMin=numRoomsInSolution;
seedByteAtMin[0]=seedByte[0];
seedByteAtMin[1]=seedByte[1];
seedByteAtMin[2]=seedByte[2];
seedByteAtMin[3]=seedByte[3];
seedByteAtMin[4]=seedByte[4];
seedByteAtMin[5]=seedByte[5];
seedByteAtMin[6]=seedByte[6];
seedByteAtMin[7]=seedByte[7];
}
}
}
}
increment();
today=new Date();
elapsedTime=((double) today.getTime())/1000.0-startTime;
}
while ((elapsedTime >= 0.0)
&& (elapsedTime < SECONDS_FOR_MAZE_SELECTION));
hexGenerateMaze(seedByteAtMin);
hexSolveMaze();
return;
}
public void hexDisplaySolution()
{
int deltaIndex;
boolean pathFound;
int x;
int xNext;
int xPrevious;
double xRelative;
double xRelativeNext;
int y;
int yNext;
int yPrevious;
double yRelative;
double yRelativeNext;
xRelative=1.0;
yRelative=sqrt3/2.0;
xRelativeNext=0.0;
yRelativeNext=0.0;
graph.setColor(redGreenBlue[SOLUTION_COLOR]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -