04 março 2013

Pygame… start!

Para quem se interessou pelo pygame eu vou tentar trazer alguma luz sobre o caso e como utilizar os
recursos à medida que eu mesmo consiga absorver o conteúdo.

A princípio é necessário instalar a biblioteca do pygame. Acesse esse link e escolha o que se encaixa com o seu S.O. e versão do python. Para começar vamos olhar o exemplo abaixo:



O import pygame importa o pacote com todos os módulos do pygame instalados e a chamada "pygame.init()" inicializa cada um desses módulos. Isso deve ser feito sempre, claro. Provavelmente você encontrará um pacote sendo inicializado junto, o sys.


A inicialização do módulo sys vai servir primeiramente para quando for executado o comando quit, mais a frente ficará mais claro.

Agora vamos para uma janela:


A primeira linha serve para ser colocado o tamanho da janela, height - altura, width - largura. O que aparece na última linha display.set_mode() é uma função que irá pegar os valores informados em size. Esses valores podem ser indicados diretamente na função como no exemplo abaixo:


Sendo exatamente com dois parênteses como mostrado e só com um quando se usa a variável size. Estou incerto de chamar size de variável ou de atributo, mas como o nome size não se encontra dentro de uma class vou considerar uma variável até segunda ordem.

Usando um pouco de dedução o speed serve para definir a velocidade de movimentação dentro das coordenadas x e y. Nesse caso ele, o objeto escolhido sofrerá uma mudança total de um movimento em diagonal pra em linha reta se simplesmente trocarmos um dos números - 2 para 0 por exemplo.

Na linha que encontramos black temos três valores que são o Red, Green, Blue. Essa variável será utilizada mais adiante.

Agora vemos uma parte interessante que lê uma imagem que deverá inicialmente estar dentro da mesma pasta onde será salvo o arquivo .py. Se salvar com outro nome basta trocar o ball.bmp por ele.


O image.load() é a função que carregará a imagem e o get_rect() é onde terá a coordenada do retângulo. Nesse caso imagino que o padrão está sendo determinado ao não ser informado nada.

Agora na parte final desse código temos um loop while. Nessa parte do while vamos encontrar a função quit que mencionei anteriormente. É ai, nesse primeiro if, que se a janela for fechada o programa será terminado. Acredito que isso se refira a limpar da memória tudo que foi carregado para gerar a janela. Vou confirmar isso posteriormente.


Após o ballrect podemos ver como foi feito para que a imagem ao tocar nas laterais venha a ter um movimento oposto ao inicial.

Mais abaixo encontramos o .fill que serve para determinar a cor de fundo da tela, é onde utilizamos o black determinado no inicio. As outras funções eu ainda não compreendi com clareza, por isso vou deixar pra depois.

Esse código é o mesmo que se encontra na wiki do pygame. Basta clicar nesse link para acessar a página, mas o código completo pode ser visto clicando no 'continue lendo', abaixo. Se não estiver vendo o continue lendo provavelmente você já vai estar vendo o código completo. Ao testar você verá uma bola ou imagem se movimentar dentro da janela sempre que o mouse se mover. Ainda estou atrás de descobrir o por que da dependência do mouse. O que ou qual função faz isso nesse código. Qualquer dúvida adicione uma resposta abaixo. Ou se souber algo sobre isso que mencionei agora ficarei grato em saber.

25 janeiro 2013

Python 3?

Galera do mal! Eu venho aqui em busca de opiniões acerca deste ponto. A princípio esclarecerei meus pensamentos iniciais chegando ao que penso hoje e talvez fique mais fácil entender meus intentos. (sim eu me direciono à todos do curso BCC). Logo quando cheguei pensei que aprenderia C++, na verdade eu ansiava por isso. Não por nada fantástico, mas por simplesmente ter começado a estudar por C++. Foi quado o Python surgiu na história e não me chateei por simplesmente descobrir que as duas linguagens meio que se "entrelaçam". Assim que as aulas começaram eu já baixei a última versão do Python no momento 3.3. Com isso naturalmente fui forçado a aprender do modo que esta se comporta, mas nem por isso sem deixar de lado as outras versões da linguagem até por que 70% dos tutoriais e pdfs exemplificam normalmente pela versão 2.7.


