¿Cómo debo modelar un juego basado en economía en código?

10

Me gustaría crear un juego económico basado en una civilización antigua. No estoy seguro de cómo diseñarlo. Si estuviera trabajando en un juego más pequeño, como una copia de "Space Invaders", no tendría problemas para estructurarlo así:

  • Clase de control principal
  • Clase de gráficos
  • Clase de jugador
  • Clase enemiga

No entiendo cómo haría esto para proyectos más grandes como mi juego económico. ¿Creo una clase de país que contiene un montón de ciudades? ¿Las ciudades contienen mucha clase de construcción, la mayoría contienen clases de personas? ¿Hago una clase de búsqueda de ruta a la que el jugador pueda acceder para moverse?

Matthew G.
fuente
3
Es posible que desee utilizar alguna forma de un Sistema de entidad-componente (aquí está la referencia canónica ), sin que las entidades se dibujen a sí mismas (especialmente si tiene muchas de ellas).
ThorinII
99
Te sorprendería muchísimo lo horribles, desorganizados y pirateados que son la mayoría de los juegos "grandes". Se construyen alrededor de plazos e hitos. Simplemente escriba un juego y cualquier estructura que se desprenda de lo que necesita escribir será tan buena, si no mejor, que la mayoría de los juegos AAA que existen.
Sean Middleditch
Incluso si no va por completo el ECS, es agradable no duplicar el código, deje que el controlador repita las entidades y llame al renderizador, o incluso permita que el renderizador escanee. Hacer una actualización de código menor en 100 lugares es una molestia.
MickLH
1
Saltar de Space Invaders a un juego complejo como lo describiste es un poco drástico, en mi opinión. Hay más pasos de aprendizaje entre estos dos juegos, antes de entrar en un gran proyecto de juego. Considera crear una plataforma de desplazamiento lateral en 2D y aumentar la complejidad de tus juegos gradualmente. Pasar de la primera a la quinta marcha puede llevarlo hasta 120 km / h, pero no con la misma eficiencia (tiempo / esfuerzo) que sería si se moviera de nivel en nivel.
Emir Lima
2
Parece que tienes dos preguntas aquí, y no puedo decir cuál es más importante para ti. El primero trata sobre cómo evitar pasar muchas referencias a objetos, y el segundo trata sobre cómo debe abordar el mapeo de las entidades lógicas en su juego en clases en código. Esas preguntas tienen respuestas distintas, y creo que debería publicar preguntas distintas para ellas. Voy a editar tu parte de "evitar pasar referencias". Siéntase libre de volver a publicarlo (y también considere buscar en este sitio temas sobre "cómo evitar los tonos únicos y globales", ya que las respuestas son muy similares).

Respuestas:

5

¿Creo una clase de país que contiene un montón de ciudades?

Seguro.

¿Las ciudades contienen mucha clase de construcción, la mayoría contienen clases de personas?

Seguro.

¿Hago una clase de búsqueda de ruta a la que el jugador pueda acceder para moverse?

Seguro.

Todo lo que has sugerido anteriormente parece razonable. Puede que no sea la mejor manera para ti a largo plazo, pero está bien. Obviamente tiene sentido que lo sepas, ya que es el modelo organizativo que se te ocurrió por primera vez. Es importante que tome eso y comience una implementación a partir de él. Ambos lo ayudarán a comenzar, superando esta "parálisis de diseño" inicial que a menudo afecta a los desarrolladores al comienzo de una tarea, y (si se demuestra que tiene algún defecto) le enseñará una o dos cosas sobre los pros y los contras. de ese enfoque particular al diseño.

Naturalmente, ha tomado los conceptos en su cabeza y los ha agrupado en código de acuerdo con algunas reglas simples:

  • ¿Este concepto difiere significativamente en el comportamiento o en los datos de otros objetos que ya tengo? (Los países y las personas comparten muy poco, o ninguno, datos o comportamientos significativos, por lo que deberían estar representados por distintos tipos en el juego).
  • ¿Necesitaré incluso manipular este concepto en el código de manera significativa (si su juego trata con personas individuales, es posible que necesite esa Personclase, pero si el juego solo se preocupa por ellos en conjunto, como en versiones anteriores de SimCity, usted puede que no necesite ese tipo ni instancias de ese tipo para crear un mapeo 1: 1 de la población de una ciudad. int populationCountPuede ser suficiente).
  • ¿Este concepto requiere estado ? Si es así, debería encapsularse de alguna manera que me permita almacenar este estado (una clase) en lugar de un montón de funciones gratuitas. (Una implementación de búsqueda de ruta no tiene un objeto análogo del mundo real, pero requiere hacer un seguimiento de los datos, como qué nodos en el mapa ya ha considerado, y eso se hace mejor a través de una clase que almacenándolo en un grupo de globales ocultos y haciendo funciones independientes).

