Come dovrei modellare un gioco basato su economia in codice?


10

Vorrei creare un gioco di economia basato su un'antica civiltà. Non sono sicuro di come progettarlo. Se stessi lavorando su un gioco più piccolo, come una copia di "Space Invaders", non avrei problemi a strutturarlo in questo modo:

  • Classe di controllo principale
  • Classe grafica
  • Classe del giocatore
  • Classe nemica

Non capisco come lo farei per progetti più grandi come il mio gioco di economia. Creo una classe di campagna che contiene un gruppo di città? Le città contengono molte classi edilizie, la maggior parte contiene classi di persone? Devo fare un percorso per trovare classe a cui il giocatore possa accedere per spostarsi?


3
Potresti voler usare una qualche forma di Entity-Component-System (ecco il riferimento canonico ) - senza che le entità si disegnino da sole (specialmente se ne hai molte).
ThorinII,

9
Saresti terribilmente sorpreso da quanto siano orribili, disorganizzati e messi insieme tutti i giochi "grandi". Sono costruiti attorno a scadenze e pietre miliari. Basta scrivere un gioco e qualsiasi struttura cada da ciò che è necessario scrivere sarà altrettanto buona se non migliore della maggior parte dei giochi AAA in circolazione.
Sean Middleditch il

Anche se non si esegue ECS in piena regola, è comunque bello non duplicare il codice, lasciare che il controller esegua l'iterazione delle entità e chiami il renderer, o addirittura lasci la scansione del renderer. Fare un aggiornamento minore del codice in 100 posti è una seccatura.
MickLH,

1
Saltare da Space Invaders a un gioco complesso come hai descritto è un po 'drastico, secondo me. Ci sono più passaggi di apprendimento tra questi due giochi, prima di entrare in un grande progetto di gioco. Prendi in considerazione la creazione di una piattaforma 2D a scorrimento laterale e aumenta gradualmente la complessità dei tuoi giochi. Passare dalla prima alla quinta marcia può richiedere fino a 120 km / h, ma non con la stessa efficienza (tempo / sforzo) che si avrebbe se ci si sposta da un livello all'altro.
Emir Lima,

2
Sembra che tu abbia due domande qui, e non posso dire quale sia più importante per te. Il primo riguarda come evitare di passare molti riferimenti agli oggetti, mentre il secondo riguarda l'approccio alla mappatura delle entità logiche nel gioco in classi di codice. Queste domande hanno risposte distinte e penso che dovresti pubblicare domande distinte per loro. Ho intenzione di modificare la tua parte "evitando di passare i riferimenti". Sentiti libero di ripubblicarlo (e considera anche di cercare in questo sito argomenti su "evitare singoli e globi", poiché le risposte sono molto simili).

Risposte:


5

Creo una classe di campagna che contiene un gruppo di città?

Sicuro.

Le città contengono molte classi edilizie, la maggior parte contiene classi di persone?

Sicuro.

Devo fare un percorso per trovare classe a cui il giocatore possa accedere per spostarsi?

Sicuro.

Tutto ciò che hai suggerito sopra sembra ragionevole. A lungo termine potrebbe non essere il modo migliore per te, ma va bene. Ha ovviamente senso che tu sappia poiché è il modello organizzativo che ti è venuto in mente per la prima volta. È importante prenderlo e iniziare un'implementazione da esso. Entrambe ti faranno iniziare, superandoti questa "paralisi del design" iniziale che spesso affligge gli sviluppatori all'inizio di un'attività e (se si dimostra in qualche modo imperfetto) ti insegnano una cosa o due sui pro e contro di quel particolare approccio al design.

