- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个合作伙伴项目,我的合作伙伴为游戏创建一个解算器类,而我的部分是创建 MazeGUI。
当您单击 Solve JButton
时,它应该突出显示它在 GUI 本身上所采取的路径,但它只突出显示它“结束”的位置,即最右下角,而不是因为它是“W”,所以不应该可访问。如果有解决方案,“F”将变成“RIP”,如果迷宫没有解决方案,则应该有一个 JLabel
表示迷宫无法解决。
如何在解决按钮的 ActionListener 下的代码中输入所有这些内容?
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class MazeGUI {
String appName = "Zombie Attack!";
JLabel appNameLabel;
private JFrame frame;
private JPanel buttonPanel, solvePanel;
private JButton solveButton;
// private JLabel noSolutionLabel;
private final int rowCount = 10;
private final int colCount = 10;
private final int startRow = 0;
private final int startCol = 1;
private final int endRow = rowCount - 1;
private final int endCol = colCount - 2;
String[][] map;
private void createAndShowGui() {
frame = new JFrame("Zombie Attack!");
solveButton = new JButton("Solve");
map = new String[rowCount][colCount];
buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(rowCount, colCount, 2, 2));
appNameLabel = new JLabel(appName);
for (int rows = 0; rows < rowCount; rows++) {
for (int columns = 0; columns < colCount; columns++) {
map[rows][columns] = " ";
final JLabel jlabel = new JLabel("");
jlabel.setBackground(Color.BLACK);
if (rows == startRow && columns == startCol) {
jlabel.setBackground(Color.BLACK);
jlabel.setForeground(Color.MAGENTA);
jlabel.setText("S");
map[startRow][startCol] = "S";
}
if (rows == endRow && columns == endCol) {
jlabel.setBackground(Color.BLACK);
jlabel.setForeground(Color.MAGENTA);
jlabel.setText("F");
map[endRow][endCol] = "F";
}
if (!(rows == startRow && columns == startCol || rows == endRow
&& columns == endCol)) {
if (rows == 0 || rows == rowCount - 1 || columns == 0
|| columns == colCount - 1) {
jlabel.setBackground(Color.LIGHT_GRAY);
map[rows][columns] = "W";
}
}
final int rc = rows;
final int cc = columns;
jlabel.addMouseListener(new MouseListener() {
boolean clicked = false;
@Override
public void mouseClicked(MouseEvent e) {
if (clicked == false) {
clicked = true;
jlabel.setBackground(Color.LIGHT_GRAY);
map[rc][cc] = "W";
} else {
clicked = false;
jlabel.setBackground(Color.BLACK);
map[rc][cc] = "";
}
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
});
solveButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
MazeSolver solver;
solver = new MyMazeSolver();
solver.solve(map);
jlabel.setBackground(Color.RED);
jlabel.setForeground(Color.GREEN);
jlabel.setText("RIP");
for (int i = 0; i < map.length; i++){
for (int j = 0; j < map[0].length; j++){
System.out.print(map[i][j] + " ");
}
System.out.println();
}
}
});
System.out.print(map[rows][columns] + " ");
buttonPanel.add(jlabel);
jlabel.setOpaque(true);
}
System.out.println();
}
frame.add(appNameLabel, BorderLayout.NORTH);
frame.add(buttonPanel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setSize(500, 500);
frame.add(solveButton, BorderLayout.SOUTH);
frame.setVisible(true);
}
public static void main(String[] args) {
MazeGUI maze = new MazeGUI();
maze.createAndShowGui();
}
}
这是求解器的界面:
public interface MazeSolver {
public String[][] solve(String[][] map);
}
这是我合作伙伴的代码(坐标类):
public class Coordinate {
private int row;
private int col;
public Coordinate(int row, int col) {
this.row = row;
this.col = col;
}
public int getRow() {
return row;
}
public int getCol() {
return col;
}
@Override
public String toString() {
return "Coordinate [row=" + row + ", col=" + col + "]";
}
}
MyMazeSolver 类:
import java.util.ArrayList;
public class MyMazeSolver implements MazeSolver {
private static ArrayList<Coordinate> coordinates = new ArrayList<Coordinate>();
private int row;
private int col;
@Override
public String[][] solve(String[][] map) {
startingPos(map);
//for (int i = 0; i < 15; i++) {
do{
makeMove(map);
if (nextToF(map, row, col)) {
System.out.println(row + "" + col);
map[row][col] = "X";
} else {
if (isExplorable(map, row, col)) {
map[row][col] = "D";
} else {
map[row][col] = "X";
}
if(deadEnd(map, row, col)){
}
}
addCoordinates(row, col);
//}
}while(!isEnded(map));
print(map);
// delete printCoordinates
printCoordinates();
return map;
}
public void startingPos(String[][] map) {
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[0].length; j++) {
if (map[i][j].contains("S")) {
row = i;
col = j;
}
}
}
}
public boolean clear(String[][] map, int row, int col) {
if (row <= 0 || col <= 0 ||row > map.length) {
return false;
}
if (col <= 0 || col > map[0].length) {
return false;
}
if ("S".equals(map[row][col])) {
return false;
}
if ("W".equals(map[row][col])) {
return false;
}
if ("X".equals(map[row][col])) {
return false;
}
if ("D".equals(map[row][col])) {
return false;
}
return true;
}
public void makeMove(String[][] map) {
if (clear(map, row + 1, col)) {
row++;
} else if (clear(map, row, col - 1)) {
col--;
} else if (clear(map, row, col + 1)) {
col++;
} else if (clear(map, row, col)) {
row--;
}
}
public boolean explorable(String[][] map, int row, int col) {
if (row > map.length) {
return false;
}
if (col > map[0].length) {
return false;
}
if (map[row][col].equals("S")) {
return false;
}
if (map[row][col].equals("W")) {
return false;
}
if (map[row][col].equals("X")) {
return false;
}
if (map[row][col].equals("D")) {
return false;
}
return true;
}
public boolean isExplorable(String[][] map, int row, int col) {
int squares = 0;
if (explorable(map, row + 1, col)) {
squares++;
}
if (explorable(map, row, col - 1)) {
squares++;
}
if (explorable(map, row, col + 1)) {
squares++;
}
if (explorable(map, row - 1, col)) {
squares++;
}
if (squares > 1) {
return true;
} else {
return false;
}
}
public void addCoordinates(int row, int col) {
coordinates.add(new Coordinate(row, col));
}
public void printCoordinates() {
for (int i = 0; i < coordinates.size(); i++) {
System.out.println(coordinates.get(i));
}
}
public boolean nextToF(String[][] map, int row, int col) {
if ("F".equals(map[row + 1][col])) {
// row++;
map[row + 1][col] = ("RIP");
return true;
} else if ("F".equals(map[row][col - 1])) {
// col--;
map[row][col - 1] = "RIP";
return true;
} else if ("F".equals(map[row][col + 1])) {
// col++;
map[row][col + 1] = "RIP";
return true;
} else if ("F".equals(map[row - 1][col])) {
// row--;
map[row - 1][col] = "RIP";
return true;
}
return false;
}
public boolean deadEnd(String[][] map, int row, int col) {
int deadEnds = 0;
if (row > map.length) {
deadEnds++;
}
if (col > map[0].length) {
deadEnds++;
}
if (map[row][col].equals("S")) {
deadEnds++;
}
if (map[row][col].equals("W")) {
deadEnds++;
}
if (map[row][col].equals("X")) {
deadEnds++;
}
if (map[row][col].equals("D")) {
deadEnds++;
}
if (deadEnds == 4) {
return true;
} else {
return false;
}
}
public void findD(){
}
public boolean isEnded(String[][] map) {
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map.length; j++) {
if (map[i][j].equals("RIP")) {
return true;
}
}
}
return false;
}
public void print(String[][] map) {
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[0].length; j++) {
System.out.print(map[i][j]);
}
System.out.println();
}
}
}
最佳答案
I call his class under the solveButton's ActionListener but I don't know how to update the String[][] map when you click on a JLabel. For example if I click a JLabel at (5,5) the map will update map[5][5] to "W" instead of an empty String.
这里的问题是,您所依赖的信息不会改变。
public void mouseClicked(MouseEvent e) {
if (clicked == false) {
clicked = true;
jlabel.setBackground(Color.LIGHT_GRAY);
map[rowCount - 1][colCount - 1] = "W";
} else {
clicked = false;
jlabel.setBackground(Color.BLACK);
//map[rowCount - 1][colCount -1 ] = "";
}
}
在您的代码中,您依赖于 rowCount
和 colCount
,它们不会(也可能不应该)改变,而只会影响最后一个元素。 JLabel
和 map 条目之间没有关系。
您需要做的是提供某种链接。在这种情况下,我通常会使用某种 Map
,键入 JLabel
并维护循环 map
所需的引用值。
例如...
String[][] map;
// 1
private Map<JLabel, Point> labelMap;
//...
private void createAndShowGui() {
//...
map = new String[rowCount][colCount];
// 2
labelMap = new HashMap<>(rowCount * colCount);
//...
// 3
labelMap.put(jlabel, new Point(rows - 1, columns - 1));
jlabel.addMouseListener(new MouseListener() {
Map 类型的新实例变量
HashMap
创建 labelMap
的新实例行
/列
与给定标签关联然后在你的MouseListener
中,你需要获取被点击的JLabel
,获取关联的行
/列
code> 为 map
数组并进行更新...
jlabel.addMouseListener(new MouseListener() {
boolean clicked = false;
@Override
public void mouseClicked(MouseEvent e) {
// Get the source of the event
JLabel label = (JLabel)e.getComponent();
// Get the map indices associated with the given label
Point point = labelMap.get(label);
// Flip the clicked state
clicked = !clicked;
// Update the state accordingly...
if (clicked) {
jlabel.setBackground(Color.LIGHT_GRAY);
map[point.x][point.y] = "W";
} else {
jlabel.setBackground(Color.BLACK);
map[point.x][point.y] = "";
}
}
Also, when you click on the Solve JButton, it is supposed to highlight the path it takes, but it only highlights where it ends. If there is a Solution, "F" will turn into "RIP", and if there is no solution to the maze, it should have a JLabel saying the maze is unsolvable.
有一系列问题导致这不起作用,您应该已经看到异常发生时抛出的情况。
我遇到的第一个问题是一个 NullPointerException
,它是由您的 clear
方法在这一行 if (map[row][col].equals (“S”))){
这立即告诉我 map[row][col]
的值为 null
。不知道它是否应该,并不关心,因为它很容易修复使用...
if ("S".equals(map[row][col]))) {
您需要对此方法中的其他 if
语句执行此操作。
我遇到的第二个问题是 ArrayIndexOutOfBoundsException
,它是由您的 makeMove
方法引起的
} else if (clear(map, row, col - 1)) {
//...
} else if (clear(map, row - 1, col)) {
这里的主要问题是,当col
或row
为0
时会发生什么?您最终不会为此进行边界检查......
您可以使用以下方法在 clear
方法中修复此问题
public boolean clear(String[][] map, int row, int col) {
if (row < 0 || row > map.length) {
return false;
}
if (col < 0 || col > map[0].length) {
return false;
}
例如...
您的nextToF
方法导致了类似的问题
关于java - 图形用户界面 : Highlight the Path It Takes for A Maze?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22366080/
我正在阅读 Youtube 上的 Kubernetes 教程,发现以下 UI 演示了 Kubernetes 集群的 pod 和服务安排。如何在我的 Kubernetes 设置中安装此 UI? 最佳答案
这只是一个快速的(我希望)。 我最近访问了 jquery ui 对话框页面,查看在对话框中使用表单 http://jqueryui.com/dialog/#modal-form我注意到一些我以前没有见
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我想用 Java 为一个程序创建一个用户界面,让用户能够构建一棵节点树,每个节点执行一项特定的任务。该程序的界面与 Softimage Ice 非常相似,您可以通过单击 http://vimeo.co
下面是我在 SwiftUI 中创建 View 的代码。我要定位我的 欢迎按钮 到屏幕底部,如下所示。 struct welcomeViewControllerView: View { va
我目前有一个文本编辑器,我希望能够像这样在笔记应用程序中添加文本格式: 我试过 UITextView.allowsEditingTextAttributes = true但它似乎没有用。 任何想法将不
我不知道如何使用HDFS连接我的网站(我什至不确定是否有可能)。 我的网站基于PHP。我想存储有人点击我的网站的区域,如何将我的PHP与HDFS连接起来? 是否涉及任何插件?如果我希望这些信息被实时存
我正在寻找用 javascript 编程的新方法。我的目标是创建像 GMail 这样的 javascript 应用程序。我试过 GWT,但它接缝太复杂,而且代码也不时尚。 我发现 MVC 模式是一种很
我有多个渐变作为我的应用程序的主题。当渐变(存储在变量中)是特定的时,我想要一个 bool 值变为真。但是,我不断收到错误消息: "Binary operator '==' cannot be app
我有一个有很多类别的测验应用程序: 类别 1 列出第 1 项 列出第 2 项 类别 3 第 4 类 第 5 类 列出第 1 项 列出第 2 项 列出第 3 项 所以类别要么是指一般的不可选择的类别,即
如果我单击仅搜索“2018”的搜索按钮,但如果我在搜索“2018 歌曲”的电脑上按回车按钮,我想搜索“2018”,如果我在电脑上按回车按钮,我怎么能使用 Autocomplete | jQuery U
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我正在尝试为患有轻度认知障碍的祖母创建一个安卓平板电脑应用程序。该应用程序的功能之一是智能调度程序/提醒。例如:该应用程序会说“您服用红色药丸了吗?”是或否。如果没有或没有回复,则会向我的手机发送一条
有没有办法确保我的 Android UI 在不同手机上按预期显示? 最佳答案 遍历 developers guide on supporting multiple screens .它为您提供有关该主
我正在为 iPad 和 iPhone 创建一个通用应用程序。我有一个 UITextField,我希望用户在其中输入歌曲的名称或在他们的 iTunes 库中找到的任何声音媒体文件。我的问题不是关于查询图
这个问题在这里已经有了答案: Making a Chess Game with jQuery UI. I have used Draggable, but i need to make them n
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
我想从选择器中获取所选项目以更新 Firebase 数据库中的一些数据,但是当我使用 onTapGesture 时不起作用 注意:选择器中的项目是字符串 我的代码: Picke
我需要我的应用程序在启动时配置后端,这是执行此操作的函数: // Initializes Amplify final func configureAmplify() async { do {
我有这个 Web 应用程序,其中一个模块使用了过多的 ui:include。 前任。 页面 1.0 包括 --> page1.1 包括页面 2.0 包括 --> 页面 2.1 页面 1.0 包括 --
我是一名优秀的程序员,十分优秀!