如何展示迷宫?
How to display a maze?
所以我正在研究迷宫,但出于我自己的喜好,我希望它在视觉上也很吸引人,所以我得到了一个可以工作的代码,但它并不是真正的图形化。基本上我不需要帮助让迷宫正常工作我需要帮助改善它的外观。所以我想看看是否有任何方法可以将我拥有的东西转换为某种显示为某种颜色的按钮,而不是 "x" " " "。 “-“ 和 ”#”。我还会注意到,我非常了解编码,如果你告诉我,我可能不会理解 "do this" 所以如果有人好心帮助我,请耐心等待,因为我很难做到 "do that"
我已经尝试将我的文本转换为按钮,这样我就可以对我的按钮进行颜色编码并让我的每个 "x"“”“。 “-”“#”用颜色表示,或者如果我可以(这将是首选选项),将它们替换为像 X a Line a 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);
}
}
}
}
我的预期结果是获取该文本的输入并将显示转换为我可以在上面放置图像的按钮,或者至少是我可以更改颜色的按钮,实际输出只是文本和我不知道如何转换它。
这与您在 中所做的非常相似。
使用 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。
所以我正在研究迷宫,但出于我自己的喜好,我希望它在视觉上也很吸引人,所以我得到了一个可以工作的代码,但它并不是真正的图形化。基本上我不需要帮助让迷宫正常工作我需要帮助改善它的外观。所以我想看看是否有任何方法可以将我拥有的东西转换为某种显示为某种颜色的按钮,而不是 "x" " " "。 “-“ 和 ”#”。我还会注意到,我非常了解编码,如果你告诉我,我可能不会理解 "do this" 所以如果有人好心帮助我,请耐心等待,因为我很难做到 "do that"
我已经尝试将我的文本转换为按钮,这样我就可以对我的按钮进行颜色编码并让我的每个 "x"“”“。 “-”“#”用颜色表示,或者如果我可以(这将是首选选项),将它们替换为像 X a Line a 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);
}
}
}
}
我的预期结果是获取该文本的输入并将显示转换为我可以在上面放置图像的按钮,或者至少是我可以更改颜色的按钮,实际输出只是文本和我不知道如何转换它。
这与您在
使用 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。