Espacio de Generación y Espacio de Oportunidad

En este tutorial, hablaré sobre dos términos que uso para describir generadores de procedimientos: un espacio generativo y un espacio de posibilidad . Definiremos estos dos términos y luego consideraremos ejemplos interactivos para comprender la diferencia entre ellos. Estos términos son realmente útiles para describir un generador de procedimientos y para comprender la diferencia entre dos generadores. ¡Empecemos!


Imagine un libro enorme que proporciona una captura de pantalla de cada mundo individual de Minecraft. Cada captura de pantalla está marcada con una semilla aleatoria , un número único que puedes ingresar en Minecraft y generar este mundo. La primera página muestra el mundo generado desde seed = 0, la siguiente página muestra el mundo desde seed = 1, y así sucesivamente. En general, el generador de mundo de Minecraft contiene 2 64 valores generadores aleatorios, y este es un número enorme: el juego puede generar 18 446 744 073 709 551 616 mundos. Cada vez que hace clic en "Nuevo mundo", se crea un mundo basado en una de estas semillas. El número 2 64 es el tamaño del espacio de generación de Minecraft, mucho de todo lo que el juego puede generar.


Ahora imagine que el mundo de Minecraft se compone solo de hierba ordinaria, que se extiende sin cesar en todas las direcciones. Debajo de él no hay cuevas, piedra, árboles y colinas, ni animales. Solo una capa de azulejos de hierba. Además de ser muy aburrido, ese mundo nunca se generará en Minecraft (a menos que se use modding). Podemos imaginarlo, podemos describirlo, incluso abrir Minecraft y crearlo nosotros mismos manualmente, pero Minecraft no puede generarlo. ¿Cómo lo sabemos? Puede probar esto de muchas maneras diferentes, pero la forma más fácil de recordar los biomas de Minecraft es en áreas como el desierto o la jungla dispersas por todo el mundo. En nuestro ejemplo con el mundo del césped, no lo son, por lo tanto, sabemos que no se puede crear con un generador estándar.

El mundo de la hierba está en lo que llamamos el Espacio de Oportunidades de Minecraft Worlds: el conjunto de todos los mundos posibles de Minecraft que podemos imaginar, imaginar o describir. Pero el mundo de la hierba no está en el espacio de generación de Minecraft, porque no puede ser creado por el generador de procedimientos del juego. Podemos imaginar el mundo de Minecraft con una réplica exacta de Persépolis a escala, o el mundo en forma de tu escultura de piedra sentado y leyendo este artículo: todos estos son mundos de Minecraft posibles , pero el juego no los generará.


El diagrama que se muestra arriba nos da una idea de cómo se ve todo. ¡Todo lo que está en el espacio de generación de Minecraft también debe estar en su espacio de posibilidades, porque si Minecraft puede generar algo, entonces debería ser posible crearlo en Minecraft! Pero no todo el espacio de posibilidades está en el espacio de la generación, incluido nuestro ejemplo con un mundo que consiste en pasto. Pero la escala no se respeta en este esquema. De hecho, el espacio de posibilidades de Minecraft es mucho, mucho más grande que su espacio de generación.

Para entender qué tan grande es, calculemos el tamaño de un solo mundo de Minecraft. El volumen es el ancho multiplicado por la altura, multiplicado por la profundidad. Por defecto, los mundos de Minecraft tienen 256 fichas de altura, y comienzan a dividirse en aproximadamente 30,000,000 fichas en todas las direcciones desde el punto de partida, es decir, el volumen aproximado del mundo es:

256 x 60 000 000 x 60 000 000 = 921 600 000 000 000 000

Cada uno de estos bloques puede ser cualquier elemento: piedra, hierba, agua, aire. Para nuestra evaluación, seremos generosos y utilizaremos solo "bloques del mundo", que, según el wiki de Minecraft, son 64 tipos . Esto significa que cada bloque en el mundo de Minecraft tiene 64 estados posibles. La fórmula para calcular el número de mundos posibles es igual al número de opciones de estado para cada bloque elevado a la potencia del número de bloques:

