2009-08-07 11 views
6

Sto provando a portare un gioco da tavolo al mondo dei computer, e la scheda è composta da 16 spazi, 6 per ciascun lato e 4 nel mezzo. La tavola è a forma di diamante e due estremità rappresentano entrambe le basi della squadra. Nel gioco, i peices si muovono solo verso la base del nemico (con abilità speciali ovviamente) Quindi ecco la mia domanda: quale pensi sia la migliore struttura dati per rappresentare il tabellone? La prima cosa che è venuta alla mia mente era un albero, ma davvero non mi piace l'idea perché ci sarebbero due "radici" Qualche suggerimentoLa migliore struttura dati per rappresentare un tabellone di gioco

la scheda si presenta come segue:.?

& 
    & & 
& & & 
* * * * 
$ $ $ 
    $ $ 
    $ 

quindi la squadra può solo & mossa verso la squadra $ e viceversa, * essendo territorio neutro

+0

Potete per favore caricare il disegno della lavagna da qualche parte? Non sono sicuro di aver interpretato bene la tua descrizione. –

risposta

11

È essenzialmente un quadrato? La forma del diamante è solo una questione di interpretazione? Come così ..

M A A A 
B M A A 
B B M A 
B B B M 

in caso affermativo, forse basta usare una matrice 2D, e utilizzare il sistema di visualizzazione a 'trasformarlo' in un diamante.

modificare

Penso che si può mappare si SPOSTA IMPOSTA alla matrice - Se pezzi tuoi '$' muovono solo up-and-sinistra o up-and-destra, che è simile al mio 'B 'pezzi che si muovono solo' su 'o' destra '. Similmente, se i pezzi '&' si muovono solo in basso a sinistra o in basso a destra, è come se i pezzi 'A' si muovessero verso il basso o verso sinistra.

L'idea è che, interna al programma, pensa dei dati 'su e giù', ma quando si presenti la tua stato del gioco per l'utente, solo disegnare nella configurazione di diamante.

+0

è esattamente un quadrato, ma ho usato il diamante perché nel caso del quadrato, i pezzetti avrebbero dovuto spostarsi diagonalmente verso l'altro angolo anziché solo su o giù, cosa che trovo rende molto più sensato ed è più conveniente –

+2

A 2D array è sicuramente la strada da percorrere. Non solo è una struttura rapida e conveniente, ma le regole di movimento dovrebbero essere facili da codificare. Keep it simple! – Darryl

0

Vorrei usare un tipo di grafico. Mi piace:

class Field 
{ 
    private List<Field> neighbours; 
} 

Oppure non una lista ma una matrice che contiene riferimenti null per i campi di confine. Qualsiasi scheda può essere rappresentata con questo.

+0

Questo è ovviamente il modo più semplice di fare le cose, ma non mi piace perché non mostra vincoli per il movimento sinistra/destra, e l'elenco dei vicini non ti dirà esplicitamente quale regione è dove. –

0

Perché non utilizzare una struttura di array semplice? Se la scacchiera è a forma di diamante, ha una forma quadrata/rettangolare, giusto?

Dim myBoard(5,5) As Array 

Naturalmente, se la scheda è a forma stranamente, (come ci sono spazi e le cose in mezzo) questo non può funzionare.

+0

Può ancora funzionare, purché le cose nel mezzo siano diamanti - possono essere rappresentati come valori nulli o qualcosa di simile. –

+0

stesso committente come justjeff, grazie per le idee però –

1

Che dire di due alberi con i quattro campi centrali uguali? (Intendo riferirmi agli stessi oggetti)

+0

Ci ho pensato anche io, ma non ero sicuro di cosa succederebbe se prendessi un campo medio e afferrai i suoi genitori? come potrei sapere uno da ottenere? La migliore risposta ancora! –

+0

Hai detto che il giocatore può solo andare avanti - quindi hai bisogno del genitore? –

4

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.

+0

Ho dimenticato di aggiungere che la trasformazione del vettore hash 1-D è un'operazione piuttosto semplice di mappatura della posizione abtract (x, y) alla posizione lineare effettiva del vettore hash 1-D. Così, se il consiglio è di 9 per 9, trasformante (x, y) per indicizzare vettore è vectorindex = x + 9 * y –

+0

buon posto, ma un vettore hash è un tale eccessivo per questo. La scheda è solo 4x4, il che significa che l'hashing lo rallenterà in realtà rispetto a una semplice mappa. –

Problemi correlati