O primeiro jogo do Free Python Games a ser estudado será o Paint, que na realidade não é um jogo, mas um editor de figuras tal qual o desenvolvido nas seções anteriores. Com isso, a ambientação ao Free Python Games será facilitada. Antes mesmo de começar a estudar o código-fonte e começar a alterá-lo é importante que você execute o programa. Assim entenderá como funciona do ponto de vista do usuário e também terá a certeza que está de fato funcionando, e que os erros que surgirão ao longo das mudanças foram introduzidos por você e não erros que já vieram com o programa.
Ao iniciar o Paint
ele desenhará por padrão linhas. Clique em dois
pontos da tela e uma linha será desenhada entre eles. Para alternar
entre linha e quadrado, use as teclas l
e s
. Também é possível
mudar as cores: K
para preto, W
para branco, G
para verde, B
para azul e R
para vermelho.
"""Paint, for drawing shapes.
Exercises
1. Add a color.
2. Complete circle.
3. Complete rectangle.
4. Complete triangle.
5. Add width parameter.
"""
Os jogos presentes no Free Python Games foram projetos para experimentação e mudanças. Mais do que isso, já estão inclusos exercícios propostos no topo de cada arquivo com o código-fonte dos jogos.
from turtle import *
from freegames import vector
As primeiras linhas executáveis são as importações de módulos e funções.
Seja da biblioteca padrão, com turtle
neste caso, seja do módulo
freegames
. Como dito anteriormente, o Free Python Games também possui
uma biblioteca em si, a qual será detalhado futuramente.
Observe que foi utilizado um *
, no lugar de explicitar o que está sendo
do módulo. Essa importação curinga é uma má prática e deve ser evitada, pois
não fica claro quais os nomes estarão presentes no espaço de nomes, confundindo
tanto leitores quanto ferramentas de automação. Inclusive, essa má prática é
apontada pela PEP-8, um documento que descreve convenções para codificação
Python.
Aqui, um exercício adicional e que vai ajudar você a conhecer e
descobrir novas funções de turtle
é remover essa importação (apenas adicione
um #
no início da linha que a linha será convertida em um comentário), executar
o jogo e ir atualizando a importações conforme os erros forem aparecendo. Veja o
exemplo.
- Remover a importação
# from turtle import *
- Executar e observar o erro, semelhante a pilha de execução com o erro, e identificar o nome ausente
Traceback (most recent call last):
File ".../paint.py", line 80, in <module>
setup(420, 420, 370, 0)
NameError: name 'setup' is not defined
Neste caso, não foi localizado algo com o nome setup
. A rigor, você nem
precisa ir até a linha em que o erro ocorreu. Chegaremos lá depois.
- Adicionar o nome ausente na importação
from turtle import setup
- Repetir os passos 2 e 3 até que o programe rode com sucesso
Desafio Execute este algoritmo para todas os nomes importados de turtle
Uma das classes definidas pelo módulo freegames
é vector
. Estudaremos em detalhes mais adiante. Mas, por hora, o que precisamos entender é que facilita o
manuseio das coordenadas x
e y
dos pontos no sistema de coordenadas.
No editor que criamos, utilizamos tuplas para identificar um ponto:
>>> ponto = (10, 20)
>>> ponto[0]
10
>>> ponto[1]
20
Veja como fica com vector
:
>>> from freegames import vector
>>> ponto = vector(10, 20)
>>> ponto.x
10
>>> ponto.y
20
Observe que para além do nome ponto
, de fato é uma estrutura que possui os
atributos x
e y
, com uma semântica explícita. O que torna a leitura e
escrita mais claras e significativas.
Na sequência, teremos as definições de diversas funções, que serão chamadas
ao longo da execução do programa. Algumas funções virão completas e funcionais,
podendo haver algum exercício que precisará alterá-las, outras funções nada
farão. Contendo apenas a string de documentação, para que saibamos o que ele
faz (ou deverá fazer), e a palavra pass
(indicando que ela não faz nada, como
quem diz "passe direto").
Por fim, chegamos ao ponto de entrada do programa, que é onde de fato começará
a interação com o usuário. No caso de Paint
, temos o seguinte:
state = {'start': None, 'shape': line}
setup(420, 420, 370, 0)
onscreenclick(tap)
listen()
onkey(undo, 'u')
onkey(lambda: color('black'), 'K')
onkey(lambda: color('white'), 'W')
onkey(lambda: color('green'), 'G')
onkey(lambda: color('blue'), 'B')
onkey(lambda: color('red'), 'R')
onkey(lambda: store('shape', line), 'l')
onkey(lambda: store('shape', square), 's')
onkey(lambda: store('shape', circle), 'c')
onkey(lambda: store('shape', rectangle), 'r')
onkey(lambda: store('shape', triangle), 't')
done()
A primeira linha contém definição da variável responsável por manter o estado
do programa. Enquanto no editor que criamos utilizamos duas variáveis, aqui
está sendo utilizado apenas uma, state
. Mas é uma estrutura composta,
conhecida como dicionário, podendo armazenar diversos valores, que são
acessados por meio de chaves. No caso, as chaves são start
e shape
, e os
valores iniciais None
e line
, respectivamente.
A linha seguinte contém a chamada a uma nova função, setup
, que é utilizada
para definir dimensões e posicionamento da tela do programa.
A linha onscreenclick(tap)
nos indica que quando a tela for clicada, será
executada a função tap
.
Temos então a chamada à listen
, que faz com que turtle
fique escutando
as teclas que serão pressionadas, e que são definidas nas chamadas à onkey
que se seguem. Em Paint
, além de escolher entre figuras, também é possível
escolher entre cores.
Por fim, a última linha chama a função done()
, que é exatamente igual
mainloop()
que usamos no nosso editor.
É importante observar que no Free Python Games foi utilizado uma abordagem mais
de programação estruturada e menos de orientação a objetos. Por este motivo,
não temos a criação de um objeto turtle
(turtle = turtle.Turtle()
), como
fizemos em nosso editor. No lugar disso, as funções são importadas e chamadas
diretamente do módulo.
Desafio Resolva os exercícios propostos para Paint
.