基本上,我正在制作一个随机生成的迷宫,遵循这里的逻辑:http://www.mazeworks.com/mazegen/mazetut/
他们说我应该尝试在堆叠中确定我的邻居,但我仍然坚持如何。我决定尝试他们的逻辑,但改用2D数组。然而,这会带来整个重新环绕的其他问题:如何重新访问单元格或以其他方式将其移除到二维数组中?
我的代码到目前为止。我在这里也有一个问题:我正试图让Field在面板上绘画,但它不起作用:我只得到一个黑色的bg颜色,没有线条/正方形。
所以,我的问题是:如何最好地确定邻居并用我拥有的东西创建随机迷宫
AND
为什么我的基本方块区域没有被绘制?
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;
}
}
}
}
}
这是我的小组代码。 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 ) {
}
答案 0 :(得分:0)
您设置背景颜色,但在绘制线条时我看不到您设置前景色的位置。它可能是用黑色绘制的。
答案 1 :(得分:0)
已经有一段时间了,没有人给出正确答案,所以我会发布我找到的解决方案。
我的第一个问题的解决方案是,为了保存邻居,你不应该使用堆栈,而是使用HashMap。您通常想知道如何从当前位置(移入方向)找到邻居,您可以将其用作HashMap中的键。
关于第二个绘画问题。在代码中,我再次开始创建一个新的Field实例,而我已经在早期的方法中做了十几个。更好的做法是在循环中使用默认值创建一堆字段,然后在另一个方法/循环中更改创建的字段。
实际绘制错误的发生是因为paintComponent是我创建此类时初始化的第一个方法。这导致我基本上试图绘制一个尚不存在或者还没有任何数据的字段。解决方案是将字段的初始化移动到构造函数,而不是方法。