2015-03-09 4 views
0

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

У меня есть 3 класса, но я думаю, что я действительно не понимаю, как они должны взаимодействовать, или как я должен заставить их взаимодействовать для достижения наилучшей производительности и т. Д. Одна вещь, в частности, я просто знаю, это ужасная практика. Поскольку мои классы Path и Point должны работать в сетке точек, созданных в классе Maze, я передаю конструкторы Path и Point, что Array of Points. Он «работает» ... но я просто понял, что при этом я получаю бесконечный цикл, в котором я создаю сетку, и создаю все точки для этой сетки, а в тех точках передаю массив очков, и каждый из тех точек получает переданный массив очков, навсегда.

Я думал о том, что Path и Point расширяют Maze, но я не думаю, что это правильные отношения. Я googled интерфейсы и абстрактные классы, чтобы увидеть, может быть, это то, что я хотел, но это тоже казалось неправильным.

Maze конструктор:

public class Maze 
{ 
private int fileNum = 0; 

private Random rand = new Random(); 
private Point[] grid; 
private int width, height; 
private int pathLength; 
private int curLoc; 

private boolean debug, toTxt, toPng, hasValidNewHead = true; 

public int frameNum = 0; 
public int lastPercent = 0; 

public Maze(int iWidth, int iHeight, int iPathLength, boolean d, boolean txt, boolean png) 
{ 
    width = iWidth; 
    height = iHeight; 
    pathLength = iPathLength; 
    grid = new Point[width * height]; 
    debug = d; 
    toTxt = txt; 
    toPng = png; 
} 

Путь конструктор:

public class Path 
{ 
private Random rand = new Random(); 
private Maze maze; 
private int length, maxLength, lastDir, height, width; 
private int curLoc; 
private boolean generating; 
private Point[] grid; 
private boolean debug, toTxt, toPng; 

public Path(int head, int gridWidth, int gridHeight, int ml, Point[] iGrid, Maze m, boolean d, boolean txt, boolean png) 
{ 
    maze = m; 
    generating = true; 
    lastDir = -1; 
    length = 1; 
    grid = iGrid; 
    curLoc = head; 
    height = gridHeight; 
    width = gridWidth; 
    maxLength = ml; 
    debug = d; 
    toTxt = txt; 
    toPng = png; 
} 

Точка конструктор:

public class Point 
{ 
private int x, y, width, height; 
private Point[] grid; 
private int type, curLoc; 

public Point(int iX, int iY, int w, int h, Point[] iGrid) 
{ 
    x = iX; 
    y = iY; 
    width = w; 
    height = h; 
    grid = iGrid; 
    curLoc = Arrays.asList(grid).indexOf(this); 
    type = 0; 
} 
+3

Вместо описания вашего кода отправьте его. –

+0

Вы можете получить более быстрые ответы, если опубликовать некоторые фрагменты кода, показывающие, что у вас есть сейчас, и то, что вы видите как проблемы с ним. Теперь, как ваш вопрос, люди должны больше думать, чтобы понять, к чему вы клоните. –

+0

Извините, сейчас редактировалось @JBNizet – nwash57

ответ

0

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

Thad said, Paths - это последовательности/списки ходов (север, юг, восток-запад), лабиринт - это массив (или карта) от координаты к ячейке/комнате, а ячейки имеют булевы стены, поэтому { East: true, North: false, South, false, West: true}.

Или вы можете просто сделать его неориентированным графом.

0

Все, что мне нужно было сделать, это сделать классы классов Path и Point внутри класса Maze. Таким образом, у них есть все данные экземпляра из Maze, которые им нужны, без необходимости передавать их через свои конструкторы.