Griglia 2D con più tipi di oggetti

2

Questo è il mio primo post qui su programmers.stackexchange (sono un utente regolare su SO). Spero che non sia troppo generico.

Sto provando un progetto semplice per imparare Java da qualcosa che ho visto fare in passato. Fondamentalmente, è una simulazione di IA in cui ci sono creature erbivore e carnivore ed entrambi devono cercare di sopravvivere. La parte che sto cercando di fare è quella del consiglio stesso.

Assumiamo regole molto semplici. La scheda deve essere di dimensione X per Y e solo un elemento può essere in un posto alla volta. Ad esempio, un critter non può essere nella stessa casella di un blocco food . Ci possono essere ostacoli (rocce, alberi ..), ci può essere cibo, ci possono essere creature di qualsiasi tipo. Assumendo queste regole, quale sarebbe un buon modo per rappresentare questa situazione?

Questo è quello che mi è venuto in mente e voglio dei suggerimenti se possibile:

Usa più livelli di ereditarietà per rappresentare tutti i diversi possibili oggetti (AbstractObject - > (NonMovingObject - > (Cibo, Ostacolo), MovingObject - > Critter - > (Carnivoro, Erbivoro)) e usa il polimorfismo in una matrice 2D per memorizzare le istanze e avere ancora accesso ai metodi di livello inferiore.

Grazie mille.

Modifica: Ecco la rappresentazione grafica della struttura che ho in mente.

    
posta ApplePie 08.10.2012 - 23:55
fonte

1 risposta

3

La tua proposta sembra ragionevole, ma:

  • fai attenzione a creare livelli di gerarchia non necessari
  • considera l'utilizzo di un insieme di interfacce invece di una gerarchia di classi
  • se una qualsiasi delle tue operazioni richiede l'ordinamento di oggetti generici in base alla loro sottoclasse dinamica (ad es. mediante casting di oggetti o utilizzando instanceof ), stai quasi certamente facendo la cosa sbagliata.

Specificamente, immagino che risolvere ciò che accade quando un oggetto si sposta in uno spazio attualmente occupato potrebbe essere un problema concettuale, perché dipende dal tipo di entrambi gli oggetti. Ma (per il terzo punto), non cercare di risolverlo determinando dinamicamente il tipo di ciascuno e cercandoli caso per caso usando switch , if o qualche tipo di tabella! Quella "soluzione" è fragile, noiosa e non si adatta bene.

Cerca invece di basare il tuo sistema sulle interfacce necessarie per risolvere il comportamento degli oggetti. Per l'esempio precedente, prova a fornire al tuo oggetto di simulazione generico un insieme di metodi di gestione "risposta", come handleIntrusion(intruder) . Se questo gestore ha bisogno di più informazioni su un altro oggetto, può chiamare metodi appropriati su quell'oggetto, come isVegetable() e forse handleBeingEaten(eater) . (Suppongo che ci sia una linea sottile tra l'uso e l'abuso di predicati come isVegetable() , ma sono comunque preferibili alle operazioni di colata dinamica ...)

Dovresti essere in grado di trovare un insieme ragionevolmente piccolo di operazioni che permetteranno ai tuoi oggetti di simulazione di interagire tra loro. Un set di interfacce ben progettato ti consentirà di modificare ed estendere la tua simulazione senza dover rielaborare ogni cosa in essa ogni volta.

    
risposta data 09.10.2012 - 02:31
fonte

Leggi altre domande sui tag