2010-06-29 18 views
6

Vorrei creare un componente composto da una scheda e l'angolo circostante. La dimensione della scheda (e quindi anche del bordo) è definita in fase di esecuzione. Alcuni esempi (la scheda è chiara e il bordo è scuro): alt text http://img340.imageshack.us/img340/3862/examplegw.pngQuale struttura dati utilizzare nel mio esempio

La scheda è composta da oggetti del tipo BoardCell e il bordo è costituito da oggetti del tipo BorderCell. La struttura dati per la scheda è BoardCell [,] - una semplice matrice bidimensionale.

Come posso rappresentare il bordo? Ho iniziato con qualcosa di simile:

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) 

Non mi piace questa rappresentazione del confine, si può suggerire qualcosa di meglio?

aggiuntive: mi piacerebbe avere un metodo SetSomethingForTheCell sul bordo dell'oggetto:

public void SetSomethingForTheCell(...) 

ma con la mia struttura dei dati attuali non so cosa passa come parametro.

+2

Dipende da cosa si vuole fare con le cellule. – SLaks

+0

Hai mai dovuto scorrere tutte le celle indipendentemente se sono celle di bordo o di bordo? Come (vuoi) affrontarli? –

+0

SLaks: BoardCell contiene solo dati e nessun comportamento. BorderCell contiene principalmente comportamenti e alcuni dati, che è completamente diverso da BoardCell. – sventevit

risposta

3

Dal momento che è davvero banale per rilevare se una cella è parte del confine o no, basta conservare le cellule una volta prova di adesione bordo quando richiesto.

Un metodo semplice per verificare se una cella è nel bordo:

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

Sarei tentato di definire un'interfaccia comune o una classe di base per BoardCell e BorderCell (ovvero Cell?) E tenerli in una matrice bidimensionale (più grande). In questo modo puoi facilmente indirizzare ogni cella, e sarà piuttosto facile determinare se l'indirizzo è un bordo o una scacchiera.

2

Penso che sia possibile utilizzare un normale array bidimensionale per rappresentare l'intera scheda (scheda interna con il bordo) e si può conoscere il tipo di ciascuna cella se presente nella scheda interna o nel bordo usando la sua posizione (es. le celle di confine hanno x valore 0 o larghezza -1 e y valore 0 o altezza -1)

2

Sono correlati BoardCell e BorderCell (oppure è possibile farli derivare da una classe base comune)?

In questo caso è possibile utilizzare un singolo array BaseCell [,] e lasciare che la distinzione tra Board e Border sia definita per tipo di classe e/o posizione.


Altrimenti, una matrice singola-dim per il bordo: `nuovo BorderCell [2 * righe + 2 * cols + 4];

+0

BoardCell e BorderCell non hanno nulla in comune, tranne che entrambi sono chiamati una cella :) Ma sì, potrei essere eccessivamente complicato e usare solo un array ... – sventevit

2

Non ho usato C# in un dato momento, quindi non posso darti una risposta specifica C#. Tuttavia vorrei che BorderCell fosse una sottoclasse di BoardCell (o di avere una sottoclasse comune). Come hai affermato, la struttura dei dati della scheda sarebbe una matrice 2D di tipo BoardCell. Quando istanziate la scacchiera, istanziate le celle interne alle normali BoardCell e il limite a BorderCells.

Se si pensa che potrebbe essere necessario eseguire il looping oltre i confini ecc., Definire un iteratore nella classe Board per ogni tipo di loop (ad esempio per angoli, bordo superiore, bordo inferiore, ecc.) Utilizzando l'operatore yield.

Per quanto riguarda lo public void SetSomethingForTheCell(...), invece, fornirei un accessor/proprietà per gli elementi della cella. Per esempio:

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

È possibile creare, come detto sopra, una classe base denominata cellulare (o giù di lì), e di ereditare da questo. Per esempio:

BoardCell is a cell with 3 values: x, y, bool isBorder 
Board is a cell with 3 values: x, y, array Cells 
Problemi correlati