Neste tutorial, falarei sobre dois termos que utilizo para descrever geradores de procedimentos: um
espaço generativo e um
espaço de possibilidade . Definiremos esses dois termos e consideraremos exemplos interativos para entender a diferença entre os dois. Esses termos são realmente úteis para descrever um gerador de procedimentos e para entender a diferença entre dois geradores. Vamos começar!
Imagine um livro enorme que fornece uma captura de tela de cada mundo Minecraft individual. Cada captura de tela é marcada com uma
semente aleatória , um número único que você pode inserir no Minecraft e gerar este mundo. A primeira página mostra o mundo gerado a partir de semente = 0, a página seguinte mostra o mundo a partir de semente = 1 e assim por diante. Em geral, o gerador mundial de Minecraft contém 2
64 valores geradores aleatórios, e este é um número enorme: o jogo pode gerar 18 446 744 073 709 551 616 mundos. Cada vez que você clica em "Novo Mundo", um mundo é criado com base em uma dessas sementes. O número 2
64 é o tamanho
do espaço de geração do Minecraft, muito de tudo o que o jogo pode gerar.
Agora imagine que o mundo Minecraft consiste apenas de grama comum, se espalhando infinitamente em todas as direções. Abaixo dela, não há cavernas, nem pedras, nem árvores e colinas, nem animais. Apenas uma camada de telhas de grama. Além de ser muito chato, esse mundo nunca será gerado no Minecraft (a menos que seja usado modding). Podemos imaginar, podemos descrevê-lo, até abrir o Minecraft e criá-lo manualmente - mas o Minecraft não pode gerá-lo.
Como sabemos disso? Você pode provar isso de muitas maneiras diferentes, mas a maneira mais fácil de lembrar os biomas do Minecraft é em áreas como deserto ou selva espalhadas por todo o mundo. Em nosso exemplo com o mundo da grama, eles não são, portanto, sabemos que ele não pode ser criado com um gerador padrão.
O mundo da grama está no que chamamos de Minecraft Worlds
Opportunity Space - o conjunto de todos os mundos possíveis do Minecraft que podemos imaginar, imaginar ou descrever. Mas o mundo da grama
não está no
espaço de geração do Minecraft, porque não pode ser criado pelo gerador de procedimentos do jogo. Podemos imaginar o mundo Minecraft com uma réplica exata de Persépolis em escala, ou o mundo na forma de sua escultura em pedra sentado e lendo este artigo - todos esses são mundos
possíveis do Minecraft, mas não serão gerados pelo jogo.
O diagrama mostrado acima nos dá uma idéia de como tudo se parece. Tudo o que está no espaço de geração do Minecraft também deve estar no seu espaço de possibilidades, porque se o Minecraft pode gerar algo, deve ser possível criá-lo no Minecraft! Mas nem todo o espaço de possibilidades está no espaço de geração, incluindo o nosso exemplo com um mundo que consiste em grama. Mas a escala não é respeitada neste esquema. De fato, o espaço de possibilidades do Minecraft é muito,
muito maior que o espaço de geração.
Para entender como é grande, vamos calcular o tamanho de um único mundo Minecraft. Volume é a largura multiplicada pela altura, multiplicada pela profundidade. Por padrão, os mundos do Minecraft têm 256 blocos de altura e começam a se dividir em aproximadamente 30.000.000 de blocos em todas as direções desde o ponto de partida, ou seja, o volume aproximado do mundo é:
256 x 60 000 000 x 60 000 000 = 921 600 000 000 000 000
Cada um desses blocos pode ser qualquer elemento: pedra, grama, água, ar. Para nossa avaliação, seremos generosos e usaremos apenas "blocos do mundo", que, de acordo com o wiki do Minecraft, são
64 tipos . Isso significa que todos os blocos no mundo Minecraft têm 64 estados possíveis. A fórmula para calcular o número de mundos possíveis é igual ao número de opções de estado para cada bloco elevado à potência do número de blocos:
64 921 600 000 000 000 000 Minecraft
Esse número é tão grande que não consegui encontrar uma calculadora na Internet que pudesse calculá-lo.
Para aprofundar ainda mais os espaços de geração e possibilidades, precisamos de um exemplo que possamos colocar melhor em nossas cabeças. Portanto, no restante do tutorial, veremos os níveis de um jogo de plataforma 2D para jogos como
Super Mario Bros. ou
Spelunky . Veremos vários geradores de nível para plataformas 2D. No artigo original, eles são todos interativos, para que você possa gerar seus próprios níveis. No processo de estudá-los, faremos perguntas sobre o espaço de geração deles.
Todos os exemplos estão disponíveis no nosso GitHub como um esboço de código aberto escrito em Processing .
No processo de estudo, farei perguntas em negrito, por exemplo:
qual é o tamanho do espaço de oportunidades para esses níveis de plataforma? Você pode ignorá-los com segurança se quiser ler o artigo e brincar com exemplos. Às vezes, também adiciono dicas para ajudar a responder perguntas, por exemplo:
Dica: os níveis têm uma largura de 40 peças e uma altura de 10 peças, e cada peça pode ser um de três elementos: um espaço vazio, um terreno ou um bloco de bônus.Você pode fazer uma pausa no prompt e não rolar a página se não quiser ler a resposta final. Então, vamos dar uma olhada no nosso primeiro gerador.
Algoritmo 1: aleatoriedade
Nosso gerador de primeiro nível é muito simples - é completamente aleatório. Cada cartão tem um bloco inicial esquerdo e um bloco direito de saída. Todos os outros blocos de mapa têm 33% de chance de ficarem vazios, 33% de estarem ocupados e 33% de serem um bloco de bônus.
Você provavelmente notou que este não é um gerador de nível muito bom. De fato, a maioria desses níveis é impossível de jogar, sem mencionar o interesse deles. Gere mais alguns níveis e pense na pergunta:
qual o tamanho do espaço de geração de um gerador em comparação com o espaço de possibilidades?Dica: você pode chegar a um nível que esteja no espaço de possibilidades, mas não no espaço de geração? Você pode criar um nível que este gerador não possa criar?A resposta correta é que o espaço de geração deste gerador é o
mesmo que o espaço de possibilidades. Qualquer peça no mapa pode ter qualquer valor; portanto, qualquer nível que possamos imaginar está no espaço de geração. Os níveis mais fascinantes e mais interessantes estão neste espaço de geração, até o mapa no qual SUPER MARIO É INCRÍVEL é escrito em blocos de bônus. Infelizmente, o espaço de geração é tão grande que é extremamente improvável encontrar um bom nível. Como você pode ver, clicando no gerador, a maioria dos níveis é apenas lixo.
Algoritmo 2: desenhando formas aleatórias
Nosso próximo algoritmo é um pouco mais complicado e cria níveis mais parecidos com os que você pode aplicar no jogo. A partir de um nível vazio, ele seleciona um ponto aleatório em algum lugar e, em seguida, desenha uma linha ou quadrado de blocos de bônus ou terra. Ele realiza essa operação 20 vezes, criando várias formas desenhadas aleatoriamente no nível. Como antes, você pode clicar no exemplo do artigo original para iniciar o algoritmo novamente e gerar um novo nível.
Isso já está começando a se parecer com um nível para o jogo de plataformas, certo? Ao gerar níveis, imagine mentalmente como você os joga (seja generoso, se necessário - adicione a capacidade de pular duas vezes, se necessário, ou a capacidade de pular fora do teto do mapa).
Quantos níveis precisam ser gerados antes de você encontrar pelo menos um pelo qual possa passar?Não se esforce para obter precisão absoluta em suas orientações mentais, basta fazer uma estimativa aproximada.
Quando faço esse exercício com o público, geralmente são necessárias 10 tentativas para encontrar o nível, em média. Quanto você precisou? Lembre-se deste número e agora observe a variação do mesmo gerador mostrado abaixo. O gerador é o mesmo que acabamos de ver, mas agora ele desenha no nível de não 20, mas 10 números. Agora conte novamente:
quantos níveis você precisa gerar antes de encontrar o que você pode passar?Provavelmente você levou menos tempo para encontrar um nível jogável. Vamos fazer uma pausa por um minuto e pensar nas diferenças entre os dois geradores, que são quase idênticos, exceto por uma pequena diferença nos parâmetros.
Qual gerador possui um espaço de geração maior - um gerador com 20 dígitos ou 10?Dica: pense no nível criado por um gerador com 10 figuras - um gerador com 20 figuras pode criá-lo? E então pense no exemplo inverso.A resposta correta é que um gerador com 20 algarismos possui um espaço de geração maior; de fato, contém todo o espaço de geração do gerador com 10 figuras. Para mostrar isso, imagine qualquer nível de um gerador com 10 figuras. Nosso gerador com 20 figuras pode criá-lo renderizando acidentalmente as mesmas dez figuras e, em seguida, desenhando-as acidentalmente uma segunda vez uma sobre a outra. No entanto, nenhum nível com vinte figuras separadas pode ser desenhado usando um gerador com 10 figuras.
Isso significa que o gerador com 20 dígitos tem mais níveis, incluindo níveis interessantes. Mas vale lembrar que era muito mais fácil encontrar um nível jogável com um gerador com 10 algarismos.
Se você tivesse que escolher um gerador para o seu videogame, qual deles você usaria? Não há respostas corretas, mas essa é uma decisão muito importante, que geralmente precisa ser feita ao trabalhar com geradores de procedimentos. Um gerador pode gerar mais variabilidade e tem mais surpresas, o outro é mais confiável e menos estressante para o jogador.
Algoritmo 3: Fragmentos de Nível
Este algoritmo é baseado no gerador de nível usado no Spelunky; Você pode ler mais sobre isso
aqui . O gerador de níveis seleciona aleatoriamente um fragmento de um nível criado por uma pessoa (eu) e o insere em um nível. Em seguida, ele seleciona outro fragmento aleatório do nível e o insere lado a lado, e assim por diante, até que o nível seja concluído. Aqui está o gerador, o fundo é escurecido para que as bordas dos fragmentos fiquem claramente visíveis:
Quanto tempo agora é necessário para gerar um nível jogável? Você verá que quase todos os níveis são jogáveis. Sabemos exatamente o que há em cada fragmento, ou seja, podemos garantir que haverá objetos interessantes no nível em que você possa pular e obstáculos que você precisa evitar. Ao mesmo tempo, é mais dinâmico que o nível estático - não sabemos quais fragmentos aparecerão nele e em que ordem. O algoritmo de Spelunky é ainda mais rico que isso, leva em consideração o movimento vertical e variações aleatórias são adicionadas a cada fragmento. Darius Casemi criou o incrível gerador de nível interativo Spelunky, que pode ser encontrado
aqui .
Tais geradores são um bom compromisso entre surpresas agradáveis e a capacidade de controle. Quando um gerador faz uma seleção de um catálogo de elementos e os conecta (às vezes de acordo com regras especiais, como em Spelunky), chamamos
de gerador baseado em gramática . A gramática nos permite decidir quais blocos de construção um gerador de procedimentos deve usar, mas menos rigoroso sobre como conectá-los. Mas esse controle e segurança têm um preço. Olhe para o gerador novamente e pense nos exemplos anteriores.
Quantas vezes esse gerador de nível nos surpreende?Inicialmente, o gerador é cheio de surpresas, porque encontramos cada fragmento pela primeira vez. Mas se você jogar mais, rapidamente começará a perceber onde um termina e outro fragmento começa. Mesmo se houver centenas de combinações de fragmentos neste gerador, em apenas alguns níveis, você começará a sentir como se tivesse visto todos eles. A simplicidade e a facilidade de entender a gramática dos fragmentos são ótimas para os desenvolvedores, mas podem ser uma desvantagem em termos de diversão para os jogadores.
Algoritmo 4: Design Humano
Como exemplo final, não consideraremos um algoritmo, mas um tipo muito diferente de processo criativo: o trabalho das pessoas no design de níveis. Clique no gerador no artigo original e você obterá um dos dois primeiros níveis de Super Mario Bros. (mais precisamente, o próprio começo).
Começando com absoluta coincidência, acabamos com esse, um dos exemplos mais famosos do design de plataformas 2D da história. Obviamente, este não é um gerador, mas, em certo sentido, esses níveis podem ser percebidos como geradores que criam apenas um nível de alta qualidade. O compromisso máximo entre controle e qualidade. Olhando para esse nível, pense em todos os geradores que examinamos hoje e pense na pergunta:
quais desses geradores contêm esses níveis famosos em seu espaço de geração? .
- Geração aleatória
- 20 formas de geração
- Geração de 10 formas
- Fragmentos de nível
Somente o primeiro gerador é capaz de criar esses níveis. Os geradores de formas poderiam criá-los se aumentássemos o número de formas possíveis para desenhar, mas também aumentaria significativamente o número de níveis ruins ou estranhos. Um gerador de fragmentos de nível poderia fazer isso se lhe dessemos um conjunto diferente de fragmentos, mas todas as outras combinações desses fragmentos seriam reproduzíveis?
Isso nos mostra o quão difícil é criar um gerador de procedimentos. Queremos pensar em nossos geradores como o conteúdo usual do jogo, imaginar como o jogador passa por um determinado nível e se diverte. Mas, como projetistas de geração, devemos pensar em todo o espaço da geração, e não apenas em um único exemplo. Quão grande é o espaço? Quão rico é em surpresas? Com que frequência ele cria algo chato ou ruim? Podemos detectar e filtrar esses casos ou precisamos procurar uma solução alternativa? Esses são apenas alguns dos problemas que você precisa considerar ao criar algo para geração.
Resumir
Hoje aprendemos sobre os seguintes conceitos:
Espaço de geração
O espaço de geração do gerador de conteúdo processual (por exemplo, o gerador mundial de Minecraft) é o conjunto de todos os resultados que ele pode gerar. Se alterarmos o algoritmo ou definirmos um valor diferente para a variável, o espaço de geração será alterado.
Espaço de oportunidade
O espaço de possibilidades para um determinado
tipo de conteúdo (por exemplo, o mundo Minecraft) é o conjunto de todos os exemplos desse conteúdo que podemos apresentar ou descrever. Geralmente, mas nem sempre, é muito maior que o espaço de geração de um gerador de procedimentos.
Mais nem sempre é melhor
Um gerador com um grande espaço de geração geralmente possui mais conteúdo bom, mais inesperado e mais diversificado. Mas geralmente ele tem mais conteúdo indesejado, conteúdo mais chato e mais inapropriado.
Um gerador com menos espaço de geração é mais fácil de controlar, mais fácil de testar e mais fácil de entender. Mas isso pode torná-lo mais previsível e menos surpreendente.
Encontrar maneiras de equilibrar os pontos fortes e fracos desses dois opostos é a arte de criar software para geração!
Leitura e agradecimentos adicionais
Isso conclui meu tutorial! Obrigado pela leitura.
Entre os materiais interessantes sobre o tópico que examinamos, recomendo o seguinte: