Joguinho de forca dinâmico em Python – Como foi o processo?

Como você já deve saber, estou cursando Tecnologia em Análise e Desenvolvimento de Sistemas lá na Anhanguera, onde comecei ano passado quando passei pelo ProUni.

Sempre acontece de, em uma aula outra, quando está bem chato, alguém pegar um caderno e o nosso grupo começar a jogar algo (sim, eu sei, isso não é muito produtivo e nem muito inteligente, mas enfim…) e o nosso joguinho favorito acaba sendo a boa e velha forca (pois é, me julgue xD).

Acontece que, em alguma conversa, alguém do grupo começou com a idéia criar a forca para jogar enquanto estávamos em laboratório, pra não ficar pegando caderno nas aulas de código hehehe

joguinho-forca-cli-python-01

O pessoal ficou de fazer o programa com banco de dados, escrito em alguma coisa como javascript ou outra linguagem, tudo bonitinho… E eu fiquei com esse negócio na cabeça. A idéia meio que foi se formulando e, como eu estou tirando esses dias para estudar Python, resolvi fazer aqui um protótipo.

Eu até pensei em fazer a coisa toda com modelagem de negócio, classes e tudo bonitinho, como manda o figurino, mas eu estava mesmo era com vontade de ver a coisa na tela rodando, e Python é extremamente excelente para este tipo de coisa então a única coisa que eu me ative foram os requisitos da minha aplicação.

Então defini os requisitos do protótipo da seguinte forma:

  • Os requisitos básicos de uma forca: um nome para descobrir, um input de usuário, uma quantidade erros x (no caso 5), o boneco sendo mostrado a cada erro e etc…
  • O jogo deveria sortear dinamicamente o assunto-tema e qual elemento iria pra forca
  • Os objetos/temas deveriam ser facilmente implementados pelos programadores do meu grupo
  • Cada vez que o jogador errasse uma letra, deveria exibir uma dica (é mais ou menos assim que a gente joga, isso dá umas cinco dicas por partida, no máximo)

Um outro requisito mental foi que eu queria usar as coisas mais nativas do Python que fosse possível, mesmo sabendo que a linguagem já tem muitas facilidades (as famosas “baterias inclusas“) eu tentei deixar o código meio cru. Tanto que nem me preocupei em usar classes no código, libraries ou coisas do gênero. Só organizei um pouco em módulos pra não ficar muito gigante e defini uma pasta “temas” (eu sei, não é um nome tão bom U.U), onde os programadores com conhecimento mínimo em Python podem colocar seus temas sem precisar mexer em muita coisa no código (na verdade, quase nada).

Certo, mas e como foi o processo disso?

Como a idéia já estava meio que “dançando” na minha mente, eu resolvi começar primeiro pelo que eu sabia que ia dar certo: imprimindo os bonecos na tela. Um if simples, com uns prints para cada situação, onde o bonequinho aparece até ser enforcado.

joguinho-forca-cli-python-02

Depois eu precisava resolver como que os “campos” (no caso, os tracinhos _) seriam exibidos, porque precisava ser a mesma quantidade que a palavra a ser advinhada. De começo fui testando tudo com arrays mas em algum momento achei melhor o próprio código transformar a string da resposta em um array dinamicamente, assim será uma preocupação a menos para quem for escrever algum tema.

Então eu precisava resolver uma forma de como as letras seriam substituídas pelas letras que eram digitadas… Tive que fazer algumas comparações entre um array e outro e ir atualizando o novo cada vez que o jogador acertar.

joguinho-forca-cli-python-03

Daí haviam alguns tratamentos de erro para considerar…  O que aconteceria se o usuário digitasse mais de uma letra? Poderia digitar números? Poderia deixar vazio? Poderia apenas dar enter? E tinha se fosse em letra minúscula? E essas coisas do gênero…

Agora eu precisava resolver a parte das dicas… De certa forma, as dicas fazem parte da palavra que deve ser advinhada, então para mim não fazia muito sentido que fosse algo separado. Dessa forma resolvi criar isso em um dicionário, que contém a palavra e as dicas.

Mais pra frente acabei percebendo que era mais vantagem ainda criar um array (lista) para guardar as dicas. Eu ia fazer tudo em dicionário mas eu queria que essas dicas fossem excluídas conforme elas fossem usadas… Então achei mais facil embaralhar essa lista antes de ser acessada, pegar sempre o array[0] da lista, usar e apagar depois, então acessar a próxima pelo array[0] novamente, usar e apagar e assim por diante. O Python tem essa coisa super-legal de rearranjar os itens de uma lista quando um dos índices do array é excluído então resolvi me aproveitar disso =]

