TCC
Criação de um jogo com dificuldade dinâmica e aprendizagem por reforço.
Aluno: João Gabriel Basi Supervisor: Prof. Dr. Roberto Hirata Jr.
Introdução
Jogos no estilo player versus environment (PvE), em contraste com jogos no estilo player versus player (PvP), são jogos onde o jogador combate vários inimigos controlados por inteligências artificiais para cumprir os objetivos do jogo. Nesse estilo, é comum que os desenvolvedores modelem os inimigos como sendo agentes autônomos, pelo fato deles tomarem decisões sem a intervenção humana.
A criação e o balanceamento dos agentes ocupa boa parte do desenvolvimento de jogos PvE, já que boa parte da experiência de jogo é proporcionada por eles. Para que o jogo se torne interessante, é desejável que os agentes ofereçam desafios fáceis o suficiente para que o jogador não fique frustrado, e difíceis o suficiente para que ele não fique entediado, e também que haja desafios novos a cada fase.
Motivação
O desenvolvimento desses agentes pode ser uma tarefa difícil e trabalhosa se métodos tradicionais forem utilizados. É necessário considerar todas as situações de jogo possíveis e sintetizá-las em um algoritmo complexo. Como consequência muitas vezes, ou a dificuldade de jogo fica acima ou abaixo do esperado, ou o algoritmo acaba tomando decisões que não foram previstas na fase de desenvolvimento, fazendo com que o jogador perca a imersão no mundo do jogo.
Alguns autores citados no trabalho mostram através de experimentos com usuários que jogos com dificuldade dinâmica são agradáveis ao jogador, porém é muito difícil encontrar jogos no mercado que de fato utilizam tais algoritmos de adaptação.
Objetivos
Este trabalho tem como objetivo a criação de um protótipo de jogo PvE para computador que saiba adaptar sua dificuldade de acordo com a progressão e maestria do jogador, além de um sistema que facilite a criação de IAs para o jogo. Para isso o jogo contará com um sistema que identifica a proficiência do jogador e com agentes adversários que consigam aprender estratégias através de aprendizagem de máquina.
Como algoritmos de aprendizagem em geral requerem muito processamento, é necessário também adicionar a restrição que o processamento do jogo deve ocorrer rápido o suficiente para que a redução no número de quadros por segundo não seja perceptível, impactando minimamente a experiência do jogador.
Além disso, para que o jogo seja o mais simples e portátil possível ele não deve utilizar informações externas ao programa (como por exemplo os quadros da janela do jogo), dados de sensores físicos acoplados ao jogador ou ainda informações armazenadas na nuvem.
Documentos
Jogo
História
Em um mundo de fantasia existem pessoas que arriscam suas vidas explorando lugares desconhecidos, como florestas, cavernas e ruínas, tais pessoas são chamadas de aventureiros. Durante suas aventuras eles encontram os mais temíveis monstros e as mais ardilosas armadilhas, e também encontram os mais valiosos tesouros, esquecidos no tempo por civilizações antigas. Alguns aventureiros são famosos por toda a nação por serem corajosos e destemidos. O protagonista é um jovem que sonha em se tornar aventureiro, porém não tem nem habilidade nem dinheiro suficiente para isso.
Como jogar
Setas ou WASD movimentam o personagem, E interage com NPCs e objetos, ESPAÇO ataca, I abre a mochila e números de 1 à 4 usam itens da barra de uso rápido.
Atualmente o jogo só está disponível para linux. Baixe e jogue o executável mais recente.
Caso não seja possível executá-lo, tente uma das seguintes soluções:
- Mude a permissão do arquivo para executável utilizando o comando
chmod +x gameapp-linux.AppImage. - Extraia o conteúdo do executável utilizando o comando
./gameapp-linux.AppImage --appimage-extract, entre na pastasquashfs-rootgerada e execute o arquivoAppRun. - Consulte a página de solução de problemas do formato AppImage.
Capturas de tela




