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.