64 921 600 000 000 000 000 Minecraft

Este número es tan grande que no pude encontrar una calculadora en Internet que pudiera calcularlo.


Para profundizar aún más en los espacios de generación y posibilidades, necesitamos un ejemplo que podamos poner mejor en nuestras cabezas. Por lo tanto, en el resto del tutorial, veremos los niveles de un juego de plataformas 2D para juegos como Super Mario Bros. o Spelunky Analizaremos varios generadores de niveles para plataformas 2D. En el artículo original, todos son interactivos, por lo que puede generar sus propios niveles. En el proceso de estudiarlos, haremos preguntas sobre su espacio de generación. Todos los ejemplos están disponibles en nuestro GitHub como un boceto de código abierto escrito en Processing .

En el proceso de estudio, haré preguntas en negrita, por ejemplo: ¿cuál es el tamaño del espacio de oportunidades para estos niveles de plataformas? Puede omitirlos de manera segura si solo quiere leer el artículo y jugar con ejemplos. A veces también agrego consejos para ayudar a responder preguntas, por ejemplo:

Sugerencia: los niveles tienen un ancho de 40 fichas y una altura de 10 fichas, y cada ficha puede ser uno de tres elementos: un vacío, un suelo o un bloque de bonificación.

Puede hacer una pausa en el indicador y no desplazarse hacia abajo en la página si no desea leer la respuesta finalizada. Así que echemos un vistazo a nuestro primer generador.

Algoritmo 1: aleatoriedad


Nuestro generador de primer nivel es muy simple: es completamente aleatorio. Cada carta tiene un mosaico de inicio a la izquierda y un mosaico de salida a la derecha. Todas las demás fichas del mapa tienen un 33% de posibilidades de estar vacías, un 33% de estar ocupado y un 33% de ser un bloque de bonificación.


Probablemente hayas notado que este no es un muy buen generador de nivel. De hecho, la mayoría de estos niveles son incluso imposibles de jugar, sin mencionar su interés. Genere algunos niveles más y piense en la pregunta: ¿qué tamaño tiene el espacio de generación de dicho generador en comparación con el espacio de posibilidades?

Pista: ¿puedes llegar a un nivel que esté en el espacio de las posibilidades, pero no en el espacio de la generación? ¿Puedes llegar a un nivel que este generador no pueda crear?

La respuesta correcta es que el espacio de generación de este generador es el mismo que el espacio de posibilidades. Cualquier mosaico en el mapa puede tomar cualquier valor, por lo que cualquier nivel que podamos imaginar está en el espacio de generación. Los niveles más fascinantes e interesantes se encuentran en este espacio de generación, incluso el mapa en el que SUPER MARIO ES IMPRESIONANTE está escrito en bloques de bonificación. Desafortunadamente, el espacio de generación es tan grande que encontrar un buen nivel es extremadamente improbable. Como puede ver haciendo clic en el generador, la mayoría de los niveles son basura.

Algoritmo 2: dibujar formas aleatorias


Nuestro siguiente algoritmo es un poco más complicado, y crea niveles más parecidos a los que puedes aplicar en el juego. Comenzando desde un nivel vacío, selecciona un punto aleatorio en algún lugar y luego dibuja una línea o un cuadrado de bloques de bonos o tierra. Realiza esta operación 20 veces, creando varias formas dibujadas al azar en el nivel. Como antes, puede hacer clic en el ejemplo del artículo original para volver a iniciar el algoritmo y generar un nuevo nivel.


Esto ya está empezando a parecerse a un nivel para el juego de plataformas, ¿verdad? Al generar niveles, imagina mentalmente cómo los juegas (sé generoso si es necesario; agrega la capacidad de doble salto, si es necesario, o la capacidad de saltar fuera del techo del mapa).

¿Cuántos niveles deben generarse antes de encontrar al menos uno por el que pueda pasar?