Comentários subjetivos
Sobre este trabalho
Desde o ensino médio sempre me interessei pelo processo de criação de jogos, tanto que esse foi o motivo principal de eu ter escolhido cursar ciência da computação. Já dentro da faculdade conheci o grupo de extensão USPGameDev, onde aprendi e ensinei muito sobre o assunto. Na metade do terceiro ano consegui um estágio na área, pelo qual me apaixonei e continuei estagiando até hoje (final do quarto ano). Dado minha tragetória não seria surpresa se meu TCC fosse um jogo, porém durante a faculdade outro assunto me cativou: aprendizagem de máquina.
O crescente avanço nas IAs para jogos pela OpenAI e pela DeepMind nos últimos anos me motivaram a juntar o útil ao agradável, contudo não me agradava muito o fato dessas IAs serem produzidas somente para explorar os limites das técnicas, e não para evoluir as técnicas já existentes para criação de IAs em jogos. Foi então que tive a ideia de testar por mim mesmo como é possível criar um jogo do zero levando em conta a existência de métodos de aprendizagem de máquina.
Desde quando aprendi o algoritmo Q-learning em MAC0425 eu pensava em utilizá-lo na criação de IAs para jogos, e vi em MAC0499 a oportunidade de testar essa ideia. Como desenvolvo jogos à quatro anos, tanto por lazer quanto profissionalmente, durante a matéria desenvolvi um jogo focado em explorar ao máximo a mecânica de aprendizagem por reforço e implementei métodos que ajudam a treinar essas IAs.
Como o projeto tangenciava vários outros temas (como experiência do usuário, adaptação de dificuldade, performance das IAs, máquinas de estado, etc.) foi um desafio fazer com que ele não fugisse do escopo e demandasse mais tempo do que o disponível. Para contornar esses problemas, desde o começo do projeto pensei em cada coisa que deveria ser implementada e as ordenei por prioridade, método que ajudou muito a priorizar features importantes e a estimar a duração do projeto como um todo. Várias das ideias que pensei não foram implementadas, como falado no último capítulo da monografia, portanto vou tentar continuar com o desenvolvimento desse jogo após a matéria.
Sobre o curso
No geral me surpreendi bastante com o curso, ele me deu a oportunidade de me desenvolver muito pessoalmente e profissionalmente. Um dos pontos positivos é que os professores do BCC são abertos às sugestões dos alunos, motivo pelo qual surgiram os grupos de extensão e pelo qual o currículo foi modificado em 2016. Por outro lado, seria interessante se alguma matéria mais avançada de desenvolvimento de sistemas (como MAC0332, MAC0413, MAC0467, MAC0470 ou MAC0472) fosse obrigatória, assim mais alunos teriam uma noção melhor do mercado de trabalho.
Por meio do USPGameDev pude expressar minha vontade de desenvolver jogos, aprendi com outras pessoas e adquiri contato de pessoas de fora da faculdade que trabalham na área, por isso sou muito grato à ele. Na minha opinião o curso vem fazendo um ótimo trabalho apoiando a existência dos grupos de extensão e reconhecendo que eles desempenham um papel importante na graduação.
Disciplinas que usei no projeto
- MAC0425 - Inteligência artificial: A disciplina me apresentou a aprendizagem por reforço e o algoritmo Q-learning, que foram essenciais na realização deste trabalho.
- MAC0460 - Introdução ao aprendizado de máquina: A disciplina me ajudou a entender melhor com funcionam métodos de aprendizagem. Em específico aprendi como funcionam redes neurais e como elas são treinadas, que também é parte essencial deste trabalho.
- MAE0515 - Introdução à teoria dos jogos: Para descrever a interação entre agentes (jogador vs. IA) foi necessário utilizar alguns conhecimentos sobre teoria da decisão, que aprendi em MAE0515.
- MAE0119 - Introdução à probabilidade e à estatística & MAE0221 - Probabilidade I: As duas matérias foram importantes para que eu conseguisse entender o funcionamento de todos os algoritmos mais complexos utilizados nesse trabalho (como Q-learning, redes neurais e CAP) e para que fosse possível elaborar algoritmos probabilísticos (como geração de grafos aleatórios).
- MAC0110 - Introdução à computação & MAC121 - Algoritmos e estrutura de dados I & MAC0323 - Algoritmos e estrutura de dados II: As três matérias foram fundamentais para a elaboração de todo o projeto. MAC0110 me ensinou a programar, MAC0121 me introduziu à estrutura de dados e MAC0323 me mostrou como lidar com herança de objetos e como organizar o código de forma que ele seja mais modular.
- MAE0228 - Noções de probabilidade e processos estocásticos: O comportamento de um agente autônomo é descrito como um processo de decisão de Markov. MAE0228 me introduziu à esse conceito e me ajudou a entender melhor seu funcionamento.
- MAT0112 - Vetores e geometria & MAT0122 - Álgebra linear I: Redes neurais e o algoritmo de retropropagação do erro são baseados em multiplicações de matriz e produto interno, a navegação no espaço de funções pela rede requer conhecimento de espaços vetoriais.
- MAT2453 - Cálculo diferencial e integral I & MAT2454 - Cálculo diferencial e integral II & MAT0236 - Funções diferenciáveis e séries: As três matérias foram fundamentais para que eu entedesse os algoritmos de redes neurais.
- FLC0474 - Língua portuguesa: A matéria ajudou a relembrar o conteúdo do ensino médio e ajudou na elaboração da monografia e da apresentação.
Matérias que podem ser úteis se o projeto continuar no futuro
- MAC0328 - Algoritmos em grafos: Como as aventuras são grafos, a matéria forneceu algoritmos que podem ser úteis na elaboração de aventuras mais complexas.
Outras matérias que poderiam ser úteis se tivessem sido cursadas
- MAC0346 - Programação para Jogos Digitais: Provavelmente o conhecimento que teria sido adquirido nessa matéria já foi adquirido por meio do USPGameDev e do estágio, porém acho a matéria importante para pessoas que querem ter uma noção de desenvolvimento de jogos como um todo, já que esse conhecimento pode demorar um pouco para ser adquirido na prática.
- MAC0322 - Engenharia de software: Poderia ter sido útil na organização do software como um todo, desde a elaboração das APIs das classes à como elas se relacionam entre si.
- MAC0426 - Sistemas de bancos de dados: Poderia ter sido útil na elaboração do sistema de persistência de dados do jogo.
