电脑迷宫鼠
补充(Controller里的具体实现)
public class Controller {
@FXML
private TextField startX;
@FXML
private TextField startY;
@FXML
private TextField endX;
@FXML
private TextField endY;
@FXML
private GridPane grid;
@FXML
private ChoiceBox<String> create;
@FXML
private TextField row;
@FXML
private TextField col;
@FXML
private Label wrongMsg;
@FXML
private Label createWrongMsg;
@FXML
private TextArea info;
private int[][] maze;
private int ROW = 59;
private int COL = 59;
private int[][] go = new int[][]{
{-1, 0},
{0, 1},
{1, 0},
{0, -1}
};
private HashMap<Integer, int[]> map = new HashMap<>();
private List<List<int[]>> paths = new LinkedList<>();
@FXML
private void initialize() {
closeMsg();
ObservableList<String> observableList = FXCollections.observableArrayList("自动创建", "手动创建");
create.setItems(observableList);
}
@FXML
void MouseClickedBackground(MouseEvent event) {
closeMsg();
}
@FXML
void MouseClickedCreateStart(MouseEvent event) {
closeMsg();
if (isAThreadRunning("supDfs", "findOne")) {
return;
}
String value = create.getValue();
if ("自动创建".equals(value)) {
System.out.println("自动创建");
try {
int Row = Integer.parseInt(row.getText().length() == 0 ? "0" : row.getText());
int Col = Integer.parseInt(col.getText().length() == 0 ? "0" : col.getText());
if (Row > 3 && Row <= 59 && Col > 3 && Col <= 59) {
if (Row % 2 == 0) Row++;
if (Col % 2 == 0) Col++;
ROW = Row;
COL = Col;
maze = God.getInstance().maze(Row, Col);
} else if (((row.getText().length() == 0) && (col.getText().length() > 0))
|| ((col.getText().length() == 0) && (row.getText().length() > 0))) {
createWrongMsg.setText("行数或列数有误,迷宫创建失败");
createWrongMsg.setVisible(true);
return;
} else if (Row < 3 || Row > 59 || Col < 3 || Col > 59) {
createWrongMsg.setText("行数或列数有误,迷宫创建失败");
createWrongMsg.setVisible(true);
return;
} else {
ROW = 59;
COL = 59;
maze = God.getInstance().maze();
}
System.out.println("迷宫" + maze);
grid.getChildren().clear();
paint();
for (int[] ma : maze) {
System.out.println(Arrays.toString(ma));
}
} catch (NumberFormatException e) {
wrongMsg.setText("输入仅支持合法的数字");
wrongMsg.setVisible(true);
}
} else {
System.out.println("手动创建");
String url = "";
int k = (int) (Math.random() * 8) + 1;
File file = new File("src/handMaking/maze" + k + ".txt");
ROW = 59;
COL = 59;
maze = createMazeByTxt(file);
System.out.println("迷宫" + k);
grid.getChildren().clear();
paint();
for (int[] ma : maze) {
System.out.println(Arrays.toString(ma));
}
}
}
@FXML
void MouseClickedFindBest(MouseEvent event) {
closeMsg();
if (isAThreadRunning("supDfs", "findOne")) {
return;
}
if (maze == null) {
wrongMsg.setText("迷宫还未创建");
wrongMsg.setVisible(true);
return;
}
paint();
findWays();
int size = paths.size();
if (size == 0) {
wrongMsg.setText("起点或终点有误");
wrongMsg.setVisible(true);
} else if (size == 1) {
List<int[]> ints = paths.get(0);
printWays(ints);
} else {
int index = 0;
for (int i = 0; i < paths.size(); i++) {
if (paths.get(i).size() < paths.get(index).size()) index = i;
}
printWays(paths.get(index));
}
}
@FXML
void MouseClickedFindStart(MouseEvent event) throws InterruptedException {
closeMsg();
if (isAThreadRunning("supDfs", "findOne")) {
return;
}
if (maze == null) {
wrongMsg.setText("迷宫还未创建");
wrongMsg.setVisible(true);
return;
}
paint();
int valid = findWays();
if (valid == 0) {
int size = paths.size();
if (size == 0) {
wrongMsg.setText("起点或终点有误");
wrongMsg.setVisible(true);
} else {
List<int[]> ints = paths.get(0);
printWays(ints);
}
}
}
@FXML
void MouseClickedRunAll(MouseEvent event) {
closeMsg();
if (isAThreadRunning("supDfs", "findOne")) {
System.out.println("有其他线程在运行");
return;
}
if (maze == null) {
wrongMsg.setText("迷宫还未创建");
wrongMsg.setVisible(true);
return;
}
try {
findSuperDfs();
} catch (Exception e) {
System.out.println("遍历迷宫可视化异常");
}
}
private void printWays(List<int[]> way) {
Task task = new Task() {
@Override
protected Object call() throws Exception {
int[] ints = way.get(0);
reFresh(ints[0] * COL + ints[1], Color.GREEN);
ints = way.get(way.size() - 1);
reFresh(ints[0] * COL + ints[1], Color.RED);
for (int j = 1; j < way.size() - 1; j++) {
Thread.sleep(35);
ints = way.get(j);
reFresh(ints[0] * COL + ints[1], Color.ORANGE);
}
return null;
}
;
};
Thread t = new Thread(task, "findOne");
t.start();
}
private int findWays() {
int sX, sY, eX, eY;
try {
sX = Integer.parseInt(startX.getText().length() == 0 ? "1" : startX.getText());
sY = Integer.parseInt(startY.getText().length() == 0 ? "1" : startY.getText());
eX = Integer.parseInt(endX.getText().length() == 0 ? (ROW - 2) + "" : endX.getText());
eY = Integer.parseInt(endY.getText().length() == 0 ? (COL - 2) + "" : endY.getText());
} catch (NumberFormatException e) {
wrongMsg.setText("无法识别坐标");
wrongMsg.setVisible(true);
return -1;
}
if (!isRight(sX, sY, eX, eY)) {
wrongMsg.setText("坐标输入有误");
wrongMsg.setVisible(true);
return -1;
}
System.out.println(maze[sX][sY] + " " + maze[eX][eY]);
paths.clear();
if (maze[sX][sY] != 1 && maze[eX][eY] != 1) {
System.out.println("开始寻找" + sX + " " + sY + " " + eX + " " + eY);
dfs(new LinkedList<>(), sX, sY, eX, eY);
}
System.out.println("一共寻找到 " + paths.size() + " 这么多条路");
return 0;
}
private void dfs(List<int[]> list, int x, int y, int ex, int ey) {
}
private void findSuperDfs() {
}
private boolean superDfs(List<int[]> list, int x, int y, int ex, int ey) {
}
private void reFresh(int index, Color color) {
Rectangle rectangle = (Rectangle) grid.getChildren().get(index);
rectangle.setFill(color);
}
private void paint() {
if (grid.getChildren().size() == 0) {
System.out.println(ROW + " " + COL);
int k = 590 / ROW;
k = Math.min(590 / COL, k);
System.out.println("k的大小为:" + k);
if (k > 20) k = 20;
grid.setPrefHeight(ROW * k);
System.out.println("高度" + ROW * k);
grid.setPrefWidth(COL * k);
System.out.println("宽度" + COL * k);
System.out.println("创建迷宫");
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
Rectangle rec = new Rectangle();
rec.setWidth(k);
rec.setHeight(k);
if (maze[i][j] == 0) rec.setFill(Color.WHITE);
else rec.setFill(Color.BLACK);
grid.add(rec, j * k, i * k);
}
}
} else {
System.out.println("恢复迷宫的颜色");
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
Rectangle rec = (Rectangle) grid.getChildren().get(i * COL + j);
if (maze[i][j] == 0) rec.setFill(Color.WHITE);
else rec.setFill(Color.BLACK);
}
}
}
}
private int isValid(List<int[]> list, int index) {
int[] origin = list.get(index);
if (map.isEmpty()) return -1;
for (Map.Entry<Integer, int[]> entry : map.entrySet()) {
int[] key = entry.getValue();
if (key[0] == origin[0] && key[1] == origin[1])
return entry.getKey();
}
return -1;
}
private boolean isRight(int x, int y, int ex, int ey) {
if (x != 1 && (x < 1 || x > ROW - 2)) return false;
if (y != 1 && (y < 1 || y > COL - 2)) return false;
if (ex != ROW - 2 && (ex < 1 || ex > ROW - 2)) return false;
if (ey != COL - 2 && (ey < 1 || ey > COL - 2)) return false;
return true;
}
private void closeMsg() {
wrongMsg.setVisible(false);
createWrongMsg.setVisible(false);
}
private boolean isAThreadRunning(String... list) {
try {
ThreadGroup threadGroup = Thread.currentThread().getThreadGroup();
Thread[] threads = new Thread[threadGroup.activeCount()];
threadGroup.enumerate(threads);
for (Thread thread : threads) {
System.out.println(thread.getName());
for (String name : list) {
if (name.equals("supDfs") && name.equals(thread.getName())) {
wrongMsg.setText("迷宫正在遍历中……");
wrongMsg.setVisible(true);
return true;
} else if (name.equals("findOne") && name.equals(thread.getName())) {
wrongMsg.setText("迷宫正在寻路中……");
wrongMsg.setVisible(true);
return true;
}
}
}
} catch (NullPointerException e) {
System.out.println("e -> 空指针");
}
return false;
}
private int[][] createMazeByTxt(File file) {
int[][] lab = new int[59][59];
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
String line = bufferedReader.readLine();
if (line != null) {
for (int i = 0; i < 59; i++) {
String[] numbers = line.split(",");
for (int j = 0; j < 59; j++) {
lab[i][j] = Integer.parseInt(numbers[j]);
}
line = bufferedReader.readLine();
}
}
bufferedReader.close();
} catch (IOException e) {
System.out.println("文件未找到……");
}
return lab;
}
}
可能存在的bug
- 数组越界异常,目前没有解决,但是并不会每次都出现,DeBug到了源码层面,实在是看不懂,放弃了。

- 界面展示的异常

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!