Programação, Jogos e Jogos de programação

segunda-feira, 17 de fevereiro de 2014
Programação, Jogos e Jogos de programação


Desde que tenho acesso a computadores, estou programando alguma coisa. Me lembro de quando ainda cursava o ensino médio (é estou velho) que estava sempre escrevendo um cracker em assembly pra desbloquear algum progama pago ou um emulador de um processador qualquer (z80, 6502 etc) só por diversão…


E não demorou muito para eu ser apresentado um jogo que me permitia justamente isso: programar por diversão.  O jogo em questão é o ATRobots onde o “jogador” programava a IA de um robô em uma linguagem similar a assembly x86 e enviava seu robô -  representado na tela por um singelo triângulo num fundo preto - para combater outros robôs programados por outros jogadores.

Além deste existem similares voltados para outras linguagens como Robocode para JAVA, CRobots para C e C++Robots para C++, não tenho dúvidas de que haja pelo menos um par destes jogos por aí, para cada linguagem de programação. Ruby, python quem sabe até brainfuck - não me surpreenderia!



Uma abordagem mais amigável


TLE - Dentro da nave
Em meados de 2009 tive o prazer de auxiliar uns amigos Erick Lima, Thiago Martins no projeto de conclusão de curso onde se propunham a utilizar o videogame como forma de ensino de programação. O projeto se chamava TLE – CONTRA O TEMPO: A SALA DE AULA LEVADA AO MUNDO DOS GAMES. O jogador andava por um nave em 3D solucionando problemas técnicos através de pequenos algoritmos programados em uma linguagem simplificada chamada Portugol diretamente dentro do jogo e ao concluir, o jogo executava o interpretador da linguagem e comparava se a saída do algoritmo do jogador poderia ser aceita como correta ou não.


Os desafios neste jogo contém sempre o fator tempo, forçando o jogador a
TLE - Console de Programação dentro do jogo
solucionar o problema de maneira rápida ou enfrentar resultados catastróficos. No caso a esquerda, há uma quantidade limitada de oxigênio disponível para o jogador enquanto ele tenta escrever um algoritmo que quebre uma senha.
O projeto é simples mas bastante divertido e pode ser baixado aqui.
Apesar da simplicidade, este jogo quebrou alguns paradigmas se comparado aos outros jogos de programação. Neste o foco não é somente programação, também contém uma estória e uma narrativa justificando as ações do jogador. Além disso, o que considero mais importante, este jogo não requer que o jogador compile manualmente seus códigos nem que saiba uma linguagem de programação específica . Ok, eu entendo que o jogador precisa saber o tal “portugol” mas é algo muito mais próximo da linguagem humana do que C, java ou assembly.

Com isso, se por um lado perdemos um grupo específico de nerds frenéticos em seus teclados, ávidos por escrever linhas nas suas linguagens preferidas, por outro lado aproximamos o jogador menos técnico deste tipo de jogo. Na prática o jogo cumpre seu papel como ferramenta de ensino de programação.

Depois deste projeto fiquei realmente interessado em aproximar jogos de programação de jogadores não-programadores. Há cerca de 2 anos comecei meu próprio jogo de programação que chamei de Sentinel e fico feliz em mostrar as primeiras cenas deste projeto e comentar um pouco sobre a sua implementação nos parágrafos que se seguem.

 



Sentinel - Ambiente de programação Simplificado
Pequeno programa SENTINEL
Muitos projetos pela web permitem que pessoas leigas criem alguma lógica de programação e pequenos algorítmos de maneira intuitiva ou pouco complexa utilizando linguagens visuais.
O Google app inventor é um bom exemplo disso, permitindo que usuários conectem blocos de isntruções como quebra-cabeças.
Esta abordagem além de substituir completamente a digitação de código por parte do usuário, também impede erros sintáticos e semânticos que seriam inconvenientes de tratar durante a execução do jogo.
Depois de ter muito trabalho implementando um ambiente de programação visual, descobri o projeto Blokly que implementa este ambiente de forma geral, permitindo bastante customização.
O resultado desta programação é a Abstract Syntax Tree (AST)  representada em XML pronta para ser enviada ao interpretador.

Exemplo de AST para um pequeno trecho de código













Sentinel - Linguagem de programação
Como queria um ambiente 3d para o jogo e a capacidade de executar na WEB Unity3d foi uma escolha óbvia, entretanto ainda era um desafio executar lógicas de programação durante o gameplay. Procurei interpretadores de diversas linguagens de maneira que pudesse integrar com a Unity. Nada deu certo, ou pelo menos nada deu certo satisfatóriamente. Era necessário ter controle absoluto da interpretação do código e garantir que independente do frame rate o código de um robô rodaria igual em qualquer computador. Neste ponto ficou claro que seria necessário criar uma linguagem de programação do zero, ou pelo menos o interpretador.

Cada robô dentro da Unity3d tem associado a si uma thread com uma instância do interpretador pronto apto a executar a AST gerada pelo editor de blocos.
Cada robô roda sua própria instância do interpretador













Para que a AST esteja pronta para ser interpretada, basta serializar a representação XML para objeto na memória do interpretador e Voilà! Sem análise sintática ou léxica. Um graaaande atalho!

A linguagem sentinel implementa apenas 4 tipos de dados: Texto, Numero, Booleano e Listas (semelhante a arrays). Embora o editor só permita a conexão entre blocos do tipo correto, a linguagem pode converter nativamente  de qualquer tipo de dados para outro, tornando a linguagem bastante tolerante a erros básicos de programação como indexar um array com um a string ou indexar um array com um índice inexistente.

O Interpretador da linguagem existe de forma independente do resto do jogo, de modo que seria possível colocá-lo numa dll separada e utilizá-lo como um interpretador para propósitos gerais. O propósito deste post é na verdade apresentar o projeto como um todo, mostrando que o interpretador funciona e já é possível criar, programar e executar a lógica de combate dos robôs. Sendo um projeto de um interpretador embutido em uma engine de jogos, é evidente que existe bastante espaço pra falar da implementação e arquitetura do projeto o que pretendo sem dúvidas fazer em posts futuros.

Um comentário:

  1. Obrigado pela referência, um post muito bom.
    Unificar jogos a educação sem ser algo chato é um desafio, mas é um desafio muito satisfatório.

    Thiago Martins

    ResponderExcluir