No se esfuerce por una precisión absoluta en sus recorridos mentales, solo haga una estimación aproximada.

Cuando hago este ejercicio con la audiencia, usualmente toma alrededor de 10 intentos encontrar el nivel en promedio. Cuanto necesitabas Recuerde este número y ahora mire la variación del mismo generador que se muestra a continuación. El generador es el mismo que acabamos de ver, pero ahora se basa en un nivel no de 20, sino de 10 cifras. Ahora cuente de nuevo: ¿cuántos niveles necesita generar antes de encontrar el que puede atravesar?


Probablemente te tomó menos tiempo encontrar un nivel jugable. Hagamos una pausa por un minuto y pensemos en las diferencias entre los dos generadores, que son casi idénticas, excepto por una ligera diferencia en los parámetros. ¿Qué generador tiene un espacio de generación más grande: un generador con 20 figuras o con 10?

Sugerencia: piense en el nivel creado por un generador con 10 figuras: ¿puede un generador con 20 figuras crearlo? Y luego piense en el ejemplo inverso.

La respuesta correcta es que un generador con 20 figuras tiene un espacio de generación más grande; de hecho, contiene todo el espacio de generación del generador con 10 figuras. Para mostrar esto, imagine cualquier nivel de un generador con 10 figuras. Nuestro generador con 20 figuras puede crearlo al representar accidentalmente las mismas diez figuras y luego accidentalmente dibujarlas una segunda vez una encima de la otra. Sin embargo, no se puede dibujar un nivel con veinte figuras separadas usando un generador con 10 figuras.

Esto significa que el generador con 20 cifras tiene más niveles, incluidos niveles interesantes. Pero vale la pena recordar que fue mucho más fácil encontrar un nivel jugable con un generador con 10 figuras. Si tuviera que elegir un generador para su videojuego, ¿cuál usaría? No hay respuestas correctas, pero esta es una decisión muy importante, que a menudo debe hacerse cuando se trabaja con generadores de procedimientos. Un generador puede generar más variabilidad y tiene más sorpresas, el otro es más confiable y menos estresante para el jugador.

Algoritmo 3: Fragmentos de Nivel


Este algoritmo se basa en el generador de niveles utilizado en Spelunky; Puedes leer más sobre esto aquí . El generador de niveles selecciona aleatoriamente un fragmento de un nivel creado por una persona (yo) y lo inserta en un nivel. Luego selecciona otro fragmento aleatorio del nivel y lo inserta uno al lado del otro, y así sucesivamente, hasta que se completa el nivel. Aquí está el generador, el fondo se oscurece para que los bordes de los fragmentos sean claramente visibles:


¿Cuánto tiempo se requiere ahora para generar un nivel jugable? Encontrarás que casi todos los niveles son jugables. Sabemos exactamente qué hay en cada fragmento, es decir, podemos garantizar que habrá objetos interesantes en el nivel en los que puede saltar y obstáculos que debe evitar. Al mismo tiempo, es más dinámico que el nivel estático: no sabemos qué fragmentos aparecerán en él y en qué orden. El algoritmo Spelunky es aún más rico que esto, tiene en cuenta el movimiento vertical y se agregan variaciones aleatorias a cada fragmento. Darius Casemi creó el impresionante generador de niveles interactivos Spelunky, que se puede encontrar aquí .

Tales generadores son un buen compromiso entre sorpresas agradables y la capacidad de control. Cuando un generador realiza una selección de un catálogo de elementos y los conecta entre sí (a veces de acuerdo con reglas especiales, como en Spelunky), lo llamamos un generador basado en la gramática . La gramática nos permite decidir qué bloques de construcción debe usar un generador de procedimientos, pero es menos riguroso acerca de cómo conectarlos. Pero este control y seguridad tienen un precio. Mire el generador nuevamente y luego piense en los ejemplos anteriores. ¿Con qué frecuencia nos sorprenderá un generador de ese nivel?

