📄 maze.java
字号:
import java.awt.*;
public class Maze extends java.applet.Applet implements Runnable {
int[][] maze; // Description of state of maze. The value of maze[i][j]
// is one of the constants wallCode, pathcode, emptyCode,
// or visitedCode. (Value can also be negative, temporarily,
// inside createMaze().)
// A maze is made up of walls and corridors. maze[i][j]
// is either part of a wall or part of a corridor. A cell
// cell that is part of a cooridor is represented by pathCode
// if it is part of the current path through the maze, by
// visitedCode if it has already been explored without finding
// a solution, and by emptyCode if it has not yet been explored.
final static int backgroundCode = 0;
final static int wallCode = 1;
final static int pathCode = 2;
final static int emptyCode = 3;
final static int visitedCode = 4;
// the next six items are set up in init(), and can be specified
// using applet parameters
Color[] color = new Color[5]; // colors associated with the preceding 5 constants;
int rows = 21; // number of rows of cells in maze, including a wall around edges
int columns = 21; // number of columns of cells in maze, including a wall around edges
int border = 0; // minimum number of pixels between maze and edge of applet
int sleepTime = 5000; // wait time after solving one maze before making another
int speedSleep = 50; // short delay between steps in making and solving maze
Thread mazeThread; // thread for creating and solving maze
Graphics me = null; // graphics context for applet; created in checkSize()
int width = -1; // width of applet, to be set by checkSize()
int height = -1; // height of applet, to be set by checkSize()
int totalWidth; // width of applet, minus border area (set in checkSize())
int totalHeight; // height of applet, minus border area (set in checkSize())
int left; // left edge of maze, allowing for border (set in checkSize())
int top; // top edge of maze, allowing for border (set in checkSize())
boolean mazeExists = false; // set to true when maze[][] is valid; used in
// redrawMaze(); set to true in createMaze(), and
// reset to false in run()
Integer getIntParam(String paramName) {
// Utility routine for reading an applet param which is an integer.
// Returns null if there is no such param, or if the value is not
// a legal integer.
String param = getParameter(paramName);
if (param == null)
return null;
int i;
try {
i = Integer.parseInt(param);
}
catch (NumberFormatException e) {
return null;
}
return new Integer(i);
}
Color getColorParam(String paramName) {
// Utility routine for reading an applet param which is a color.
// Returns null if there is no such param, or if the value is not
// a legal color. Colors can be specified as three integers,
// separated by spaces, giving RGB components in the range 0 to 255;
// the standard Java color names are also acceptable.
String param = getParameter(paramName);
if (param == null || param.length() == 0)
return null;
if (Character.isDigit(param.charAt(0))) { // try to parse RGB color
int r=0,g=0,b=0;
int pos=0;
int d=0;
int len=param.length();
while (pos < len && Character.isDigit(param.charAt(pos)) && r < 255) {
d = Character.digit(param.charAt(pos),10);
r = 10*r + d;
pos++;
}
if (r > 255)
return null;
while (pos < len && !Character.isDigit(param.charAt(pos)))
pos++;
if (pos >= len)
return null;
while (pos < len && Character.isDigit(param.charAt(pos)) && g < 255) {
d = Character.digit(param.charAt(pos),10);
g = 10*g + d;
pos++;
}
if (g > 255)
return null;
while (pos < len && !Character.isDigit(param.charAt(pos)))
pos++;
if (pos >= len)
return null;
while (pos < len && Character.isDigit(param.charAt(pos)) && b < 255) {
d = Character.digit(param.charAt(pos),10);
b = 10*b + d;
pos++;
}
if (b > 255)
return null;
return new Color(r,g,b);
}
if (param.equalsIgnoreCase("black"))
return Color.black;
if (param.equalsIgnoreCase("white"))
return Color.white;
if (param.equalsIgnoreCase("red"))
return Color.red;
if (param.equalsIgnoreCase("green"))
return Color.green;
if (param.equalsIgnoreCase("blue"))
return Color.blue;
if (param.equalsIgnoreCase("yellow"))
return Color.yellow;
if (param.equalsIgnoreCase("cyan"))
return Color.cyan;
if (param.equalsIgnoreCase("magenta"))
return Color.magenta;
if (param.equalsIgnoreCase("pink"))
return Color.pink;
if (param.equalsIgnoreCase("orange"))
return Color.orange;
if (param.equalsIgnoreCase("gray"))
return Color.gray;
if (param.equalsIgnoreCase("darkgray"))
return Color.darkGray;
if (param.equalsIgnoreCase("lightgray"))
return Color.lightGray;
return null; // param is not a legal color
}
public void init() {
Integer parm;
parm = getIntParam("rows");
if (parm != null && parm.intValue() > 4 && parm.intValue() <= 500) {
rows = parm.intValue();
if (rows % 2 == 0)
rows++;
}
parm = getIntParam("columns");
if (parm != null && parm.intValue() > 4 && parm.intValue() <= 500) {
columns = parm.intValue();
if (columns % 2 == 0)
columns++;
}
parm = getIntParam("border");
if (parm != null && parm.intValue() > 0 && parm.intValue() <= 100)
border = parm.intValue();
parm = getIntParam("sleepTime");
if (parm != null && parm.intValue() > 0)
sleepTime = parm.intValue();
parm = getIntParam("speed");
if (parm != null && parm.intValue() > 0 && parm.intValue() < 6)
switch (parm.intValue()) {
case 1: speedSleep = 1; break;
case 2: speedSleep = 25; break;
case 3: speedSleep = 50; break;
case 4: speedSleep = 100; break;
case 5: speedSleep = 200; break;
}
color[wallCode] = getColorParam("wallColor");
if (color[wallCode] == null)
color[wallCode] = Color.black;
color[pathCode] = getColorParam("pathColor");
if (color[pathCode] == null)
color[pathCode] = new Color(200,0,0);
color[emptyCode] = getColorParam("emptyColor");
if (color[emptyCode] == null)
color[emptyCode] = new Color(128,128,255);
color[backgroundCode] = getColorParam("borderColor");
if (color[backgroundCode] == null)
color[backgroundCode] = Color.white;
color[visitedCode] = getColorParam("visitedColor");
if (color[visitedCode] == null)
color[visitedCode] = color[emptyCode];
setBackground(color[backgroundCode]);
}
void checkSize() {
// Called every time something is about to be drawn to
// check the applet size and adjust variables that depend
// on the size. This includes a graphics context for the
// applet.
if (size().width != width || size().height != height) {
width = size().width;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -