2009-10-15 1 views
0

Я работаю над написанием генератора лабиринта. У меня есть «Cell» класс, который выглядит следующим образом:Как я могу очистить этот метод, который я написал на Java?

public class Cell { 
    public boolean northWall; 
    public boolean southWall; 
    public boolean eastWall; 
    public boolean westWall; 

    public Cell north; 
    public Cell south; 
    public Cell east; 
    public Cell west; 

    public boolean visited; 

    public Cell() { 
     northWall = true; 
     southWall = true; 
     eastWall = true; 
     westWall = true; 
     visited = false; 
    } 

    public boolean hasUnvisitedNeighbors() { 
     return ((north != null && !north.Visited) 
       || (south != null && !south.Visited) 
       || (east != null && !east.Visited) || (west != null && !west.Visited)); 
    } 

    public Cell removeRandomWall() { 
     List<Cell> unvisitedNeighbors = new ArrayList<Cell>(); 
     if (north != null && !north.Visited) 
      unvisitedNeighbors.add(north); 
     if (south != null && !south.Visited) 
      unvisitedNeighbors.add(south); 
     if (west != null && !west.Visited) 
      unvisitedNeighbors.add(west); 
     if (east != null && !east.Visited) 
      unvisitedNeighbors.add(east); 



     if (unvisitedNeighbors.size() == 0) { 
      return null; 
     } else { 
      Random randGen = new Random(); 
      Cell neighbor = unvisitedNeighbors.get(randGen 
        .nextInt((unvisitedNeighbors.size()))); 

      if (neighbor == north) { 
       northWall = false; 
       north.southWall = false; 
       return north; 
      } else if (neighbor == south) { 
       southWall = false; 
       south.northWall = false; 
       return south; 
      } else if (neighbor == west) { 
       westWall = false; 
       west.eastWall = false; 
       return west; 
      } else if (neighbor == east) { 
       eastWall = false; 
       east.westWall = false; 
       return east; 
      } 

      return null; 
     } 

    } 
} 

Лабиринт в моей программе является просто 2d одномерный массив ячеек. После создания массива я вручную вхожу и устанавливаю все ссылки на соседние ячейки (север, юг, восток, запад).

Что я пытаюсь убрать, это удалитьRandomWall(). Предполагается случайным образом выбирать соседнюю ячейку, для которой установлен флаг посещения, равный false, и удалять стену как в этой ячейке, так и в соседней соте, которая их связывает.

Таким образом, ему необходимо рассмотреть все соседние ячейки, которые не были посещены, случайным образом выбрать один, а затем установить в этой ячейке стену, а смежную - на ложную, так что теперь между ними есть путь. Я попытался сделать это выше, но это кажется очень неуклюжим.

Может ли кто-нибудь помочь мне?

+1

Нет ответа на ваш вопрос, но полезный совет (IMO): используйте условные обозначения Java-кода! Таким образом, другим пользователям, знакомым с Java, будет легче помочь вам. Имена классов начинаются с заглавной буквы, имена переменных - в нижнем регистре. Дополнительная информация: http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html –

+0

@Bart, я вижу. По какой-то причине я думал, что публичные участники начали с шапки. Я буду придерживаться конвенций. – Scorcher84

+0

Теперь я попытался переключить его на java-соглашения. – Scorcher84

ответ

4

Вместо 4 отдельных членов:

public Cell North; 
public Cell South; 
public Cell East; 
public Cell West; 

просто 1 массив из них:

public Cell [] cells = new Cell[4]; 

И 4 константы:

public final int NORTH = 0; 
public final int EAST = 1; 
public final int SOUTH = 2; 
public final int WEST = 3; 

он делает такие вещи, как удалить случайные стены намного проще.

3

Сделайте перечисление для направления, затем войдите в стены и соседи, указав направление.

Вы должны сделать свои переменные-члены частными и записать их в нижнем регистре.

+0

Быстро сделайте снимок экрана, пока вы находитесь в 9999! –

1

Первая попытка, я хотел бы сделать член переменной частной окончательным, если вы можете:

public class Cell { 
    public boolean NorthWall; 
    public boolean SouthWall; 
    public boolean EastWall; 
    public boolean WestWall; 

    public Cell North; 
    public Cell South; 
    public Cell East; 
    public Cell West; 

    public boolean Visited; 

    public Cell() { 
     NorthWall = true; 
     SouthWall = true; 
     EastWall = true; 
     WestWall = true; 
     Visited = false; 
    } 

    public boolean hasUnvisitedNeighbors() { 
     return unvisited(North) || unvisited(South) || unvisited(East) || unvisited(West); 
    } 

    private List<Cell> getUnvisitedNeighbors() { 
     List<Cell> result = new ArrayList<Cell>(); 
     if (unvisited(North)) 
      result.add(North); 
     if (unvisited(South)) 
      result.add(South); 
     if (unvisited(West)) 
      result.add(West); 
     if (unvisited(East)) 
      result.add(East); 
     return result; 
    } 

    private boolean unvisited(Cell cell) { 
     return cell != null && !cell.Visited; 
    } 

    private Cell getRandomUnvisitedNeighbor() { 
     Random randGen = new Random(); 
     List<Cell> unvisitedNeighbors = getUnvisitedNeighbors(); 
     return unvisitedNeighbors.get(randGen.nextInt((unvisitedNeighbors.size()))); 
    } 

    public Cell removeRandomWall() { 
     if (!hasUnvisitedNeighbors()) { 
      return null; 
     } 
     Cell neighbor = getRandomUnvisitedNeighbor(); 
     if (neighbor == North) { 
      NorthWall = false; 
      North.SouthWall = false; 
     } else if (neighbor == South) { 
      SouthWall = false; 
      South.NorthWall = false; 
     } else if (neighbor == West) { 
      WestWall = false; 
      West.EastWall = false; 
     } else if (neighbor == East) { 
      EastWall = false; 
      East.WestWall = false; 
     } 

     return neighbor; 

    } 
} 
0

Попробуйте удалить проверку на нуль, с помощью «нуль-Cell» объект ...

public static final Cell NULL_CELL = new Cell(); 

, так что если у вас есть значение null, чтобы указать, что такой ячейки не существует, теперь вы можете использовать NULL_CELL.

Теперь вы можете заменить

if (north != null && !north.Visited) 
       unvisitedNeighbors.add(north); 

с

if (!north.isVisited()) { 
    unvisitedNeighbors.add(north); 
} 

Обычно в Java, переменные-члены являются частными, и вы используете "добытчиками" для доступа к ним ...

private boolean northWall; 
private boolean southWall; 
private boolean eastWall; 
private boolean westWall; 

private Cell north; 
private Cell south; 
private Cell east; 
private Cell west; 

private boolean visited; 

public boolean hasNorthWall() { 
    return northWall; 
} 

public Cell getNorthCell() { 
    return north; 
} 

// etc. 
Смежные вопросы