2012-04-01 16 views
7

Sto costruendo un gioco di dungeon RPG in Java e sono bloccato sulla creazione di una struttura dati.Che cos'è una buona struttura dati Java per memorizzare gli oggetti del gioco RPG?

Ho un sacco di oggetti Thing che posso copiare per popolare un dungeon con. Per esempio, c'è un oggetto Thing bread, un oggetto Thing, un oggetto Thing mail a catena, mostro Thing (s), ecc. Voglio memorizzarli in una Library centrale e quindi essere in grado di recuperare un oggetto usando determinati interrogazioni. Voglio memorizzarle utilizzando i seguenti campi:

int minLevel 
int maxLevel 
double probability 
int[] types 

Quindi una spada arrugginita avrebbe un minLevel di 1, un maxLevel di 3, un probability di rarità (3%), e [type.SWORD,type.WEAPON,type.ITEM,TYPE.EQUIP]. Una spada migliore avrebbe minLevel 2, maxLevel 10, rarità (1%).

Quindi voglio recuperare un numero casuale type.SWORD dalla libreria e dire che sono al livello 3. Dovrei ottenere una spada arrugginita più spesso della spada migliore in base alle loro probabilità. Se avessi recuperato uno type.SWORD dalla libreria che richiedeva il livello 10, avrei recuperato solo la spada migliore.

Spero che abbia senso.

MODIFICA Nella fase di inizializzazione, verranno creati tutti gli oggetti di base. Cose come le armi disponibili, l'armatura, i cibi, le pozioni, le bacchette, tutte le cose di base possibili che hanno una tessera grafica unica nel gioco. Poi, quando voglio posizionare un oggetto da qualche parte, faccio solo una copia di una delle cose disponibili, aggiusto le sue statistiche un po ', e la abbandono nel mondo. Gli oggetti reali sono tutte sottoclassi della classe Thing della radice, come la classe Creatura, Oggetto, Equipaggiamento (estende l'Oggetto), Arma (estende Equip), Armatura (estende Equip), Cibo (estende l'Oggetto), ecc. Ma voglio taggare sono diversi nel database della biblioteca, voglio usare tag extra, come type.RARE, type.ARTIFACT, type.CURSED, quindi voglio tag extra oltre alla classe.

Il gioco utilizza LIBGDX per essere disponibile su Android e come Applet. Io uso il set gratuito di Rltile, che ha migliaia di buone tessere. Userò Pubnub o Google App Engine per fornire supporto multiplayer.

+0

ArrayList - http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html – Coffee

+0

Il vostro mondo hanno una base di dati di oggetti fissi presenti alla creazione? O gli oggetti creati dal nulla quando sono necessari? – sarnold

+0

quindi ogni cosa ha una serie di tipi annidati? Spada, arma, oggetto, equipaggiamento? –

risposta

5

Mi vengono in mente tre risposte:

  1. Scrivi la tua Library che memorizza queste cose in Map s con metodi personalizzati. quindi potresti avere un Map<Type,List<Object>> che memorizza elenchi di cose per tipo e poi un metodo che accetta un tipo, recupera l'elenco dalla mappa e seleziona qualcosa per probabilità (è facile da fare - ne aumenti solo alcune le probabilità, genera un numero casuale compreso tra 0 e la somma, quindi cammina lungo l'elenco, sottraendo la probabilità dell'elemento dal valore casuale fino a quando non è negativo - è restituisce l'elemento che lo ha reso negativo [*]). puoi anche filtrare prima l'elenco per il livello , ad esempio.

    se si dispone di un vero e proprio mix di cose diverse, e non si desidera basare questo su tipi, poi un'altra opzione (più lento, ma più flessibile) è quello di mettere tutto in un elenco e poi filtrare in base alle vostre esigenze . un buon modo per farlo è con guava - vedi Iterables.filter e Predicate allo https://code.google.com/p/guava-libraries/. è possibile fornire un'interfaccia che accetta un predicato e restituisce una selezione casuale da ciò che rimane dopo il filtraggio.predicati sono facili da costruire "in linea" con le classi anonime - si vedano gli esempi a https://code.google.com/p/guava-libraries/wiki/FunctionalExplained#Functions_and_Predicates

  2. attaccare tutto questo in un database. forse sono troppo intraprendente, e la gente del gioco non farebbe mai questo, ma mi sembra che un piccolo database incorporato come sqlite o H2 sarebbe perfetto per questo. è quindi possibile selezionare le cose con query SQL (questo è già una risposta lunga quindi non darò maggiori dettagli qui).

  3. cambia il tuo design. quello che descrivi non è molto OO. invece di avere tipi, le tue cose potrebbero implementare interfacce. quindi l'interfaccia Weapon avrebbe un metodo getMinLevel(), ad esempio. e quindi, con un progetto come questo, utilizzare un database con ORM (ibernazione).

