Какую структуру данных использовать в моем примере - PullRequest
6 голосов
/ 29 июня 2010

Я хотел бы создать компонент, который состоит из доски и окружающего ее угла. Размер доски (и, следовательно, также границы) определяется во время выполнения. Некоторые примеры (доска светлая, а рамка темная): альтернативный текст http://img340.imageshack.us/img340/3862/examplegw.png

Доска состоит из объектов типа BoardCell, а граница состоит из объектов типа BorderCell. Структура данных для платы - BoardCell [,] - простой двумерный массив.

Как я могу представить границу? Я начал с чего-то вроде этого:

public BorderCell TopLeft       // top left corner cell
public BorderCell TopRight      // top right corner cell
public BorderCell BottomRight   // bottom right corner cell
public BorderCell BottomLeft    // bottom left corner cell
public BorderCell[] Top         // top border (without corners)
public BorderCell[] Bottom      // bottom border (without corners)
public BorderCell[] Left        // left border (without corners)
public BorderCell[] Right       // right border (without corners)

Мне не нравится это изображение границы, можете ли вы предложить что-то лучше?

Дополнительно: я хотел бы иметь метод SetSomethingForTheCell для объекта границы:

public void SetSomethingForTheCell(...)

но с моей текущей структурой данных я не знаю, что передать в качестве параметра.

Ответы [ 6 ]

3 голосов
/ 29 июня 2010

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

Простой метод проверки, находится ли ячейка вграница:

// assuming that the array is in row-major order...
public static bool IsInBorder(this BoardCell[,] board, int x, int y) {
    return x == board.GetLowerBound(1) || x == board.GetUpperBound(1) ||
           y == board.GetLowerBound(0) || y == board.GetUpperBound(0);
}
2 голосов
/ 29 июня 2010

Я некоторое время не использовал C #, поэтому не могу дать вам конкретного ответа на C #. Однако я бы BorderCell был подклассом BoardCell (или иметь общий подкласс). Как вы заявили, ваша структура данных платы будет тогда двумерным массивом типа BoardCell. При создании экземпляра платы создайте экземпляры внутренних ячеек для обычных BoardCells и границы для BorderCells.

Если вы считаете, что вам может потребоваться циклическое перебор границ и т. Д., Определите итератор в классе Board для каждого типа цикла (например, для углов, верхней границы, нижней границы и т. Д.) С помощью оператора yield.

Что касается вашего public void SetSomethingForTheCell(...), то вместо этого я бы предоставил аксессор / свойства для элементов ячейки. Например:

BoardCell cell = board.getCell(i,j);
cell.setSomething(data)
2 голосов
/ 29 июня 2010

Связаны ли BoardCell и BorderCell (или вы можете сделать их производными от общего базового класса)?

В этом случае вы можете использовать один массив BaseCell [,] и разрешить различие между Board иГраница должна быть определена типом класса и / или положением.


В противном случае массив с одиночным затемнением для границы: `new BorderCell [2 * row + 2 * cols + 4];

2 голосов
/ 29 июня 2010

Я думаю, что вы можете использовать обычный 2-мерный массив для представления всей доски (внутренняя доска с границей), и вы можете знать тип каждой ячейки, если она находится на внутренней доске или на границе, используя ее положение (т.е.граничные ячейки имеют значение x 0 или ширину -1 и значение y 0 или высоту -1)

2 голосов
/ 29 июня 2010

Я хотел бы определить общий интерфейс или базовый класс для BoardCell и BorderCell (то есть Cell?) И сохранить их в (большем) двумерном массиве. Таким образом, вы можете легко обратиться к каждой ячейке, и будет довольно легко определить, является ли адрес границей или бортом.

1 голос
/ 29 июня 2010

Вы можете создать, как сказано выше, базовый класс, называемый Cell (или около того), и наследовать от него. Например:

BoardCell is a cell with 3 values: x, y, bool isBorder
Board is a cell with 3 values: x, y, array Cells
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...