如何显示迷宫?

时间:2019-05-03 16:24:49

标签: java swing maze

所以我正在迷宫中工作,但出于我的喜好,我希望它看起来也很吸引人,因此我有一个代码可以工作,但是它不是真正的图形化。基本上,我不需要帮助迷宫才能正常工作,我需要帮助改善它的外观。因此,我试图查看是否有任何方法可以将我需要的内容转换为某种显示为某种颜色的按钮,而不是“ x”“”“”。 “-”和“#”。我还将注意到,我非常了解编码,并且可能不会只理解您是否告诉我“这样做”,因此,如果有人足够帮助我,请耐心等待,因为我很难“做到” / p>

我已经尝试将文本转换为按钮,以便可以对按钮进行颜色编码,并使用每个“ x”“”“”。用颜色表示的“-”“#”,或者如果可以的话(将是首选),将它们替换为类似X,A Line,Barrier等的图像,但是我无法将其用作我从字面上坐在这里毫无头绪。就像我尝试过在线搜索一样,但我只是不知道要寻找什么。

在这里,我有完整的代码,您可以明白我的意思,我希望它在视觉上更具吸引力……我希望使用某种带有颜色或图像的按钮来表示文本。

 package maze;

import java.awt.Font;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class maze {

static JFrame mainFrame = new JFrame("MazeProgram");
static JLabel mazeLabel = new JLabel();
static boolean exitFound = false;

static char[][] puzzle = { { '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#' },
        { '#', ' ', ' ', ' ', '#', ' ', '#', '#', '#', '#', ' ', 'X', '#' },
        { '#', '#', ' ', '#', '#', ' ', '#', ' ', ' ', '#', ' ', '#', '#' },
        { '#', ' ', ' ', ' ', ' ', ' ', '#', ' ', ' ', ' ', ' ', ' ', '#' },
        { '#', ' ', '#', ' ', ' ', '#', '#', '#', '#', ' ', '#', '#', '#' },
        { '#', '#', '#', ' ', '#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#' },
        { '#', ' ', ' ', ' ', ' ', '#', '#', ' ', ' ', '#', '#', '#', '#' },
        { '#', '#', ' ', '#', ' ', ' ', ' ', ' ', ' ', '#', ' ', '#', '#' },
        { '#', ' ', '#', ' ', ' ', ' ', '#', '#', ' ', ' ', ' ', ' ', '#' },
        { '#', ' ', '#', '#', ' ', '#', '#', ' ', '#', ' ', '#', ' ', '#' },
        { '#', ' ', ' ', ' ', ' ', '#', '#', ' ', ' ', ' ', '#', '#', '#' },
        { '#', ' ', '#', '#', '#', ' ', '#', ' ', '#', ' ', ' ', '#', '#' },
        { '#', ' ', ' ', ' ', ' ', ' ', '#', ' ', '#', ' ', ' ', ' ', '#' },
        { '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#' }, };

public static void main(String[] args) throws InterruptedException {
    initializeWindow();
    move(1, 1);
    printMaze();
}

public static void initializeWindow() {
    mainFrame = new JFrame("Maze Solver");
    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    mainFrame.setLayout(null);
    mainFrame.setSize(1920, 1080);
    mainFrame.setLocationRelativeTo(null);

    mazeLabel.setHorizontalAlignment(JLabel.CENTER); // centers the Component
    mazeLabel.setSize(1920, 1080); // sets maze label size
    mazeLabel.setFont(new Font("", Font.BOLD, 28));

    mainFrame.add(mazeLabel);
    mazeLabel.setVisible(true);
    mainFrame.setVisible(true);
}

public static void printMaze() { // prints the maze to a label
    mazeLabel.setText(""); // clear the label
    String tempLine = "<html><pre>"; // stores the maze from the char array to a string set up for html to allow new
                                        // lines. pre tells html to keep multiple spaces

    for (int j = 0; j < puzzle.length; j++) { // changes the row number
        for (int i = 0; i < puzzle[0].length; i++) { // changes the column number.
            tempLine = tempLine + puzzle[j][i] + " "; // add one character from the maze to the string
        }
        tempLine = tempLine + "<br>"; // add a line break to the string
    }
    tempLine = tempLine + "</html>";
    mazeLabel.setText(tempLine); // put the string into the label

}

public static void move(int row, int col) throws InterruptedException {

    if (puzzle[row][col] == 'X') { // checks if the maze is at the end
        exitFound = true;

    } else {

        puzzle[row][col] = '-'; // change the current location symbol to indicate that the spot has been visited
        //Thread.sleep(50);

        if ((exitFound == false) && (puzzle[row][col + 1] == ' ' || puzzle[row][col + 1] == 'X')) {
            move(row, col + 1);
        }
        if ((exitFound == false) && (puzzle[row + 1][col] == ' ' || puzzle[row + 1][col] == 'X')) {
            move(row + 1, col);
        }
        if ((exitFound == false) && (puzzle[row][col - 1] == ' ' || puzzle[row][col - 1] == 'X')) {
            move(row, col - 1);
        }
        if ((exitFound == false) && (puzzle[row - 1][col] == ' ' || puzzle[row - 1][col] == 'X')) {

            move(row - 1, col);
        }

        if (exitFound == true) {
            puzzle[row][col] = '.';
            //Thread.sleep(50);

        }
    }

}
}