quello che stai facendo è una specie di ambizioso e ho il sospetto è più circa l'apprendimento di qualsiasi altra cosa (nessuna critica destinata - come imparo cose, rendendo le cose, in modo solo supponendo che si sono come me) . quindi scegli quale ti senti più a tuo agio.

[*] questo presuppone che si desidera sempre restituire qualcosa. se le probabilità sono normalizzate e si desidera essere in grado di non restituire nulla, selezionare il valore iniziale da 0-1 (o 0-100 se si utilizzano le percentuali). e, se nulla gira il valore negativo quando si scorre l'elenco, non restituire nulla.

2

L'approccio più semplice consiste nel mettere tutti gli oggetti in un unico grande array e utilizzare il campionamento ripetuto per selezionare un oggetto.

La procedura per selezionare un elemento casuale è molto semplice:

  1. Selezionare un numero casuale da 0 fino alla dimensione del ArrayList
  2. Prendi l'oggetto in tale indice dalla libreria
  3. Se l'oggetto non soddisfa i criteri specificati (ad esempio "è di tipo.SWORD o type.MACE?") torna all'inizio
  4. Se l'oggetto è al di fuori del livello minimo o massimo, torna indietro per iniziare
  5. Se l'obje ct ha una rarità inferiore al 100%, crea un numero casuale compreso tra 0 e 100%. Se il numero casuale supera la rarità dell'oggetto, torna indietro per iniziare. La maggior parte degli oggetti dovrebbe avere una rarità di dire 10-100%, se vuoi oggetti estremamente comuni, puoi aggiungerli più volte alla libreria.

Questa procedura produrrà un oggetto che soddisfa i criteri prima o poi (se esiste) e lo farà in base alla percentuale di rarità.

L'unico piccolo inconveniente è che il loop si interrompe all'infinito se non esiste alcun oggetto di questo tipo. Supponiamo che non ci sia un'arma nella biblioteca al livello 17, ad esempio? Per ovviare a questo, proporrei di ampliare minLevel e maxLevel dopo ogni 100 tentativi per garantire che alla fine ne venga trovato uno. Assicurati di avere sempre un oggetto di livello 1 di ogni tipo disponibile.

Per sicurezza, potresti anche voler un salvataggio dopo aver detto 100.000 tentativi (ma ricorda di lanciare un'eccezione - questo è un problema se stai chiedendo cose che non esistono nella libreria!).

P.S. Ho implementato un sistema di libreria simile in un gioco a rogoverde chiamato Tyrant che ho creato molti anni fa. Source è qui se state interersted:

https://github.com/mikera/tyrant/blob/master/src/main/java/mikera/engine/Lib.java

+2

È fantastico che tu abbia risposto alla mia domanda Mikera. Il tuo gioco Tyrant è stato la mia fonte di ispirazione per molti anni. È un gioco così fantastico e intricato scritto in Java, lo adoro. Il mio gioco RPG sta usando anche il set di rltile, ma il mio è stato scritto per Android e un'applet, e sarà multiplayer. Sto davvero cercando di evitare di guardare il tuo codice sorgente, altrimenti ruberò il tuo codice e idee. Voglio che questo gioco sia al 100% il mio codice. Ho notato che recentemente hai cambiato il nome in tiranno nel tuo repository di codice, hai intenzione di creare un tiranno 2? Sarebbe fantastico! –

+0

Sono contento che ti sia stato utile! Per la cronaca, non mi importa che rubi codice e idee - questo è lo spirito open source dopo tutto! C'è una sottile possibilità che io possa provare a Tyrant 2 (potrebbe essere una riscrittura in Clojure). Dipende da me che sto ottenendo un paio di mesi gratis! – mikera

Problemi correlati