Si bien es simple, responder esas preguntas puede ser de gran beneficio al intentar decidir si y cómo transformar un concepto mental en código fuente. También es posible que desee leer sobre el principios SÓLIDOS del diseño orientado a objetos .

Tenga en cuenta que la sugerencia de un sistema de entidad / componente hecha en los comentarios también es un enfoque válido, aunque lo evitaría aquí a menos que vuelva a definir su proyecto para que sea más pequeño (simplemente porque asumir dos desafíos nuevos y grandes en un proyecto puede ser demasiado desalentador y puede diluir el beneficio educativo que de otro modo recibiría al enfocarse solo en uno). En un modelo orientado a componentes, el "tipo" en las preguntas anteriores se vuelve más implícito: no el tipo concreto en el código, sino el tipo implícito definido por la colección de componentes que forman una entidad. Se pueden aplicar los mismos principios rectores.


fuente
1

Lo que ha descrito (una clase para cada tipo principal de objeto de juego lógico) tiene mucho sentido para un juego simple. Si es la primera vez que escribes un juego de este tipo, te sugiero que lo hagas de esta manera.

Solo un par de consejos:

  • ¿Es un jugador realmente diferente de un enemigo ? Es probable que mucha de la funcionalidad sea la misma, por lo que normalmente debería ser la misma clase o extenderse desde la misma clase base. Considere una clase base AbstractPlayer con dos subclases HumanPlayer y AIPlayer : toda la funcionalidad común puede ir en AbstractPlayer .
  • Prefiere configurar objetos con composición en lugar de herencia. No haga sus jerarquías de herencia demasiado profundas. Si comienzas a llamar a una clase ForgeWithSteelAnvil, entonces deberías preocuparte: una Forge podría ser una subclase de Building , pero el tipo de yunque utilizado debería ser un objeto contenido dentro del edificio.
  • Del mismo modo, prefiera propiedades que le permitan configurar objetos en lugar de agregar cientos de clases de objetos ligeramente diferentes.

En los juegos más complejos, existen técnicas más avanzadas que puede usar, pero le sugiero que no las use hasta que se sienta muy cómodo con el enfoque básico de OOP (es decir, haya realizado un par de juegos completos con éxito). Los enfoques más avanzados pueden incluir:

  • Modelos de objetos basados ​​en prototipos : use una sola clase para todos los objetos del juego y modele todos sus objetos a través de propiedades / atributos y composición. Mucho más flexible / dinámico que el OOP estándar, pero más difícil de administrar (en particular, el compilador no lo ayudará mucho si hace algo estúpido). Usé esto con buenos resultados en mi pequeño juego Roguelike Tyrant ( https://github.com/mikera/tyrant )
  • Sistemas de componentes de entidad : buenos si tiene muchos comportamientos complejos que desea mezclar y combinar en muchos tipos diferentes de objetos de juego. Muy poderoso, pero difícil de acertar.
mikera
fuente
0

Existen pocos métodos que puede utilizar para abordar la organización de sus entidades y conjuntos de datos. Prefiero escribir un documento de hoja de cálculo y probar datos que se mueven de un lado a otro para asegurarme de que soy eficiente. Si está haciendo el juego usted mismo, recuerde que debe tener sentido para usted. A veces, la ruta más eficiente es ser ligeramente menos eficiente en el código para simplificar el proyecto.

Si desea obtener más ayuda para estructurar su contenido, busque un código fuente de juego antiguo que use una estructura o estilo similar y encuentre su solución. Luego refínalo y arréglalo a tu gusto.

Belcebú
fuente
-1, ya que esto no parece abordar la organización del código y la sugerencia de copiar ciegamente lo que hace otro juego sin discutir formas de entender las compensaciones de las decisiones de diseño que tomó el juego.