Ho imparato C# durante l'estate e ora mi sento come fare un piccolo progetto da quello che ho fatto finora. Ho deciso una sorta di gioco di avventura basato su testo.Interrogazione relativa alla progettazione di giochi di avventura di testo basati su classi.
La struttura di base del gioco riguarderà un numero di settori (o stanze). All'ingresso in una stanza, verrà fornita una descrizione e un numero di azioni e azioni che potresti intraprendere; la capacità di esaminare, raccogliere, usare cose in quella stanza; possibilmente un sistema di battaglia, ecc. ecc. Un settore può essere collegato fino a 4 altri settori.
In ogni caso, scarabocchiare idee su carta su come progettare il codice per questo, mi sto grattando la testa sulla struttura di parte del mio codice.
Ho deciso una classe giocatore e una classe 'livello' che rappresenta un livello/dungeon/area. Questa classe di livello consisterebbe in un certo numero di "settori" interconnessi. In qualsiasi momento, il giocatore sarà presente in un certo settore del livello.
Quindi, ecco la confusione:
Logicamente, ci si aspetterebbe un metodo come player.Move(Dir d)
Tale metodo dovrebbe cambiare il campo 'settore corrente' nell'oggetto di livello. Ciò significa che la classe Player deve conoscere la classe Livello. Hmmm. E livello potrebbe dover manipolare il lettore oggetto (ad es. Il giocatore entra nella stanza, un'imboscata da qualcosa, perde qualcosa dal magazzino.) Così ora livello ha anche bisogno di mantenere un riferimento alla Player oggetto?
Questo non è piacevole; tutto ciò che deve contenere un riferimento a tutto il resto.
A questo punto mi sono ricordato di aver letto dei delegati del libro che sto usando. Sebbene conosca i puntatori di funzione del C++, il capitolo sui delegati è stato presentato con esempi con una sorta di punto di vista della programmazione 'evento basato', con il quale non avevo molta illuminazione.
Questo mi ha dato l'idea di progettare le classi come segue:
giocatore:
class Player
{
//...
public delegate void Movement(Dir d); //enum Dir{NORTH, SOUTH, ...}
public event Movement PlayerMoved;
public void Move(Dir d)
{
PlayerMoved(d);
//Other code...
}
}
Livello:
class Level
{
private Sector currSector;
private Player p;
//etc etc...
private void OnMove(Dir d)
{
switch (d)
{
case Dir.NORTH:
//change currSector
//other code
break;
//other cases
}
}
public Level(Player p)
{
p.PlayerMoved += OnMove;
currSector = START_SECTOR;
//other code
}
//etc...
}
È questo un modo va bene per fare questo?
Se il capitolo dei delegati non fosse presentato come era, non avrei pensato di utilizzare tali "eventi". Quindi, quale sarebbe un buon modo per implementarlo senza utilizzare i callback?
Ho l'abitudine di fare i messaggi altamente dettagliate ... scusate v__v
+1 per il post altamente dettagliato – Task
+1 per un post altamente dettagliato. ;-) –
Hai bisogno di chiedertelo, è davvero d'aiuto chiamare il tuo enum 'Dir'? Il fatto che fosse necessario un commento dovrebbe darti un suggerimento. – ChaosPandion