2010-06-29 29 views
6

我想創建一個組件,它由一個電路板及其周圍的角組成。在運行時定義板的尺寸(因此也是邊界)。一些示例(電路板明亮,邊框暗): alt text http://img340.imageshack.us/img340/3862/examplegw.png在我的示例中使用什麼數據結構

電路板由BoardCell類型的對象組成,邊框由BorderCell類型的對象組成。 Board的數據結構是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(...) 

,但我目前的數據結構,我不知道該怎麼作爲參數傳遞。

+2

這取決於你想用電池做什麼。 – SLaks 2010-06-29 11:52:48

+0

你是否曾經必須遍歷所有的細胞獨立,如果他們是邊界或板細胞?你(如何)解決他們? – 2010-06-29 11:53:35

+0

SLaks:BoardCell僅包含數據且不包含任何行爲。 BorderCell主要包含行爲和一些數據,與BoardCell完全不同。 – sventevit 2010-06-29 11:57:06

回答

3

因爲它是真是小巫見大巫檢測小區是否爲邊界與否的一部分,在必要時只儲存細胞一次並測試邊境會員。

一個簡單的方法來測試一個小區是否在邊境:

// 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

我會被誘惑定義公共接口或基類BoardCell和BorderCell(即細胞)並將其保存在(較大的)二維陣列。通過這種方式,您可以輕鬆地處理每個單元格,並且確定該地址是否爲邊框或單元板將很容易。

2

我想你可以使用一個正常的2維陣列來表示整個板(與邊框內側板)和就可以知道每個單元的類型,如果它在所述內板或在邊界使用其位置(即邊界細胞具有x值0或寬度-1和y的值0或高度-1)

2

是否BoardCell和BorderCell相關(或者你可以讓他們從一個公共基類派生的)?

如果是可以使用一個單一的BaseCell [,]數組而讓板和邊界之間的區別通過類類型和/或位置來定義的情況。


否則,用於邊界的單暗數組:'new BorderCell [2 * rows + 2 * cols + 4];

+0

BoardCell和BorderCell沒有什麼共同之處,除了它們都被稱爲單元格:)但是,我可能會過於複雜,只是使用一個數組...... – sventevit 2010-06-29 11:54:34

2

我有一段時間沒有用過C#,所以我不能給你一個C#特定的答案。不過,我會讓BorderCell成爲BoardCell的子類(或者擁有一個公共子類)。如您所述,您的主板數據結構將成爲BoardCell類型的二維陣列。實例化電路板時,將內部單元實例化爲正常的BoardCells以及BorderCells的邊界。

如果你認爲你可能需要循環邊界等等,定義董事會類的迭代器每種迴路的(例如,爲角,頂部邊框,底部邊框等)使用yield操作。

至於你public void SetSomethingForTheCell(...)相反,我會提供一個訪問/性能的電池元件。例如:

BoardCell cell = board.getCell(i,j); 
cell.setSomething(data) 
1

如上所述,您可以創建一個名爲Cell(或如此)的基類,並從中繼承。 例如:

BoardCell is a cell with 3 values: x, y, bool isBorder 
Board is a cell with 3 values: x, y, array Cells 
相關問題