我的预期结果是获取该文本的输入并将显示转换为可以在其上放置图像的按钮或至少可以更改其颜色的按钮,而实际输出只是文本,而我没有知道如何转换。

1 个答案:

答案 0 :(得分:1)

这与您在previous question you posted中所做的非常相似。
使用GridPanel并用JLabel s填充它:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Maze { // see java naming conventions https://www.geeksforgeeks.org/java-naming-conventions/

    static char[][] puzzle = { { '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#' },
            { '#', ' ', ' ', ' ', '#', ' ', '#', '#', '#', '#', ' ', 'X', '#' },
            { '#', '#', ' ', '#', '#', ' ', '#', ' ', ' ', '#', ' ', '#', '#' },
            { '#', ' ', ' ', ' ', ' ', ' ', '#', ' ', ' ', ' ', ' ', ' ', '#' },
            { '#', ' ', '#', ' ', ' ', '#', '#', '#', '#', ' ', '#', '#', '#' },
            { '#', '#', '#', ' ', '#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#' },
            { '#', ' ', ' ', ' ', ' ', '#', '#', ' ', ' ', '#', '#', '#', '#' },
            { '#', '#', ' ', '#', ' ', ' ', ' ', ' ', ' ', '#', ' ', '#', '#' },
            { '#', ' ', '#', ' ', ' ', ' ', '#', '#', ' ', ' ', ' ', ' ', '#' },
            { '#', ' ', '#', '#', ' ', '#', '#', ' ', '#', ' ', '#', ' ', '#' },
            { '#', ' ', ' ', ' ', ' ', '#', '#', ' ', ' ', ' ', '#', '#', '#' },
            { '#', ' ', '#', '#', '#', ' ', '#', ' ', '#', ' ', ' ', '#', '#' },
            { '#', ' ', ' ', ' ', ' ', ' ', '#', ' ', '#', ' ', ' ', ' ', '#' },
            { '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#' }, };

    public static void main(String[] args) throws InterruptedException {
        Maze maze = new Maze();
        maze.initializeWindow();
    }

    private void initializeWindow() {
        JFrame mainFrame = new JFrame("Maze Solver");
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.setLayout(new GridLayout(puzzle.length, puzzle[0].length));// avoid null layouts
        //mainFrame.setSize(1920, 1080); //use preferred size and let layout manager set the size
        mainFrame.setLocationRelativeTo(null);

        for (int row = 0; row < puzzle.length; row++) {
            for (int col = 0; col < puzzle[0].length; col++) {
                JLabel label = makeLabel(puzzle[row][col]);
                mainFrame.add(label);
            }
        }
        mainFrame.pack();
        mainFrame.setVisible(true);
    }

    private JLabel makeLabel(char c) {

        JLabel label= new JLabel();
        label.setHorizontalAlignment(JLabel.CENTER);
        label.setPreferredSize(new Dimension(40, 40));
        switch(c) {
            case '#':
                label.setBackground(Color.BLUE);
                break;
            default:
                label.setBackground(Color.WHITE);
                break;

        }
        label.setOpaque(true);
        label.setBorder(BorderFactory.createLineBorder(Color.WHITE, 1));
        return label;
    }
}

删除了对于答案不是必不可少的代码,以使其成为mcve

enter image description here