Java 如何确定堆栈中的邻居
基本上,我用随机生成的方式制作一个迷宫,遵循以下逻辑: 他们说我应该试着在一堆东西中确定我的邻居,但我被困在如何确定的问题上。我决定试试他们的逻辑,但改用2D数组。然而,这给整个重编程带来了其他问题:如何重新访问单元或以其他方式在二维数组中删除它 我的代码到目前为止。我这里也有一个问题:我试图让一个字段在面板上自行绘制,但它不起作用:我只得到一个黑色背景颜色,没有线条/正方形 所以,我的问题是:如何最好地确定邻居并用我所拥有的创建随机迷宫 及 为什么我的基本方格场没有画出来Java 如何确定堆栈中的邻居,java,stack,multidimensional-array,Java,Stack,Multidimensional Array,基本上,我用随机生成的方式制作一个迷宫,遵循以下逻辑: 他们说我应该试着在一堆东西中确定我的邻居,但我被困在如何确定的问题上。我决定试试他们的逻辑,但改用2D数组。然而,这给整个重编程带来了其他问题:如何重新访问单元或以其他方式在二维数组中删除它 我的代码到目前为止。我这里也有一个问题:我试图让一个字段在面板上自行绘制,但它不起作用:我只得到一个黑色背景颜色,没有线条/正方形 所以,我的问题是:如何最好地确定邻居并用我所拥有的创建随机迷宫 及 为什么我的基本方格场没有画出来 import jav
import java.awt.Graphics;
/* @author chris */
public class Field {
private int fieldData,
fieldSize;
public Field( int fieldData , int fieldSize ) {
this.fieldData = fieldData;
this.fieldSize = fieldSize;
}
/**
*
*/
public Field() {
}
public void paint(int rows , int cols , Graphics g) {
int x = 0;
int y = 0;
int x2 = fieldSize;
int y2 = fieldSize;
for( int i = 0 ; i < rows ; i++ ) {
for( int j = 0 ; j < cols ; j++ ) {
g.drawLine( x , y , x , y2 ); // n
g.drawLine( x , y2 , x2 , y2 ); // e
g.drawLine( x2 , y , x2 , y2 ); // s
g.drawLine( x , y , x2 , y ); // w
if( j != cols-1 ) {
x = x+fieldSize;
x2 = x2+fieldSize;
}else {
y = y+fieldSize;
y2 = y2+fieldSize;
x = 0;
x2 = fieldSize;
}
}
}
}
}
导入java.awt.Graphics;
/*@作者克里斯*/
公共类字段{
私有int fieldData,
字段大小;
公共字段(int fieldData,int fieldSize){
this.fieldData=fieldData;
this.fieldSize=字段大小;
}
/**
*
*/
公共领域(){
}
公共空白绘制(整数行、整数列、图形g){
int x=0;
int y=0;
int x2=字段大小;
int y2=字段大小;
对于(int i=0;i
这是我小组的代码。makeItAMaze方法是我一直坚持的方向
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.JPanel;
/* @author chris */
public class LevelPanel extends JPanel {
private final int rows = 20;
private final int cols = 40;
private final int fieldSize = 20;
private Field[][] map = new Field[cols][rows];
LevelPanel() {
setBackground( Color.BLACK );
}
public void generateMap() {
for ( int j = 0 ; j < rows ; j++ ) { // 2d array
for ( int i = 0 ; i < cols ; i++ ) {
// Determine position, give appropriate border
if( j > 0 && i > 0 && j < cols && i < rows ) {
// North, east, south, west for backtrack, solution, border, wall
Field f = new Field(0000000000001111, fieldSize ); // center
f = map[i][j];
}else if( i == 0 && j == 0 ) {
Field f = new Field(0000000010011111, fieldSize); // nw
f = map[i][j];
}else if( j > 1 && i == 0 && j < cols ) {
Field f = new Field(0000000010001111, fieldSize ); // n
f = map[i][j];
}else if( i == 0 && j == cols ) {
Field f = new Field(0000000011001111, fieldSize ); // ne
f = map[i][j];
}else if( i > 0 && j == cols && i < rows ) {
Field f = new Field(0000000001001111, fieldSize ); // e
f = map[i][j];
}else if( j == cols && i == rows ) {
Field f = new Field(0000000001101111, fieldSize ); // se
f = map[i][j];
}else if( j > 0 && j < cols && i == rows ) {
Field f = new Field(0000000000101111, fieldSize ); // s
f = map[i][j];
}else if( j == 0 && i == rows ) {
Field f = new Field(0000000000111111, fieldSize ); // sw
f = map[i][j];
}else if( j == 0 && i > 0 && i < rows ) {
Field f = new Field(0000000000011111, fieldSize ); // w
f = map[i][j];
}
}
}
makeItAMaze();
} // ends generateMap()
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int x = 0;
int y = 0;
int x2 = fieldSize;
int y2 = fieldSize;
for( int i = 0 ; i < rows ; i++ ) {
for( int j = 0 ; j < cols ; j++ ) {
// TODO: need to draw from a Field
Field f = new Field();
f.paint( rows , cols , g );
}
}
} // ends paintComponent
public void makeItAMaze() {
Random r = new Random();
int totalFields = rows * cols;
int fieldsTogo = 0;
while ( fieldsTogo < totalFields ) {
}
导入java.awt.Color;
导入java.awt.Graphics;
导入java.util.Random;
导入javax.swing.JPanel;
/*@作者克里斯*/
公共类LevelPanel扩展了JPanel{
私有最终整数行=20;
私人最终整数=40;
专用最终整型字段大小=20;
私有字段[][]映射=新字段[cols][rows];
LevelPanel(){
挫折地面(颜色:黑色);
}
公共无效生成器映射(){
对于(int j=0;j0&&i>0&&j1&&i==0&&j0&&j==cols&&i0&&j0&&i<行){
字段f=新字段(0000000000011111,字段大小);//w
f=映射[i][j];
}
}
}
makeItAMaze();
}//结束generateMap()
@凌驾
受保护组件(图形g){
超级组件(g);
int x=0;
int y=0;
int x2=字段大小;
int y2=字段大小;
对于(int i=0;i
您设置了背景色,但我看不出您在绘制线条时在何处设置了前景色。它可能是用黑色绘制的。已经有一段时间了,没有人给出正确的答案,所以我将发布我找到的解决方案
我的第一个问题的解决方案是,为了保存邻居,不应该使用堆栈,而应该使用HashMap。您通常想知道如何从当前位置(移动方向)查找邻居,该位置可以用作HashMap中的键
至于第二个绘制问题。在代码中,我再次开始创建一个新的字段实例,而在前面的方法中我已经创建了十几个。更好的做法是在一个循环中创建一组具有默认值的字段,然后在另一个方法/循环中更改创建的字段
发生实际绘制错误是因为paintComponent是我创建此类时初始化的第一个方法。这导致我基本上试图绘制一个根本不存在或没有任何数据的字段。解决方案是将字段的初始化移到构造函数中,而不是移到方法中。Java a如果背景为黑色,则自动以白色前景色绘制。