📄 maze3d.java
字号:
}
else
handled=false;
return handled;
}
}
class MazeCanvas extends Canvas
{
private boolean invalidated;
public Maze3D maze3D;
public PaintScreen p;
public int previousHeight;
public int previousWidth;
public Rectangle rectangle;
public boolean resize;
MazeCanvas(Maze3D maze3D)
{
this.maze3D=maze3D;
invalidated=false;
previousWidth=0;
previousHeight=0;
p=new PaintScreen(this);
p.start();
}
public void paint(Graphics g)
{
if (invalidated)
{
invalidated=false;
rectangle=bounds();
if ((previousWidth == rectangle.width)
&& (previousHeight == rectangle.height))
resize=false;
else
{
if (maze3D.hexagonalRooms)
maze3D.message.setText("Use Home, Up Arrow, PgUp, End, "
+"Down Arrow, or PgDn to solve.");
else
maze3D.message.setText("Use the arrow keys to solve.");
maze3D.solutionDisplayed=false;
resize=true;
previousWidth=rectangle.width;
previousHeight=rectangle.height;
}
p.startOver(true);
}
else
{
invalidated=true;
hide();
show();
}
}
}
class VertexRec
{
double x;
double y;
VertexRec()
{
x=0.0;
y=0.0;
}
}
class StackRec
{
short index1;
short index2;
StackRec()
{
index1=(short) 0;
index2=(short) 0;
}
}
class POINT
{
int x;
int y;
POINT()
{
x=0;
y=0;
}
}
class PaintScreen extends Thread
{
static private final int NUM_COLORS = 16;
static private final int TOP_COLOR = 12;
/* all but last 3 colors are gray */
static private final int RECTANGLE_SE_NW_COLOR = 10;
static private final int TRIANGLE_SSE_NNW_COLOR = 9;
static private final int TRIANGLE_SE_NW_COLOR = 8;
static private final int RECTANGLE_W_E_COLOR = 7;
static private final int FLOOR_COLOR = 6;
static private final int TRIANGLE_SW_NE_COLOR = 5;
static private final int RECTANGLE_SW_NE_COLOR = 4;
static private final int TRIANGLE_SSW_NNE_COLOR = 3;
static private final int BACKOUT_COLOR = 13;
static private final int ADVANCE_COLOR = 14;
static private final int SOLUTION_COLOR = 15;
static private final double RELATIVE_WIDTH_OF_WALL = 0.25;
/* relative to side of hexagon or square */
static private final double RELATIVE_HEIGHT_OF_WALL = 2.0;
/* relative to side of hexagon or square */
static private final double MIN_WALL_LENGTH_IN_INCHES = 0.20;
static private final double SECONDS_FOR_MAZE_SELECTION = 0.25;
static private final int SUBSTITUTION_HIGH [] =
{ 4,1,2,8,8,9,9,6,5,7,2,1,2,9,8,8,6,3,5,1,9,5,4,4,9,8,6,
0,8,0,6,0,2,4,1,9,2,0,7,4,7,3,0,0,2,6,8,9,4,0,8,3,2,3,
2,5,2,4,6,9,7,9,1,3,5,7,1,1,4,5,8,1,6,0,5,7,8,2,3,3,7,
3,5,1,7,5,4,0,3,6,3,7,7,1,9,4,0,5,6,6
};
static private final int SUBSTITUTION_LOW [] =
{ 1,2,2,1,5,5,4,6,4,6,4,4,5,6,6,3,0,9,6,5,7,2,0,9,3,4,2,
3,9,1,9,9,9,3,8,9,3,4,1,5,0,5,2,7,0,8,8,0,4,5,0,3,6,8,
1,7,8,8,7,1,3,2,7,7,1,8,0,3,7,5,2,6,4,0,9,9,7,7,4,6,2,
0,0,1,7,3,6,6,1,1,2,4,5,9,8,2,8,8,3,5
};
private int adjacency;
public boolean alreadyPainting;
private VertexRec baseRectangle [] [];
private VertexRec baseTriangle [] [];
private boolean clearUserAttempts;
private char computerPage [] [];
private double cosTilt;
private int counter0;
private int counter1;
private int counter2;
private int counter3;
private int counter4;
private int counter5;
private int counter6;
private int counter7;
private Graphics graph;
private boolean hexagonalRooms;
private int hexDeltaX [] [];
private int hexDeltaY [] [];
private int maxX;
private int maxY;
private MazeCanvas mazeCanvas;
private boolean minimized;
private int numColumns;
private int numRoomsInMaze;
private int numRoomsInSolution;
private int numRows;
private boolean paint;
private double pixelsPerX;
private double pixelsPerZ;
public VertexRec rectangle [] [];
private Color redGreenBlue [];
private double relDistOfUserFromScreen;
private boolean resize;
public boolean restart;
private Rectangle screen;
private int seed [];
private double sinTilt;
private boolean solutionDisplayed;
private int sqrDeltaX [] [];
private int sqrDeltaY [] [];
private double sqrt3;
private StackRec stack [];
public int state;
private double tilt;
public boolean userHasSolved;
private char userPage [] [];
private int userX;
private double userXRelative;
private int userY;
private double userYRelative;
private int x;
private double xMax;
private double xOffset;
private int y;
private double yMax;
private int yMod4;
private double yOffset;
PaintScreen(MazeCanvas mazeCanvas)
{
int colorNum;
int deltaIndex1a;
int deltaIndex1b;
int deltaIndex1c;
int deltaIndex1d;
int deltaIndex1e;
int deltaIndex1f;
int deltaIndex2;
int objectNum;
int tint;
int vertexNum;
setDaemon(true);
this.mazeCanvas=mazeCanvas;
restart=false;
hexagonalRooms=this.mazeCanvas.maze3D.hexagonalRooms;
clearUserAttempts=true;
state=5;
baseRectangle=new VertexRec [6] [4];
for (objectNum=0; objectNum < 6; ++objectNum)
for (vertexNum=0; vertexNum < 4; ++vertexNum)
baseRectangle[objectNum][vertexNum]
=new VertexRec();
rectangle=new VertexRec [6] [4];
for (objectNum=0; objectNum < 6; ++objectNum)
for (vertexNum=0; vertexNum < 4; ++vertexNum)
rectangle[objectNum][vertexNum]
=new VertexRec();
baseTriangle=new VertexRec [4] [3];
for (objectNum=0; objectNum < 4; ++objectNum)
for (vertexNum=0; vertexNum < 3; ++vertexNum)
baseTriangle[objectNum][vertexNum]
=new VertexRec();
hexDeltaX=new int [6] [720];
hexDeltaY=new int [6] [720];
sqrDeltaX=new int [4] [24];
sqrDeltaY=new int [4] [24];
redGreenBlue=new Color [16];
computerPage=null;
userPage=null;
stack=null;
alreadyPainting=false;
solutionDisplayed=false;
userHasSolved=false;
minimized=false;
hexDeltaY[0][0]=-1;
hexDeltaX[0][0]=-2;
hexDeltaY[1][0]=1;
hexDeltaX[1][0]=-2;
hexDeltaY[2][0]=-2;
hexDeltaX[2][0]=0;
hexDeltaY[3][0]=2;
hexDeltaX[3][0]=0;
hexDeltaY[4][0]=-1;
hexDeltaX[4][0]=2;
hexDeltaY[5][0]=1;
hexDeltaX[5][0]=2;
deltaIndex2=0;
for (deltaIndex1a=0; deltaIndex1a < 6;
++deltaIndex1a)
for (deltaIndex1b=0; deltaIndex1b < 6;
++deltaIndex1b)
if (deltaIndex1a != deltaIndex1b)
for (deltaIndex1c=0; deltaIndex1c < 6; ++deltaIndex1c)
if ((deltaIndex1a != deltaIndex1c)
&& (deltaIndex1b != deltaIndex1c))
for (deltaIndex1d=0; deltaIndex1d < 6; ++deltaIndex1d)
if ((deltaIndex1a != deltaIndex1d)
&& (deltaIndex1b != deltaIndex1d)
&& (deltaIndex1c != deltaIndex1d))
for (deltaIndex1e=0; deltaIndex1e < 6; ++deltaIndex1e)
if ((deltaIndex1a != deltaIndex1e)
&& (deltaIndex1b != deltaIndex1e)
&& (deltaIndex1c != deltaIndex1e)
&& (deltaIndex1d != deltaIndex1e))
for (deltaIndex1f=0; deltaIndex1f < 6; ++deltaIndex1f)
if ((deltaIndex1a != deltaIndex1f)
&& (deltaIndex1b != deltaIndex1f)
&& (deltaIndex1c != deltaIndex1f)
&& (deltaIndex1d != deltaIndex1f)
&& (deltaIndex1e != deltaIndex1f))
{
hexDeltaX[deltaIndex1a][deltaIndex2]
=hexDeltaX[0][0];
hexDeltaY[deltaIndex1a][deltaIndex2]
=hexDeltaY[0][0];
hexDeltaX[deltaIndex1b][deltaIndex2]
=hexDeltaX[1][0];
hexDeltaY[deltaIndex1b][deltaIndex2]
=hexDeltaY[1][0];
hexDeltaX[deltaIndex1c][deltaIndex2]
=hexDeltaX[2][0];
hexDeltaY[deltaIndex1c][deltaIndex2]
=hexDeltaY[2][0];
hexDeltaX[deltaIndex1d][deltaIndex2]
=hexDeltaX[3][0];
hexDeltaY[deltaIndex1d][deltaIndex2]
=hexDeltaY[3][0];
hexDeltaX[deltaIndex1e][deltaIndex2]
=hexDeltaX[4][0];
hexDeltaY[deltaIndex1e][deltaIndex2]
=hexDeltaY[4][0];
hexDeltaX[deltaIndex1f][deltaIndex2]
=hexDeltaX[5][0];
hexDeltaY[deltaIndex1f][deltaIndex2++]
=hexDeltaY[5][0];
}
sqrDeltaY[0][0]=0;
sqrDeltaX[0][0]=-1;
sqrDeltaY[1][0]=1;
sqrDeltaX[1][0]=0;
sqrDeltaY[2][0]=0;
sqrDeltaX[2][0]=1;
sqrDeltaY[3][0]=-1;
sqrDeltaX[3][0]=0;
deltaIndex2=0;
for (deltaIndex1a=0; deltaIndex1a < 4; ++deltaIndex1a)
for (deltaIndex1b=0; deltaIndex1b < 4; ++deltaIndex1b)
if (deltaIndex1a != deltaIndex1b)
for (deltaIndex1c=0; deltaIndex1c < 4; ++deltaIndex1c)
if ((deltaIndex1a != deltaIndex1c)
&& (deltaIndex1b != deltaIndex1c))
for (deltaIndex1d=0; deltaIndex1d < 4; ++deltaIndex1d)
if ((deltaIndex1a != deltaIndex1d)
&& (deltaIndex1b != deltaIndex1d)
&& (deltaIndex1c != deltaIndex1d))
{
sqrDeltaX[deltaIndex1a][deltaIndex2]=sqrDeltaX[0][0];
sqrDeltaY[deltaIndex1a][deltaIndex2]=sqrDeltaY[0][0];
sqrDeltaX[deltaIndex1b][deltaIndex2]=sqrDeltaX[1][0];
sqrDeltaY[deltaIndex1b][deltaIndex2]=sqrDeltaY[1][0];
sqrDeltaX[deltaIndex1c][deltaIndex2]=sqrDeltaX[2][0];
sqrDeltaY[deltaIndex1c][deltaIndex2]=sqrDeltaY[2][0];
sqrDeltaX[deltaIndex1d][deltaIndex2]=sqrDeltaX[3][0];
sqrDeltaY[deltaIndex1d][deltaIndex2++]=sqrDeltaY[3][0];
}
sqrt3=Math.sqrt(3.0);
for (colorNum=0; colorNum <= NUM_COLORS-4; ++colorNum)
{
/* evenly spaced shades of gray */
tint=(256*colorNum)/(NUM_COLORS-3);
redGreenBlue[colorNum]=new Color(tint,tint,tint);
}
redGreenBlue[BACKOUT_COLOR]=new Color(255,255,0);
redGreenBlue[ADVANCE_COLOR]=new Color(0,255,0);
redGreenBlue[SOLUTION_COLOR]=new Color(255,0,0);
}
private void drawQuadrilateral(
POINT Box [],
int colorNum)
{
int i;
int x [];
int y [];
x=new int [4];
y=new int [4];
for (i=0; i < 4; ++i)
{
x[i]=Box[i].x;
y[i]=Box[i].y;
}
graph.setColor(redGreenBlue[colorNum]);
graph.fillPolygon(x,y,4);
return;
}
private POINT getCorner(
double x,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -