Evitar estados imposibles en un juego de aventuras

15

Estoy buscando crear un estilo de juego bastante complejo para elegir tu propia aventura, pero estoy buscando una técnica o método para ayudar con el diseño del juego.

Será una historia de múltiples ramificaciones, y en ocasiones las ramas se replegarán sobre sí mismas, y sus principales acciones serán recordadas y se recogerán artículos. Por ejemplo, si el jugador va al pantano y al bosque antes de ir al castillo, ha recogido un hueso de dinosaurio, ha matado a un unicornio y le ha crecido un brazo extra. Si un jugador llega al castillo a través de las cuevas y la cripta, ha recogido una bicicleta y un olor extraño. Ahora, al desarrollar rompecabezas para el castillo, no quiero crear una situación en la que se requieran dos imposibilidades, por ejemplo: se necesita un brazo adicional y el olor para matar a un ogro.

Además de documentar los eventos y elementos con mucho cuidado, ¿hay un proceso, una técnica que pueda usar en una hoja de cálculo o un software que pueda ayudarme?

DanDan
fuente

Respuestas:

11

Suena como un problema de gráfico dirigido.

Comience desde el principio, para cada ramificación en la historia, registre los elementos que tiene actualmente y luego ramifique el gráfico. A partir de ahí, siga cada rama y haga lo mismo, una vez que llegue a otra rama, registre sus elementos actuales y bifurque el gráfico. Esto terminará con un gráfico bastante denso con muchos nodos duplicados (pero cada nodo llegó desde una secuencia de gráfico diferente) pero no debería haber bucles.

Al final, debe tener una gráfica de todos los elementos que puede tener en cualquier punto de su historia y de todas las formas posibles de llegar allí.

Ahora, con su gráfico completo: para cada uno de sus problemas que requieren elementos X + Y + Z, encuentre todos los nodos que tengan ese problema y vea si los elementos registrados pueden satisfacer esa condición. Si hay una falla, simplemente retroceda en el gráfico para encontrar todas las decisiones que lo llevaron allí sin los elementos adecuados para resolver ese problema.

Con suerte, su diseño original ya se presenta de esta manera, al menos conceptualmente, por lo que el código debe reflejar la realidad y ser fácil de verificar.

El tiempo de procesamiento de las búsquedas de gráficos puede ser un poco pesado si está creando un juego grande, así que compírelo como una utilidad que puede tardar un tiempo en ejecutarse y genera resultados en un informe para que lo use.

Patrick Hughes
fuente
eso significa desarrollar una herramienta. Lo pongo como último recurso.
Ali1S232
66
La herramienta será tu propio cerebro, mantenimiento de registros y capacidad de memoria o será algo automatizado que no se cansará y perderá una falla =) Supongo que depende de qué tan grande será tu juego y si alguna vez construye otro desde el mismo motor, para decidir si el tiempo empleado vale la pena o no.
Patrick Hughes
La mejor manera de hacer esto puede ser construir un árbol de dependencias de arriba hacia abajo (ir hacia atrás), y si dos elementos en el árbol comparten la misma dependencia (y la dependencia requiere una elección entre ellos), entonces usted tiene una violación.
deceleratedcaviar
0

¡Esto puede parecer una respuesta extraña, pero puede verificar fácilmente eventos imposibles usando compiladores (por ejemplo, c ++)! déjame explicarte cómo: tienes exactamente un archivo de encabezado para cada etapa. y el juego termina en main.cpparchivo. siempre que pueda pasar de stage aa stage b, solo tiene que incluir el archivo relacionado con stage aen stage b. cada vez que obtiene un nuevo elemento en una etapa, simplemente define un valor para ese elemento. cada vez que pierdes o usas un artículo, solo tienes que recuperarlo. Al final de cada etapa, solo tiene que usar todos los valores definidos para los elementos necesarios en esa etapa. Aquí hay una muestra de cómo usar esto en el código:

ah

#define itemA

bh

#include <a.h>
#undef itemA
#define itemB

ch

#include <a.h>

itemA;

#include <b.h>

itemB;

main.cpp

#include <c.h>
int main()
{
}

aunque puede necesitar algunos cambios antes de usarse realmente, pero supongo que puede crear un código como este. También puede usar la herencia y usar clases para cada etapa en lugar del enfoque que sugerí. aparte de estos, creo que tienes que desarrollar una herramienta tú mismo.

Ali1S232
fuente
2
¡Es un mal uso del compilador!
Ali1S232
3
Es interesante, pero sería bastante frágil y solo funcionaría si tuviera una clase por objeto / evento / sección en mi historia. Estaba buscando un enfoque más basado en datos, leyendo desde xml o algo así. Aunque gracias por tu sugerencia.
DanDan
3
No es una buena idea forzar una recompilación cada vez que cambia una búsqueda, además, esto no permitiría actualizaciones de datos a los usuarios finales (DLC, por ejemplo), o si se ejecuta desde un servidor y aplica correcciones sin forzar las descargas.
Patrick Hughes
2
esa muestra de código no está relacionada con el código que se lanzará, y ese código realmente no hace nada. solo verifica si tu historia y tus misiones son válidas o no. (¡si no lo son, solo obtienes un error de compilación, de lo contrario puedes implementar ese árbol de misiones en tu juego!
Ali1S232
Oh ya veo, me malinterpreté. Sospecho que una persona podría pasar más tiempo asegurándose de que este código refleje los datos reales de los que se guardarían los errores lógicos de búsqueda de depuración, esa es una decisión que el autor del juego debe hacer.
Patrick Hughes