La tua preoccupazione non è solo il modo di rappresentare la lavagna ma anche il modo di rappresentare i pezzi perché la lavagna ei pezzi devono comunicare la loro reciproca presenza ed effetti.
Pertanto, il modo in cui rappresenti la tua tavola sarà determinato dal modo in cui rappresenti i tuoi pezzi e dalle regole del gioco che vincolano il tabellone ei pezzi.
La tua prima preoccupazione è come rappresentare i pezzi.
Un pezzo di gioco o un automa di gioco è un modello perfetto per la programmazione orientata agli oggetti.
Permettetemi di illustrare con erogazione via con le dichiarazioni, come pubblico, statica, ecc
abstract class BasicUnit
{
// determine constraints of movement here.
// update position and return new position
abstract Position move(Direction d);
abstract Position getPosition();
Arsenal arsenal;
}
class Worker
extends BasicUnit
{
Position move(Direct d)
{
//whateveer, etc
}
}
class farmer
extends Worker
{
Position move(Direct d)
{
//whateveer, etc
}
}
class Warrior
extends BasicUnit
{
Position move(Direct d)
{
//whateveer, etc
}
}
class Sniper
extends Warrior
{
Position move(Direct d)
{
//whateveer, etc
}
}
Ora si deve decidere se le posizioni dei pezzi sulla scacchiera è
- bordo centric : le posizioni dei pezzi sono registrate solo sulla scheda
- pezzo centrico: le posizioni sono registrate su pezzi solo
- ridondante: è necessario ridondare aggiornare sia il pezzo che il cartone quando un pezzo viene spostato.
Per la maggior parte dei giochi da tavolo, la parte centrata sul pezzo non sarebbe una buona idea perché, dovresti cercare ogni pezzo per determinare se una posizione è occupata.
Se sulla scheda, è necessario cercare in ogni posizione della scheda per trovare la posizione di un pezzo.
Per ridondante, è necessario assicurarsi che le posizioni registrate da entrambe le schede e i pezzi non siano disallineati. Se si prevede di consentire la riproduzione del gioco su Internet, in cui le sessioni possono essere messe in pausa e ibernate, è possibile che si verifichino problemi durante la sincronizzazione.
Quindi, la risposta alla tua domanda è: un vettore con hash per rappresentare la lavagna.
Un vettore con hash è una raccolta con due porte di accesso, una a cui si accede per posizione, la seconda a cui si accede tramite chiave. Il vostro vettore hash permetterebbe di accedere
- consiglio per posizione per scoprire che cosa unità è su una posizione
- l'id del pezzo per scoprire dove sulla scheda che è.
Non è possibile rappresentare la scheda come un albero a meno che il proprio non sia un gioco da tavolo multidimensionale. Un albero è necessario quando si ha un albero, una scala o un castello che si trova su una posizione di bordo, in modo che quando un'unità raggiunge quella posizione orizzontale di una tavola, avrebbe bisogno di avanzare fino alla posizione verticale della scala o del castello . E nel castello l'unità deve essere dirottata in numerose stanze. O sull'albero c'è una strega capace di catturare l'unità in una bottiglia con un percorso di fuga confuso. Pertanto, l'uso di una struttura ad albero per rappresentare la tua tavola rappresenterebbe una complicazione inutile per programmare il tuo gioco.
Non importa se è quadrato di diamante o cerchio, ecc. Hai solo bisogno di enumerare la posizione della scheda. Il metodo di enumerazione deve essere conveniente per le tue regole da catturare.
Ciò significa che non è necessario enumerare un pezzo come (1,3) e quindi enumerare il pezzo adiacente come (2,7): è solo un buon senso. Perché i vicini di (1,3) sono (0,2), (1,2), (2,2), (0,3), (2,3), (0,4), (1,4) e (2,4) ma non (2,7).
Quindi è necessario un vettore hash bidimensionale.
per soddisfare il vostro bisogno di scoprire che cosa unità è al x, y la posizione della vostra tavola:
BasicUnit getPosition(x,y)
Così come, la posizione scoprire la (x, y) di un'unità.
Position getUnit(BasicUnit unit)
allora si potrebbe pianificare il vostro gioco ad essere espandibile in modo che un giocatore sulla vittoria raggiungimento potrebbe andare a giocare al livello successivo, che ha una forma diversa di bordo. Il tuo vettore hash bidimensionale sarebbe ancora utilizzato perché separa il livello di presentazione del tuo software dalla sua struttura dati.
Basta inserire più posizioni nel vettore.
È possibile visualizzare la mia implementazione Java di un 1-D vettore di hashing a http://code.google.com/p/synthfuljava/wiki/HashVector
tradurlo alla scelta del linguaggio di programmazione e aggiungere un altro vettore dimensione ad esso.
Potete per favore caricare il disegno della lavagna da qualche parte? Non sono sicuro di aver interpretato bene la tua descrizione. –