He estado aprendiendo C# durante el verano y ahora tengo ganas de hacer un pequeño proyecto de lo que he hecho hasta ahora. Me decidí por una especie de juego de aventuras basado en texto.Consulta sobre el diseño del juego de aventuras de texto basado en clases.
La estructura básica del juego implicará tener una serie de sectores (o salas). Al ingresar a una sala, se generará una descripción y se tomarán una serie de acciones; la capacidad de examinar, recoger, usar cosas en esa habitación; posiblemente un sistema de batalla, etc. etc. Un sector puede estar conectado a otros 4 sectores.
De todos modos, garabateando ideas en papel sobre cómo diseñar el código para esto, me estoy rascando la cabeza sobre la estructura de parte de mi código.
He decidido una clase de jugador y una clase de "nivel" que represente un nivel/mazmorra/área. Esta clase de nivel consistiría en una serie de 'sectores' interconectados. En cualquier momento dado, el jugador estaría presente en un sector determinado en el nivel.
Así que aquí está la confusión:
Lógicamente, uno esperaría un método como player.Move(Dir d)
Dicho procedimiento debe cambiar el campo 'sector actual' en el objeto de nivel. Esto significa que la clase Player necesitaría saber sobre la clase Level. Hmmm. Y Nivel puede tener que manipular el jugador objeto (por ejemplo. El jugador entra en la habitación, emboscado por algo, pierde algo de inventario.) Así que ahora Nivel también tiene que contener una referencia a la jugador objeto?
Esto no se siente bien; todo tiene que contener una referencia a todo lo demás.
En este punto recordé haber leído acerca de los delegados del libro que estoy usando. Aunque conozco los indicadores de función de C++, el capítulo sobre delegados se presentó con ejemplos con una especie de punto de vista de programación "basado en eventos", con el que no tenía mucha información.
Eso me dio la idea de diseñar las clases de la siguiente manera:
jugador:
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...
}
}
Nivel:
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...
}
¿Es esta una manera bien para hacer esto?
Si el capítulo de delegados no se presentó tal como era, no habría pensado en usar tales 'eventos'. Entonces, ¿cuál sería una buena forma de implementar esto sin usar callbacks?
que tienen la costumbre de hacer mensajes muy detallados ... lo siento v__v
+1 para una publicación muy detallada – Task
+1 para una publicación muy detallada. ;-) –
Tienes que preguntarte, ¿realmente ayuda a nombrar a tu enum 'Dir'? El hecho de que se requiera un comentario debería darle una pista. – ChaosPandion