joguinho-forca-cli-python-04

Tudo estava funcionando bem até aqui. Mas eu ainda tinha que resolver a parte dos dicionários serem buscados dinamicamente. Minha idéia é que o programador escreva um arquivinho com um padrão, jogue na pasta “temas” e configure esse arquivo no “controlador_de_temas.py” (que pega o tema randomicamente da pasta), então a nossa “maquina_randomizadora.py” (é, eu sei, esses nomes que eu crio… xD) trata de cuidar do resto, que é buscar um dos dicionários do tema de forma randômica, embaralhar as dicas, criar uma cópia disso e mandar pro jogo.

O restante depois foi só separar o que eu chamei de “firulas” (cabeçalho, mensagem de winner, gameOver e etc) em um arquivo pra ficar separadinho. Eu pensei em chamar de alguma coisa como UI ou algo do gênero, mas é tudo linha de comando, tem nada de UI ali não U.U

E como cria um tema?

Se você já está familiarizado com alguma coisa de código, vai ver que é mole-mole. É só criar um arquivo “nome_do_seu_tema.py” (sim, coloque underline ao invés de, o Python gosta mais disso =]) na pasta “temas” com a seguinte estrutura:

O nome do tema, no caso, o assunto para guiar o jogador.

 

nomeDoTema = 'Nomes de Bandas'

Criar os dicionários com a palavra-chave e as dicas. Quantos achar que deve. Cada dicionário tem esse formato:

escolha1 = {
     'resposta': 'Alguma palavra resposta',
     'dicas' : [
         'dica 1',
         'dica 2',
         'dica 2',
         'dica 4',
         'dica 5',
     ]
}

E no fim do arquivo referenciar esses dicionários no nosso array “sources“.


sources = [
 escolha1, escolha2, escolha3, escolha4... etc etc
]

Então, no arquivo de configuração “controlador_de_temas.py” adicionar as configurações dos temas.

    from temas import nome_do_seu_tema

* nome_do_seu_tema sem o .py no final

E incluir ele no arraylistaTemas“.


listaTemas = [
    personagem_quadrinhos,
    nomes_bandas,
    nome_do_seu_tema
]

E é isso =]

joguinho-forca-cli-python-05

Ah sim, o arquivo que deve ser executado pro joguinho rodar é o forca.py. Na linha de comando (com o python instalado): python forca.py

*Como eu disse, é pra quem tem um conhecimento mínimo de Python, então isso era meio óbvio 😉

Conclusões

Eu sei que muita gente vai olhar algumas partes do código e torcer o nariz mas eu não estava muito preocupado com coisas como performace ou em clousures ou mesmo com variáveis que não poderiam ser globais e etc. Eu estava apenas prototipando uma idéia e essa é uma das coisas que eu gosto muito no Python: é uma linguagem que, depois de aprendida, te dá total liberdade pra isso. Python dá total liberdade para estruturar o código de uma forma que condiz com sua forma de pensar.

Pra se ter uma idéia. Eu demorei umas 2 horas de código bruto (sem contar o tempo que parei consultando documentação e etc) para prototipar isso. Contando o processo todo (e os cafézinhos), demorou pouco menos de uma tarde… E o principal: foi um processo extremamente divertido.

É claro que um desenvolvedor mais experiente poderia fazer isso em bem menos tempo. Nada impede, por exemplo, que o nosso controlador_de_temas.py seja reescrito de uma forma a buscar os temas de um banco de dados ou algo assim. Mas eu queria mesmo era desburocratizar e simplificar essa parte. Um arquivo de texto, algumas configurações e só.

É um pouco óbvio que, com o tempo e a quantidade de arquivos na pasta “temas“, o sisteminha irá ficar inchado e pesado… Tem até vários erros que eu poderia tratar, como um fato que acabei de pensar agora, se não colocar a variável “nomeDoTema” vai quebrar alguma coisa. Mas pra mim está bom por hora, já atende meus objetivos de estudo.

Além do mais, o código está inteiramente gratuito no GitHub para qualquer um visualizar, estudar e mexer o quanto quiser. Nem me dei ao trabalho de compilar um binário justamente por causa disso. A idéia é manter aberto mesmo.

Não sei se este código pode ajudar em algo. Pelo menos pode servir para você dar risada desse tipo de bobeira por um tempo. Então, se você quiser usar, modificar, distribuir ou algo assim fique à vontade. =]