Inicialmente, el generador está lleno de sorpresas, porque nos encontramos con cada fragmento por primera vez. Pero si juegas más, rápidamente comienzas a notar dónde termina uno y comienza otro fragmento. Incluso si hay cientos de combinaciones de fragmentos en este generador, en solo unos niveles comienzas a sentir como si los vieras a todos. La simplicidad y la facilidad para comprender la gramática de los fragmentos es excelente para los desarrolladores, pero puede ser un inconveniente en términos de diversión para los jugadores.

Algoritmo 4: Diseño Humano


Como último ejemplo, no consideraremos un algoritmo, sino un tipo de proceso creativo muy diferente: el trabajo de las personas en el diseño de niveles. Haga clic en el generador en el artículo original y obtendrá uno de los dos primeros niveles de Super Mario Bros. (Más precisamente, su comienzo).


Comenzando con una coincidencia absoluta, terminamos con este, uno de los ejemplos más famosos de diseño de plataformas en 2D de la historia. Por supuesto, esto no es un generador, pero en cierto sentido, estos niveles pueden ser percibidos como generadores que crean un solo nivel de alta calidad. El compromiso máximo entre control y calidad. Mirando este nivel, piense en todos los generadores que examinamos hoy y piense en la pregunta: ¿ cuál de estos generadores contiene estos niveles famosos en su espacio de generación? .

  • Generación aleatoria
  • Generación de 20 formas
  • Generación de 10 formas
  • Fragmentos de nivel

Solo el primer generador es capaz de crear tales niveles. Los generadores de formas podrían crearlos si aumentamos el número de formas posibles para dibujar, pero también aumentaría significativamente el número de niveles malos o extraños. Un generador de fragmentos de nivel podría hacer esto si le diéramos un conjunto diferente de fragmentos, pero ¿serían jugables todas las demás combinaciones de estos fragmentos?

Esto nos muestra lo difícil que es crear un generador de procedimientos. Queremos pensar en nuestros generadores como el contenido habitual del juego, para imaginar cómo el jugador supera un cierto nivel y lo disfruta. Pero como diseñadores de generación, debemos pensar en todo el espacio de generación, y no solo en un solo ejemplo. ¿Qué tan grande es el espacio? ¿Cuán rico es en sorpresas? ¿Con qué frecuencia crea algo aburrido o malo? ¿Podemos detectar y filtrar estos casos, o necesitamos buscar una solución? Estos son solo algunos de los problemas que debe tener en cuenta al crear algo para la generación.


Para resumir


Hoy aprendimos sobre los siguientes conceptos:

Espacio de generación


El espacio de generación del generador de contenido procesal (por ejemplo, el generador mundial de Minecraft) es el conjunto de todos los resultados que puede generar. Si cambiamos el algoritmo o establecemos un valor diferente para la variable, el espacio de generación cambiará.

Espacio de oportunidad


El espacio de posibilidades para un cierto tipo de contenido (por ejemplo, el mundo de Minecraft) es el conjunto de todos los ejemplos de dicho contenido que podemos presentar o describir. Por lo general, pero no siempre, es mucho más grande que el espacio de generación de un generador de procedimientos.

Más no siempre es mejor


Un generador con un gran espacio de generación generalmente tiene más contenido bueno, más contenido inesperado y contenido más diverso. Pero generalmente tiene más contenido basura, contenido más aburrido y más contenido inapropiado.

Un generador con menos espacio de generación es más fácil de controlar, más fácil de probar y más fácil de entender. Pero esto puede hacerlo más predecible y menos sorprendente.

¡Encontrar formas de equilibrar las fortalezas y debilidades de estos dos opuestos es el arte de crear software para la generación!

Lectura adicional y gracias


¡Esto concluye mi tutorial! Gracias por leer

Entre los materiales interesantes sobre el tema que hemos examinado, recomiendo lo siguiente:

Source: https://habr.com/ru/post/439968/


All Articles