Pelo que compreendi disso, desta situação, o fato de que é bom passar um tempo pra se utilizar outras versões até para que possíveis bugs sejam sanados. Ao que me consta isso ocorreu por volta de 2010-11 (estou certo?), a atualização. Por esse ponto vi muitos blogs se interessando em disseminar o Python 3, encarar por assim dizer agora. Até por que a linguagem não desenvolveu um modo de "recalxutar" programas antigos. Quero dizer, não tem outro método a não ser ir linha a linha corrigindo a problemática.
Pois bem... ai se encontra minha opinião. Mais cedo ou mais tarde já estaremos na versão 4.x (será?!) e bugs atuais corrigidos, mas meio que receosos ainda estaremos no 2.7 (2.x), migrando somente neste momento pra 3.x. Isso faz sentido de fato? As mudanças são poucas ao que vejo principalmente para iniciantes, mudanças mais profundas na linguagem eu mesmo não tenho como perceber já que é meu primeiro contato. Nem por isso deixo de saber os comportamentos antigos das coisas que estudo agora, até por que como falei é inevitável. 
Meu  posicionamento nesse caso é simples. Não vejo sentido em permanecermos na 2.7, por mais que encontremos nesse meio tempo incongruências no material atual que temos disponíveis. Isso serve até mesmo para o aprendizado, nos forçando a correr atrás de abarcar o novo diante de tanta informação ultrapassada. Isso não é por praticidade ou algo do tipo, muito pelo contrário. Vejo que vamos ter no futuro um trabalho duplo por menor que seja, pra nos atualizarmos. Podemos simplesmente quando em teste ou exercícios especificar que em linguagens anteriores o que funcionaria seria "assim e assado", em comentários e algo do tipo. Ou simplesmente encarando que a linguagem muda mesmo, é a vida.
O que vocês dizem?

24 janeiro 2013

Python 2.x versus 3.x

Procurando mais informações sobre o python e como uso o 3.3 acaba que mais cedo ou mais tarde me deparo com alterações implementadas nessas últimas versões. A primeira que vou explorar e trazer aqui será sobre o comando input().

Para quem já usa o python 3.3 já deve ter notado que o raw_input já era. E o motivo disso é muito simples:

Primeiro explicando o raw_input(): este como a maioria já sabe serve para receber dados e transforma tais dados em strings. Sejam números ou qualquer informação que seja. Já o input('') tem uma capacidade superior que é identificar o valor que está sendo colocado, mas também ele tem a capacidade de aceitar códigos, como o terminal. Basicamente, no python 2.7 se você usar input(''), você estará abrindo uma porta para alguém intervir no código. Isso pode ser bom em termos se necessário.



Já no Python 3.x a coisa ficou diferente, parcialmente. A princípio o raw_input() mudou para input('') somente, mas agora os parênteses são obrigatórios. Este é um raw_input inteligente, fazendo o que o raw não fazia que é identificar o tipo de entrada e portanto gerar tipos distintos ao invés de criar somente strings. Até ai tudo bem. Agora o antigo input(), que dava acesso à intervenções no código se tornou eval(). Basicamente com a mesma função, mas tecnicamente mais restrito, já que o input() já serve pra maioria das coisas com mais eficiência. No entanto descobri por meio deste eval que dá pra criar entradas múltiplas para variáveis diferentes.



O problema consiste somente no fato de que por meio do eval se pode intervir no código com códigos. Basicamente o processo de entrada eval vai tentar usar os dados, se estes significarem algo pra linguagem de modo a fazer com que este código seja usado como se já fosse uma implementação. Podendo criar quebras e travamentos.

De qualquer modo acredito ser muito simples impedir tal ocorrência por meio do .replace. Ainda não testei devidamente, mas parece ser uma saída. Logo quando testar atualizo o post.

Uma das fontes que utilizei para fazer esse post fala que não há modo seguro com eval(), o que é uma pena. Link

21 janeiro 2013

Lista 3 Q10

Este é outro exercício do qual tive certa dificuldade, mais pelo caminho que escolhi pra fazer do que pela questão em si. Uma coisa curiosa são as variáveis "unidade" e "dezena" que tive que repetir para que funcionassem nas partes necessárias do programa. Como podem ver é basicamente pra colocar números por extenso.

Lista 3 Q9

na busca de resolver umas listas pra aula de IP essa foi uma questão que quase não consigo fazer. Ela tem uma condição .replace que basicamente substitui uma coisa por outra. Procure no código que ficará fácil entender como isso é feito. O resto são condições if, elif e else. Claro que por ser iniciante está sem muito tratamento e está longe ainda de ficar estético.