Curso teórico-práctico sobre Inteligencia Artificial para Videojuegos (IAV) basado en el modelo de propone Ian Millington en su libro, impartido en la Universidad Complutense de Madrid.
2. ● La inteligencia tiene algo de “sorpresa”, de
producir algo nuevo (creatividad)... y no se
es creativo sin un mínimo de inteligencia
Generación procedimental de contenido 2
Motivación
“Las máquinas me sorprenden con mucha frecuencia” - Alan M. Turing
3. ● Resolver problemas
difíciles supone
enfrentar problemas
no conocidos de
antemano
● La generación procedimental de contenido
ofrece contenido complejo y nuevo,
desconocido… abordarlo como NPC es
difícil, y por tanto ¡ahí sí se requiere IA!
Generación procedimental de contenido 3
Motivación
PROCEDURAL CONTENT GENERATION (ProcGen / PCG)
4. ● Hablamos de IA para videojuegos bajo el
paradigma Generador, además de un
sistema que ayuda en el proceso de diseño
y desarrollo de videojuegos
○ Típicamente más complejo que un generador de
texturas (ayuda para el artista), y más simple que
un director automático (¡sustituto del diseñador!)
Generación procedimental de contenido 4
Motivación
5. ● Tiene ventajas obvias como la cantidad y
variedad de contenido, el ahorro en
esfuerzo de desarrollo, incluso en espacio…
○ En la demoscene hay proyectos que generan todo su
contenido, incluso juegos
Generación procedimental de contenido 5
Motivación
https://files.scene.org/view/demos/groups/farb-rausch/kkrieger-beta.zip
6. ● La generación procedimental de contenido
tampoco es algo nuevo
● En los años 80 hubo juegos que la usaban
como forma de “comprimir” el contenido
○ Ej. Exile, un sistema de cuevas subterráneas
○ Ej. Elite, una galaxia llena de estrellas (influyó en
Elite: Dangerous, Spore y No Man’s Sky)
Generación procedimental de contenido 6
Hitos históricos
7. ● Rogue (1980) es el paradigma del género de
mazmorras autogeneradas y muerte
permanente: los rogue-likes (o rogue-lites
como The Binding of Isaac, Spelunky…)
○ También en Diablo y Bloodborne, siendo actuales,
se generan mazmorras de manera procedimental
● Entonces ya había competiciones a juegos
entre alumnos, en universidades como CMU
○ Rog-O-Matic (1981) fue un
primer bot creado por ellos para
ganar en el juego incluso a
jugadores humanos Generación procedimental de contenido 7
Hitos históricos
8. ● Más adelante se popularizó la
generación de terrenos y de
vegetación (en tiempo de
desarrollo) que hoy usa casi
cualquier videojuego o IDE 3D
● En Civilization y
secuelas, los mapas
multijugador también
se pueden generar
procedimentalmente
Generación procedimental de contenido 8
Hitos históricos
9. ● Antes de hablar de ProcGen…
¡vamos a meternos en este asunto!
Generación procedimental de contenido 9
Pseudocódigo
10. ● En el libro de Millington se presenta
1. El problema que se quiere resolver
2. La técnica propuesta como solución
(descrita en lenguaje natural o con diagramas)
3. Generalmente, un algoritmo en pseudocódigo
4. La representación de la información utilizada para
el mundo del juego o para el interior del algoritmo
(descrita en lenguaje natural o en pseudocódigo)
5. Consejos para la implementación de todo ello
6. Análisis del rendimiento (velocidad de ejecución,
espacio en memoria, escalabilidad) en Notación O()
7. Puntos fuertes y débiles de esta técnica (y a veces
también variantes del algoritmo)
Generación procedimental de contenido 10
Pseudocódigo
11. ● Millington propone un pseudocódigo simple
y breve, muy similar al lenguaje Python
○ Tanto para algoritmos como para representaciones
○ Se asume que hay estructuras de datos sofisticadas
disponibles (lista, tabla, mapa, cola de prioridad…)
● Recuerda que la eficiencia siempre
depende a la vez del algoritmo y la
representación de la información escogidos
Generación procedimental de contenido 11
Pseudocódigo
12. ● Se seguirán estas convenciones de código
○ Líneas numeradas y estructura de bloques reflejada
con el propio sangrado y también con dos puntos (:)
○ Comentarios de línea (#)
○ Palabras reservadas function, return, class, new,
extends (herencia)
○ El punto (.) para llamar a los métodos (aquí
llamados function) de una clase
Generación procedimental de contenido 12
Pseudocódigo
13. ○ Variables miembro accesibles pero locales a su
definición, pudiendo inicializarse y a menudo
obviando métodos getters y setters
○ Parámetros entre paréntesis () y entre comas (,).
○ Tipos básicos (bool, int, long, float…) tras el
nombre de la variable con dos puntos (numero:int),
salvo el tipo de retorno que se indica con (->float)
… aunque pueden sobreentenderse
○ Booleanos true, false y también and, or y not
○ Asignación (=), equivalencia (==), y otros
operadores útiles como (+=) ó (*=)
Generación procedimental de contenido 13
Pseudocódigo
14. ○ Bucles while y for a in b, donde b puede ser rango
○ Rangos crecientes tipo 0..5 (o decrecientes como
5..0) donde NO está incluido el valor más alto
○ Rangos abiertos tipo 0.. donde se omite un extremo
○ Los arrays empiezan en cero, se declaran con
corchetes (array[]), dan elementos usando el índice
(array[index]) y subarrays con el rango (array[2..5])
○ Los arrays se comportan como listas (podemos
añadir y quitar elementos donde queramos)
Generación procedimental de contenido 14
Pseudocódigo
15. ● Ej. Algoritmo simple para encontrar el valor
más grande de un array no ordenado
Generación procedimental de contenido 15
Pseudocódigo
16. ● En C# y en Unity Visual Scripting
Generación procedimental de contenido 16
Código
17. ● Debemos elegir adecuadamente el modo en
que pasamos información a un algoritmo
○ A menudo hay que realizar conversiones de un tipo
de representación a otra, teniendo cuidado de no
perder información o perder sólo detalles inútiles
○ Generalmente sólo nos interesará la interfaz de la
representación, y no entraremos en la estructura
de datos concreta con la que implementarla
Generación procedimental de contenido 17
Pseudocódigo
18. ● En juegos como Minecraft se parte de una
única semilla (número “aleatorio”)
Generación procedimental de contenido 18
Generación de mundos
19. ● Son muy utilizados y los hay de tres tipos
○ Aleatorios de verdad (¡haría falta HW especial que
lea ruido térmico o algún otro fenómeno físico!)
○ Criptográficos, que son impredecibles e irrepetibles
○ Pseudoaleatorios “habituales”, que para una misma
semilla siguen siempre una misma secuencia
■ A veces es posible averiguar la semilla
analizando partes de dicha secuencia, incluso...
■ Existen algoritmos muy populares (Ej. Mersenne
Twister), pero muchos desarrolladores prefieren
programarse su propio algoritmo para que la
implementación sea fija
Generación procedimental de contenido 19
Números pseudoaleatorios
PSEUDORANDOM NUMBERS
20. ● Conviene crear todas las semillas de los
distintos subsistemas en cadena
■ Que el mundo entero dependa de 1 sóla semilla, sin partes
dependientes del tiempo o de otras variables del juego
Generación procedimental de contenido 20
Números pseudoaleatorios
21. ● La necesidad típica a la hora de generar
escenarios es poder generar su orografía
○ Es decir, el terreno y la vegetación
● Existen diversas técnicas, según el tipo de
escenario a generar
○ Mapas de altitud
○ Texturas de ruido
○ Algoritmo Doran-Parberry
para generación
“controlada” de terreno
○ Gramáticas
○ Generación cíclica
○ … Generación procedimental de contenido 21
Generación de escenarios
22. ● Los algoritmos que generan mapas de
alturas o texturas procedimentales que
incluyen ruido son muy útiles para esto
○ El ruido es lo que añade detalle realista a un mapa
de alturas cualquiera que tengamos…
Generación procedimental de contenido 22
Generación de terrenos
23. ● El más famoso es el Ruido de Perlin creado
para la película Tron (1982)
○ Con los años, Ken Perlin recibió un Óscar por ello
Generación procedimental de contenido 23
Generación de terrenos
24. ● Busca que la altura de una celda esté
relacionada con la de sus vecinas, como
ocurre en suelos, montañas o nubes reales
○ Se basa en una cuadrícula (Ej. 1024x1024 px. de
terreno, dividido en 256 cuadrados de 64x64 px.)
○ A los vértices se añaden vectores pseudoaleatorios
○ La altura de un punto X del terreno se obtendrá por
interpolación entre los vértices de su cuadrado
○ Puede normalizarse a un cierto rango (max, min)
○ El mejor ruido se genera combinando octavas
(cuadrículas de tamaños sucesivos: 1x1, 2x2, 4x4…)
Generación procedimental de contenido 24
Ruido de Perlin
25. ● Algoritmo de ruido de Perlin en 2D
○ Combina octavas a distintos pesos, prefijados en (0,1)
Generación procedimental de contenido 25
Ruido de Perlin
* _ representa una
variable anónima
*La primera octava será
de tamaño 1,
luego 2, 4, 8… tantas
como pesos me pasen;
aumentando el nivel de
detalle del ruido
*get devuelve la altura
del punto (x, y) del
terreno generado
26. ● Se crea la octava con un vector
pseudoaleatorio 2D en cada esquina
(los llamados “gradientes”)
Generación procedimental de contenido 26
Ruido de Perlin
27. ● Superponemos la cuadrícula y para cada
punto (x,y) del terreno se calcula su altura
○ Esta dependerá de los 4 gradientes que estén en las
coordenadas (ix, iy) de las esquinas de su celda
○ Por cada esquina se calcula el producto escalar del
gradiente por la distancia del punto a la esquina
Generación procedimental de contenido 27
Ruido de Perlin
28. ● Esto se repite para las 4 esquinas de la
celda (top left, top right, bottom left, bottom right) y se
interpolan esos 4 valores (con tres lerp)
para obtener la altura definitiva del punto
Generación procedimental de contenido 28
Ruido de Perlin
*lerp calcula la interpolación lineal
entre dos valores (normalmente con
respecto a un peso entre 0 y 1).
En este caso la fórmula rápida es
lerp(origen, destino, peso) =
origen + peso * (destino - origen)
Tiempo = O(n2
log n)
Espacio < O(n2
)
donde n es la extensión del terreno
29. ● ¿Cuántos elementos tiene el rango [3..0]?
A. 3
B. 4
C. 2
D. 0
● Desarrolla tu respuesta (en texto libre)
Generación procedimental de contenido 29
Participación
30. ● Millington, I.: Artificial Intelligence for
Games. CRC Press, 3rd Edition (2019)
○ Sistemas Lindenmayer
○ Gramáticas de formas
● Shaker, N., Togelius, J., Nelson, M.J.:
Procedural Content Generation in Games.
Springer (2016)
○ http://pcgbook.com
● Yannakakis, G., Togelius, J.: Artificial
Intelligence and Games. Springer (2018)
Generación procedimental de contenido 30
Más información
31. * Excepto el contenido multimedia de terceros autores
Federico Peinado (2019-2023)
www.federicopeinado.es
Críticas, dudas, sugerencias...