Hai naturalmente preso i concetti nella tua testa e li hai raggruppati in codice secondo alcune semplici regole:

  • Questo concetto differisce in modo significativo nel comportamento o nei dati da altri oggetti che ho già? (I paesi e le persone condividono pochissimi dati o comportamenti significativi, quindi dovrebbero essere rappresentati da tipi distinti nel gioco).
  • Avrò anche bisogno di manipolare questo concetto nel codice in modo significativo (se il tuo gioco si occupa di singole persone, potresti aver bisogno di quella Personclasse, ma se il gioco si preoccupa solo di loro nell'aggregato, come nelle versioni precedenti di SimCity, tu potrebbe non essere necessario quel tipo né istanze di quel tipo per creare una mappatura 1: 1 della popolazione di una città. int populationCountpotrebbe essere sufficiente).
  • Questo concetto richiede stato ? In tal caso, dovrebbe essere incapsulato in qualche modo che mi consente di memorizzare questo stato (una classe) piuttosto che un mucchio di funzioni libere. (Un'implementazione di pathfinding non ha un oggetto del mondo reale analogo, ma richiede di tenere traccia di dati come quali nodi nella mappa ha già preso in considerazione e che è meglio fare attraverso una classe piuttosto che archiviarlo in un mazzo di globi nascosti e creazione di funzioni indipendenti).

Sebbene semplice, rispondere a queste domande può essere di grande aiuto quando si cerca di decidere se e come trasformare un concetto mentale in codice sorgente. Potresti anche voler leggere i principi SOLID di progettazione orientata agli oggetti.

Si noti che anche il suggerimento di un sistema di entità / componente fatto nei commenti è un approccio valido, anche se lo eviterei qui a meno che non ridisegni il tuo progetto in modo che sia più piccolo (semplicemente perché affrontare due nuove, grandi sfide in un progetto può essere troppo scoraggiante e può diluire il beneficio educativo che altrimenti riceverei concentrandoti solo su uno). In un modello orientato ai componenti, il "tipo" nelle domande precedenti diventa più implicito: non il tipo concreto nel codice, ma il tipo implicito definito dalla raccolta di componenti che formano un'entità. Si possono applicare gli stessi principi guida.


1

Quello che hai descritto (una classe per ogni tipo principale di oggetto di gioco logico) ha perfettamente senso per un gioco semplice. Se è la prima volta che scrivi un gioco di questo tipo, suggerirei di farlo in questo modo.

Solo un paio di consigli:

  • Un giocatore è davvero diverso da un nemico ? È probabile che molte funzionalità siano le stesse, quindi dovrebbero normalmente essere della stessa classe o estese dalla stessa classe di base. Prendi in considerazione una classe base di AbstractPlayer con due sottoclassi HumanPlayer e AIPlayer : tutte le funzionalità comuni possono andare in AbstractPlayer .
  • Preferisci configurare oggetti con composizione piuttosto che ereditarietà. Non rendere le gerarchie ereditarie troppo profonde. Se inizi a chiamare una classe ForgeWithSteelAnvil , dovresti preoccuparti: una Forge potrebbe essere una sottoclasse di Building , ma il tipo di incudine utilizzato dovrebbe essere un oggetto contenuto all'interno dell'edificio.
  • Allo stesso modo preferisci proprietà che ti consentano di configurare oggetti piuttosto che aggiungere centinaia di classi di oggetti leggermente diverse.

In giochi più complessi, ci sono tecniche più avanzate che puoi usare, ma ti suggerisco di non usarle fino a quando non ti sentirai molto a tuo agio con l'approccio base OOP (cioè hai realizzato con successo un paio di giochi completati). Approcci più avanzati potrebbero includere:

  • Modelli di oggetti basati su prototipi : usa una singola classe per tutti gli oggetti di gioco e modella tutti i tuoi oggetti attraverso proprietà / attributi e composizione. Molto più flessibile / dinamico rispetto allo standard OOP, ma più difficile da gestire (in particolare, il compilatore non ti aiuterà molto se fai qualcosa di stupido). L'ho usato con buoni risultati nel mio piccolo gioco Roguelike Tyrant ( https://github.com/mikera/tyrant )
  • Sistemi componenti entità : ottimo se hai molti comportamenti complessi che vuoi mescolare e abbinare in molti tipi diversi di oggetti di gioco. Molto potente, ma difficile da ottenere.

0

Esistono alcuni metodi che è possibile utilizzare per affrontare l'organizzazione delle entità e dei set di dati. Preferisco scrivere un documento di foglio di calcolo e testare i dati andando avanti e indietro per essere sicuro di essere efficiente. Se stai creando il gioco da solo, ricorda che deve avere senso per te. A volte il percorso più efficiente è quello di essere leggermente meno efficiente nel codice per rendere il progetto più semplice.

Se vuoi avere più aiuto nella strutturazione dei tuoi contenuti, trova un vecchio codice sorgente del gioco che utilizza una struttura o uno stile simili e trova la loro soluzione. Quindi perfezionalo e correggilo a tuo piacimento.


-1, poiché questo non sembra indirizzare l'organizzazione del codice e per il suggerimento di copiare ciecamente ciò che fa un altro gioco senza discutere i modi per comprendere i compromessi di qualsiasi decisione di progettazione presa da quel gioco.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.