如何确定堆栈中的邻居

时间:2014-01-01 22:42:58

标签: java stack multidimensional-array

基本上,我正在制作一个随机生成的迷宫,遵循这里的逻辑: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 ) {



    }

2 个答案:

答案 0 :(得分:0)

您设置背景颜色,但在绘制线条时我看不到您设置前景色的位置。它可能是用黑色绘制的。

答案 1 :(得分:0)

已经有一段时间了,没有人给出正确答案,所以我会发布我找到的解决方案。

我的第一个问题的解决方案是,为了保存邻居,你不应该使用堆栈,而是使用HashMap。您通常想知道如何从当前位置(移入方向)找到邻居,您可以将其用作HashMap中的键。

关于第二个绘画问题。在代码中,我再次开始创建一个新的Field实例,而我已经在早期的方法中做了十几个。更好的做法是在循环中使用默认值创建一堆字段,然后在另一个方法/循环中更改创建的字段。

实际绘制错误的发生是因为paintComponent是我创建此类时初始化的第一个方法。这导致我基本上试图绘制一个尚不存在或者还没有任何数据的字段。解决方案是将字段的初始化移动到构造函数,而不是方法。