Introdução ao Desenvolvimento de Jogos em Python com PyGame

Page 1

Harrison Kinsley Will McGugan

Novatec


Original English language edition published by Apress, Copyright © 2015 by Apress, Inc.. Portugueselanguage edition for Brazil copyright © 2015 by Novatec Editora. All rights reserved. Edição original em Inglês publicada pela Apress, Copyright © 2015 by Apress, Inc. Edição em Português para o Brasil copyright © 2015 pela Novatec Editora. Todos os direitos reservados. © Novatec Editora Ltda. 2015. Todos os direitos reservados e protegidos pela Lei 9.610 de 19/02/1998. É proibida a reprodução desta obra, mesmo parcial, por qualquer processo, sem prévia autorização, por escrito, do autor e da Editora. Editor: Rubens Prates Assistente editorial: Priscila A. Yoshimatsu Tradução: Lúcia A. Kinoshita Revisão gramatical: Marta Almeida de Sá Editoração eletrônica: Carolina Kuwabata ISBN: 978-85-7522-452-6 PY20150826 Histórico de impressões: Setembro/2015

Primeira edição

Novatec Editora Ltda. Rua Luís Antônio dos Santos 110 02460-000 – São Paulo, SP – Brasil Tel.: +55 11 2959-6529 Email: novatec@novatec.com.br Site: www.novatec.com.br Twitter: twitter.com/novateceditora Facebook: facebook.com/novatec LinkedIn: linkedin.com/in/novatec


capítulo 1

Introdução ao Python

A linguagem de programação que usaremos para criar jogos é o Python, que recebeu esse nome porque o autor original da linguagem era fã da série de TV britânica Monty Python. Embora o Python vá ser usado para criar os jogos, essa é uma linguagem de programação de propósito geral, usada para tarefas como análise de dados, robótica, criação de sites e muito mais. Empresas e agências como o Google, a NASA e o Instagram dependem intensamente do Python. Há muitas linguagens alternativas que podem ser usadas para criar jogos, porém escolhi o Python porque ele tem a tendência de cuidar dos detalhes e deixar você – o programador – se concentrar na resolução dos problemas. Em nosso caso, resolução de problemas quer dizer exibir os personagens dos jogos na tela, fazendo-os ter uma ótima aparência e interagir com um ambiente virtual. Este capítulo contém uma introdução agradável ao Python; ele deixará você pronto para usar a linguagem de modo a poder ler os códigos de exemplo e começar a escrever o seu próprio código. Se você já tem familiaridade com o Python, sinta-se à vontade para pular os dois primeiros capítulos. Continue lendo se o Python for uma completa novidade para você ou se quiser fazer um curso para refrescar a memória. Para começar a trabalhar com o Python, inicialmente será necessário instalar um interpretador Python em seu computador. Há versões para PC, Linux e Mac. Neste livro, usaremos a versão 3.4 do Python. Para obtê-la, acesse http://python.org/downloads. ■ Nota  Na época em que este livro for publicado, talvez haja uma versão mais recente de Python disponível. As diferenças entre o Python 2 e o Python 3 são bastante significativas, mas espera-se que as atualizações futuras sejam menores. Sinta-se à vontade para fazer o download da versão mais recente do Python.

20


Capítulo 1 ■ Introdução ao Python

21

Seu primeiro contato com o Python A maneira usual de executar um código Python é salvá-lo em um arquivo e, em seguida, executá-lo. Faremos isso em breve, mas, por enquanto, usaremos o Python em modo interativo, que nos permite especificar uma linha de código de cada vez e receber um feedback imediato. Você perceberá que esse é um dos pontos fortes do Python. É um método que representa uma excelente ajuda no aprendizado da linguagem e, com frequência, é usado por programadores experientes para atividades como análise de dados, pois podemos facilmente alterar uma linha e ver a saída instantaneamente. Depois de ter instalado o Python em seu sistema, você poderá executá-lo como qualquer outro programa. Se estiver no Windows, será simplesmente uma questão de dar um clique duplo no ícone ou selecioná-lo no menu Start (Iniciar). Em outros sistemas com linha de comando, basta digitar "python" para iniciar o Python em modo interativo. Se você tiver tanto o Python 2 quanto o Python 3 instalados, será necessário digitar python3 no lugar de simplesmente digitar "python". Ao executar o interpretador Python pela primeira vez, você verá algo como: Python 3.4.2 (v3.4.2:ab2c023a9432, Oct 6 2014, 22:16:31) [MSC v.1600 64 bit (AMD64)] on win32 Type "copyright", "credits" or "license()" for more information. >>>

O texto poderá variar de acordo com a versão de Python executada e a plataforma (Windows, Mac, Linux etc.) em que ela estiver sendo executada. A parte importante são os três sinais de “maior que” (>>>), que constituem o prompt do Python – é o convite para você digitar um código que o Python tentará executar. Uma tradição de longa data em tutoriais de linguagens de computador consiste em exibir o texto “Hello, World!” na tela com o primeiro programa que você criar – e quem sou eu para quebrar a tradição? Sendo assim, respire fundo e digite print("Hello, World!") após o prompt. A janela do Python agora exibirá o seguinte na linha de prompt: >>> print("Hello, World!")

Se você teclar Enter, o Python executará a linha de código que acabou de ser digitada e, se tudo correr bem, você verá o seguinte na tela: >>> print("Hello, World!") Hello, World! >>> _


22

Introdução ao Desenvolvimento de Jogos com Python e PyGame

O Python executou sua linha de código, exibiu o resultado e forneceu um novo prompt para que mais código possa ser fornecido. Mas como nossa linha de código funciona exatamente? A palavra print é uma função que diz ao Python para exibir o que está a seguir na tela. Após a função print, há uma string, que é simplesmente uma coleção de letras e/ou dígitos. O Python trata tudo que estiver entre aspas (") como uma string. Experimente fornecer o seu próprio texto entre aspas, e você verá que o Python o exibirá na tela, como fez anteriormente.

Números Retornaremos às strings posteriormente, mas, por enquanto, vamos começar com a informação mais simples com a qual o Python é capaz de trabalhar: os números. O Python é tão bom para trabalhar com números que você poderá usá-lo quase como se fosse uma calculadora. Para vê-lo em ação, digite o seguinte no Python (não é necessário digitar o prompt, pois o Python o exibirá para você): >>> 2+2

Dê um palpite sobre o que o Python fará com essa linha e tecle Enter. Se você disse que ele exibirá 4, terá direito a um biscoito – é exatamente isso que ele fará. O Python avaliou 2+2, que, na nomenclatura do Python, é conhecido como uma expressão, e exibiu o resultado. Podemos também usar - para subtração, * para multiplicação e / para divisão. Esses símbolos são conhecidos como operadores. É provável que você use +, -, * e / com mais frequência. Aqui estão alguns exemplos: >>> 5 >>> 8 >>> 4 >>> 5

10-5 2*4 6/2+1 -2+7

No mundo real, há apenas um tipo de número, porém os computadores – e, consequentemente, o Python – têm diversas maneiras de representar os números. Os dois tipos de números mais comumente usados são o inteiro (integer) e o número de ponto flutuante (float). Os inteiros são números sem pontos decimais, enquanto os números de ponto flutuante têm pontos decimais e podem armazenar valores fracionários. Geralmente, será óbvio qual desses tipos você deverá usar – por exemplo, se o seu jogo tiver o conceito de vidas, você utilizará um inteiro para


Capítulo 1 ■ Introdução ao Python

23

armazenar esse valor, pois é improvável que você tenha meia vida ou 3,673 vidas. Os valores de ponto flutuante são usados com mais frequência em valores do mundo real que exijam precisão – por exemplo, em um jogo de corrida, seu carro poderá ter uma velocidade de 92,4302 milhas por hora (aproximadamente 148,7520 km/h), que serão armazenadas em um número de ponto flutuante. Até agora, os números que você digitou eram inteiros. Para dizer ao Python que um valor é um número de ponto flutuante, basta incluir um ponto decimal. Por exemplo, 5 e 10 são inteiros, porém 5. e 10.0 são valores de ponto flutuante. >>> 3/2 1.5 >>> 3.0/2. 1.5 >>> 3./2. 1.5

Além da matemática básica, há diversas operações diferentes que podem ser feitas com números. Os parênteses são usados para garantir que algo seja calculado antes; aqui está um exemplo: >>> 3/2+1 2.5 >>> 3/(2+1) 1.0

A primeira linha calcula 3 dividido por 2 antes e, em seguida, soma 1, resultando em 2.5. A segunda linha calcula 2 mais 1 antes e o resultado é 3 dividido por 3, que é igual a 1. Outro operador à sua disposição é o operador de potência, que calcula um valor elevado a uma potência. Por exemplo, 2 elevado a 3 é o mesmo que 2*2*2. O operador de potência é ** e funciona com inteiros e com números de ponto flutuante. Aqui estão dois exemplos do operador de potência em ação: >>> 2**3 8 >>> 3.0**4 81.0

O Python 3 lida com cálculos e com informações numéricas de maneira bastante previsível, de modo diferente de seu antecessor e de diversas linguagens diferentes. Muitas linguagens têm um intervalo que varia de -2,147 bilhões a 2,147 bilhões,


24

Introdução ao Desenvolvimento de Jogos com Python e PyGame

o que resulta em um intervalo um pouco maior do que 4 bilhões. O Python 3, porém, não tem essa limitação. Vamos criar um número grande ao calcular 2 elevado a 100, que corresponde a 2×2×2×2…×2, com o 2 repetido 100 vezes. >>> 2**100 1267650600228229401496703205376

Esse é um número bem grande! Se você estiver se sentindo corajoso, experimente calcular 2**1000 ou até mesmo 2**10000 e observe sua tela ser preenchida com números enormes. Vamos apresentar mais um operador antes da próxima seção. O operador de módulo (%) calcula o resto de uma divisão. Por exemplo, 15 módulo 6 é igual a 3, pois 6 cabe duas vezes em 15 e sobram 3. Vamos pedir ao Python que faça esse cálculo para nós: >>> 15%6 3

Com esses operadores, podemos agora calcular tudo que for necessário, seja uma gorjeta de 15% sobre dois pratos de fugu-sashi ou o dano causado por um orc1 atingindo uma armadura com um machado +1. Não sei muito sobre orcs, mas vamos calcular essa gorjeta sobre dois pratos de fugu-sashi (baiacu servido cru – uma iguaria do Japão que espero poder provar algum dia). O fugu é muito caro, mais de 200 dólares, pois, se não for preparado por chefs especialmente treinados, comê-lo poderá ser fatal! Vamos supor que encontramos um restaurante em Tóquio que sirva um prato tentador de fugu por 100 dólares. Podemos usar o Python para calcular a gorjeta para nós: >>> (100*2)*15/100 30.0

Essa linha calcula 15% sobre o preço de dois pratos de 100 dólares – uma gorjeta de 30 dólares. É adequado para esse restaurante, porém os números mudarão de acordo com o local em que comprarmos o nosso fugu e a qualidade do serviço. Podemos deixar isso mais claro e mais flexível ao usar variáveis. Uma variável é um nome para um valor; quando criamos uma variável, ela poderá ser usada no 1 N.T.: Orc ou Ork (termo vindo do latim Orcus, um dos títulos de Plutão, o senhor do mundo dos mortos), aparece nas línguas germânicas e nos contos de fantasia medieval como uma criatura deformada e forte, que combate contra as forças “do bem”. Este conceito foi popularizado nos romances de Tolkien O Hobbit e O Senhor dos Anéis e virou recorrente em jogos de RPG de mesa ou RPG eletrônico [...]. (Fonte: https://pt.wikipedia.org/wiki/Orc)


Capítulo 1 ■ Introdução ao Python

25

lugar do próprio número. Em nosso cálculo de gorjeta, podemos ter três variáveis: o preço do fugu, a quantidade de pratos e a porcentagem da gorjeta. Para criar uma variável, digite seu nome seguido de um sinal de igualdade (=) e o valor que você quer atribuir à variável: >>> price = 100 >>> plates = 2 >>> tip = 15

O sinal de igualdade (=) é conhecido como operador de atribuição. ■ Cuidado  As variáveis Python diferenciam letras maiúsculas de minúsculas (são case sensitive), o que significa que, se os nomes das variáveis usarem tipos diferentes de letras, o Python tratará essas variáveis como totalmente diferentes – ou seja, Apples, APPLES e ApPlEs são tratadas como três variáveis diferentes.

Agora podemos usar essas três variáveis no lugar dos números. Vamos calcular nossa gorjeta novamente: >>> (price*plates)*(tip/100) 30.0

Essa linha calcula o mesmo valor, mas agora está um pouco mais clara, pois podemos dizer de imediato o que os números representam. O cálculo é também muito mais flexível porque podemos alterar as variáveis e refazer o cálculo. Vamos supor que comemos fugu no café da manhã do dia seguinte, porém em um restaurante mais barato (75 dólares por prato), em que o serviço não era tão bom e mereceu apenas 5% de gorjeta: >>> price = 75 >>> tip = 5 >>> (price*plates)*(tip/100.) 7.5

A gorjeta é de 7,50 dólares, pois o garçom demorou para trazer o saquê e eu detesto esperar pelo meu saquê.

Strings Outro tipo de informação que o Python pode armazenar é a string. Uma string é uma coleção de caracteres (um caractere é uma letra, um número, um símbolo etc.) e pode ser usada para armazenar literalmente qualquer tipo de informação.


26

Introdução ao Desenvolvimento de Jogos com Python e PyGame

Uma string pode conter uma imagem, um arquivo de áudio ou até mesmo um vídeo, porém o uso mais comum de strings está no armazenamento de texto. Para fornecer uma string em Python, coloque-a entre aspas simples (') ou aspas duplas ("). Aqui estão duas strings; ambas contêm exatamente a mesma informação: "Hello" 'Hello'

Então por que há mais de uma maneira de criar uma string? Boa pergunta; vamos supor que queremos armazenar a frase: I said “hocus pocus” to the wizard. Se colocarmos a frase toda em uma string com aspas duplas, o Python não terá nenhuma maneira de saber que você quer que a string termine após a palavra wizard e suporá que a string termina no espaço após a palavra said. Vamos testar isso e ver o que acontece: >>> print("I said "hocus pocus" to the wizard.") Traceback ( File "<interactive input>", line 1 print("I said "hocus pocus" to the wizard.") ^ SyntaxError: invalid syntax

O Python lançou uma exceção. Falaremos mais sobre exceções posteriormente neste livro, mas, por enquanto, se você vir uma exceção como essa, é sinal de que o Python está informando que algo está errado com o código que você forneceu. Podemos contornar o problema de incluir aspas em strings ao usar o símbolo alternativo de aspas. Vamos testar a mesma frase, porém com aspas simples (') desta vez: >>> print('I said "hocus pocus" to the wizard.') I said "hocus pocus" to the wizard.

O Python ficou bastante satisfeito com isso e não lançou uma exceção dessa vez. Provavelmente, essa é a maneira mais fácil de contornar o problema das aspas, porém há outras opções. Se você digitar um caractere de barra invertida (\) antes de um caractere de aspas, isso dirá ao Python que você não quer que a string termine nesse ponto – você só quer incluir o símbolo de aspas na string. O caractere de barra invertida é conhecido como “caractere de escape” em Python. Aqui está um exemplo: >>> print("I said \"hocus pocus\" to the wizard.") I said "hocus pocus" to the wizard.


Capítulo 1 ■ Introdução ao Python

27

Isso resolve o problema de um modo diferente, porém o resultado é o mesmo. Apesar do risco de sobrecarregar você com informações demais, há outra maneira de definir strings: se você iniciar uma string com aspas simples triplas (''') ou com aspas duplas triplas ("""), o Python saberá que a string não terminará até que outro conjunto com o mesmo tipo de aspas triplas seja encontrado. Isso é conveniente, pois um texto raramente contém três aspas seguidas. Aqui está nossa string novamente com aspas triplas: >>> print("""I said "hocus pocus" to the wizard.""") I said "hocus pocus" to the wizard.

Concatenando strings Agora temos diversas maneiras de criar strings, mas o que podemos fazer com elas? Assim como os números, as strings têm operadores que podem ser usados para criar novas strings. Se duas strings forem somadas, você obterá uma nova string contendo a primeira string e a segunda string concatenada no final. As strings podem ser somadas com o operador +, assim como fazemos com os números; vamos testar isso: >>> "I love "+"Python!" 'I love Python!'

O Python somou duas strings e exibiu o resultado. A soma de strings dessa maneira é chamada de concatenação de strings. Duas strings quaisquer podem ser concatenadas, porém não é possível concatenar uma string com um número. Vamos testar isso, de qualquer modo, para ver o que acontece: >>> "high "+5 Traceback (most recent call last): File "<interactive input>", line 1, in ? TypeError: cannot concatenate 'str' and 'int' objects

Nesse caso, tentamos gerar a string 'high 5' ao somar o número 5 a uma string. Essa instrução não faz sentido para o Python, e ele informa isso lançando outra exceção. Se quiser concatenar um número a uma string, inicialmente será necessário converter esse número em uma string. Podemos criar strings facilmente a partir de números ao compor uma nova string a partir desse número. Aqui está o modo de criar nossa string high 5. >>> "high "+str(5) 'high 5'


28

Introdução ao Desenvolvimento de Jogos com Python e PyGame

Essa instrução funciona porque str(5) cria uma string a partir do número 5, e o Python ficará satisfeito em concatená-la com outra string. Também podemos usar o operador de multiplicação (*) com strings, porém as strings podem ser multiplicadas somente com inteiros. Adivinhe o que a linha de código Python a seguir fará: >>> 'eek! '*10

Você verá que o Python pode ser bastante intuitivo; se você multiplicar uma string por dez, ela será repetida dez vezes. As strings não suportam todos os operadores matemáticos como / e - porque o que eles fariam não é intuitivo. O que "apples"-"oranges" poderia possivelmente significar?

Fazendo parse de strings Como uma string pode ser imaginada como uma coleção de caracteres, geralmente será útil poder referir-se às partes dela em vez de referenciá-la como um todo. O Python faz isso com o operador de índice, que consiste de colchetes [] contendo o offset do caractere. O primeiro caractere é [0], o segundo é [1], o terceiro é [2] e assim por diante. Começar em 0 e não em 1 pode parecer um pouco estranho, porém é uma tradição entre as linguagens de computador, e você perceberá que isso, na verdade, simplificará o seu trabalho quando você escrever mais códigos Python. Vamos ver a indexação de strings em ação. Inicialmente, criaremos uma variável contendo uma string, o que é feito exatamente como no caso dos números: >>> my_string = 'fugu-sashi' >>> print(my_string) 'fugu-sashi'

Normalmente, você daria um nome melhor às strings, porém, nesse pequeno exemplo, chamaremos a variável simplesmente de my_string (o caractere de underscore entre my e string é usado no lugar de um espaço, pois o Python não permite usar espaços nos nomes de variáveis). Podemos selecionar letras individuais da string usando o operador de índice: >>> my_string[0] 'f' >>> my_string[3] 'u'

my_string[0] resulta em uma string com o primeiro caractere de fugu-sashi, que é f. A segunda linha resulta no quarto caractere, pois o primeiro caractere tem offset


Capítulo 1 ■ Introdução ao Python

29

igual a 0, e não 1. Procure pensar no offset não como o número do caractere, mas como os espaços entre os caracteres (veja a figura 1.1); isso deixará a indexação um pouco mais intuitiva.

Figura 1.1 – Indexação de string.

Vamos supor que queremos descobrir qual é o último caractere de uma string. A partir da figura 1.1, podemos ver que o último caractere é “i” no offset 9; porém o que aconteceria se não conhecêssemos a string previamente? Poderíamos ter extraído a string de um arquivo, ou o jogador poderia tê-la digitado em uma tabela das melhores pontuações. Para descobrir qual é o último offset, inicialmente devemos descobrir o tamanho da string, o que pode ser feito com a função len. Pense em uma função como um código Python armazenado; passamos algumas informações à função, que as usará para realizar alguma ação e retornar, possivelmente com novas informações. É exatamente isso que len faz; nós lhe fornecemos uma string e ela retorna o tamanho dessa string. Vamos testar a função len em my_string: >>> len(my_string) 10

Há 10 caracteres em my_string, porém não podemos usar 10 como offset, pois ele estará no final da string. Para obter o último caractere, devemos usar o offset antes de 10, que é simplesmente 9, portanto subtraia 1. Eis o modo de usar len para encontrar o último caractere de uma string: >>> my_string[len(my_string)-1] 'i'

Espero que você concorde que é bem simples! Porém o Python pode facilitar mais ainda essa operação para nós por meio da indexação negativa. Se você indexar com um número negativo, o Python o tratará como um offset a partir do final da string; desse modo, [-1] é o último caractere, [-2] é o penúltimo caractere, e assim sucessivamente (veja a figura 1.2).

Figura 1.2 – Indexação negativa.


30

Introdução ao Desenvolvimento de Jogos com Python e PyGame

Agora podemos descobrir qual é o último caractere com um pouco menos de código: >>> my_string[-1] 'i'

Slicing de strings Além de extrair caracteres individuais de uma string, podemos selecionar grupos de caracteres ao fazer o slicing (fatiamento) de strings. O slicing funciona de modo muito semelhante à indexação, porém usamos dois offsets separados por dois-pontos (:). O primeiro offset é o local em que o Python deve iniciar o slicing; o segundo offset é o local em que o slicing deve terminar. Novamente, pense nos offsets como os espaços entre os caracteres, e não como os caracteres propriamente ditos. >>> my_string[2:4] 'gu' >>> my_string[5:10] 'sashi'

A primeira linha diz ao Python para criar um slice entre os offsets 2 e 4. Podemos ver, a partir do diagrama, que há dois caracteres entre esses offsets: g e u. O Python os retorna como uma única string, isto é, como 'gu'. A segunda linha fatia a string entre os offsets 5 e 10 e retorna a string 'sashi'. Se você deixar o primeiro offset indefinido, o Python usará o início da string; se o segundo offset estiver indefinido, o final da string será usado. >>> my_string[:4] 'fugu' >>> my_string[5:] 'sashi'

O slicing pode receber outro valor, que será usado como o valor de incremento (step). Se o valor de incremento for 1 ou se ele não for especificado, o Python simplesmente retornará o slice entre os dois primeiros offsets. Se você criar o slice com um valor de incremento igual a 2, uma string formada pelos caracteres obtidos a cada dois caracteres da string original será retornada. Um incremento igual a 3 retornará uma string formada pelos caracteres obtidos a cada três caracteres da string original e assim por diante. Eis alguns exemplos desse tipo de slicing:


Capítulo 1 ■ Introdução ao Python

31

>>> my_string[::2] 'fg-ah' >>> my_string[1::3] 'u-s'

A primeira linha cria um slice a partir do início até o final da string (porque os dois primeiros offsets foram omitidos), porém, como o valor de incremento é 2, a string será formada pelos caracteres obtidos a cada dois caracteres da string original. A segunda linha começa no offset 1 (em u) e cria o slice até o final da string original, com os caracteres obtidos a cada três caracteres. O valor de incremento em um slice também pode ser negativo, o que provoca um efeito interessante. Quando o Python vê um incremento negativo, ele inverte a ordem do slicing, de modo que ele será feito do segundo offset para o primeiro. Esse recurso pode ser usado para inverter facilmente uma string: >>> my_string[::-1] 'ihsas-uguf' >>> my_string[::-2] 'issuu'

A primeira linha simplesmente retorna uma string com os caractere na ordem inversa. Como o valor do incremento é negativo, o slice será criado do final para o início da string.

Métodos de string Juntamente com esses operadores, as strings têm diversos métodos; os métodos são funções contidas em objetos Python e podem realizar alguma ação sobre eles. As strings Python contêm diversos métodos úteis para ajudar você a trabalhar com strings. Aqui estão somente alguns deles, aplicados à nossa string fugu-sashi: >>> my_string.upper() 'FUGU-SASHI' >>> my_string.capitalize() 'Fugu-sashi' >>> my_string.title() 'Fugu-Sashi'

Nesse exemplo, aplicamos vários métodos em uma string. Cada um deles retorna uma nova string modificada de alguma maneira. Podemos ver que upper retorna uma string com todas as letras convertidas em letras maiúsculas, capitalize retorna uma nova string com o primeiro caractere convertido em letra maiúscula e title


32

Introdução ao Desenvolvimento de Jogos com Python e PyGame

retorna uma nova string com o primeiro caractere de cada palavra convertido em letra maiúscula. Esses métodos não exigem nenhuma outra informação, porém os parênteses continuam sendo necessários para dizer ao Python que a função deverá ser chamada. ■ Nota  As strings Python são imutáveis, o que significa que a string não poderá ser modificada depois que for criada, porém é possível criar novas strings a partir dela. Na prática, raramente você perceberá isso, pois criar novas strings é muito fácil (é isso que fizemos durante todo esse tempo)!

Listas e tuplas Como a maioria das linguagens, o Python tem maneiras de armazenar grupos de objetos, o que vem a calhar, pois um jogo com apenas um alienígena, uma bala ou uma arma seria muito maçante! Os objetos Python que armazenam outros objetos são conhecidos como coleções, e uma das coleções mais simples e usada com mais frequência é a lista. Vamos começar criando uma lista vazia: >>> my_list=[]

Os colchetes criam uma lista vazia, que então é atribuída à variável my_list. Para adicionar um item a uma lista, o método append pode ser usado; esse método insere qualquer objeto Python especificado no final da lista. Vamos supor que nossa lista armazenará nossas compras da semana e vamos adicionar dois itens a ela: >>> my_list.append('chopsticks') >>> my_list.append('soy sauce')

Nesse exemplo, adicionamos duas strings a my_list, mas poderíamos ter adicionado qualquer outro objeto Python com a mesma facilidade, inclusive outras listas. Se você digitar my_list no prompt do Python agora, o conteúdo da lista será exibido: >>> my_list ['chopsticks', 'soy sauce']

Nesse caso, podemos ver que as duas strings estão agora armazenadas na lista. Não podemos sobreviver somente com hashis (chopsticks) e molho de soja (soy sauce), então vamos acrescentar mais alguns itens à nossa lista de compras: >>> my_list.append('wasabi') >>> my_list.append('fugu') >>> my_list.append('sake')


Capítulo 1 ■ Introdução ao Python

33

>>> my_list.append('apple pie') >>> my_list ['chopsticks', 'soy sauce', 'wasabi', 'fugu', 'sake', 'apple pie']

Modificando itens da lista As listas em Python são mutáveis, o que significa que elas podem ser alteradas após terem sido criadas. Assim como é possível obter o conteúdo de uma lista usando o operador de índice, podemos alterar o item em qualquer índice ao atribuir um novo item a ele. Vamos supor que queremos comprar especificamente um molho de soja escuro (dark); podemos alterar o segundo item ao atribuir-lhe um novo valor com o operador de atribuição (=): >>> my_list[1]='dark soy sauce' >>> my_list ['chopsticks', 'dark soy sauce', 'wasabi', 'fugu', 'sake', 'apple pie']

Removendo itens da lista Além de alterar itens de uma lista, podemos remover itens. Vamos supor que queremos remover apple pie porque esse item parece não estar adequado ao restante de nossa lista de compras. Podemos fazer isso com o operador del, que removerá qualquer item de nossa lista – nesse caso, é o último item, portanto usaremos a indexação negativa: >>> del my_list[-1] >>> my_list ['chopsticks', 'dark soy sauce', 'wasabi', 'fugu', 'sake']

As listas suportam diversos operadores que funcionam de modo semelhante às strings. Vamos dar uma olhada no slicing e na indexação, que você achará bastante familiar: >>> my_list[2] 'wasabi' >>> my_list[-1] 'sake'

A primeira linha retorna a string no offset 2, que corresponde à terceira posição em nossa lista de compras. Assim como no caso das strings, o primeiro item de uma lista é sempre 0. A segunda linha utiliza a indexação negativa e, assim como no caso das strings, [-1] retorna o último item.


34

Introdução ao Desenvolvimento de Jogos com Python e PyGame

O slicing de listas funciona de modo semelhante ao slicing de strings, exceto pelo fato de uma nova lista, e não uma string, ser retornada. Vamos fatiar nossa lista de compras em duas partes: >>> my_list[:2] ['chopsticks', 'dark soy sauce'] >>> my_list[2:] ['wasabi', 'fugu', 'sake'] >>>

No primeiro slice, pedimos ao Python que nos desse todos os itens, do início da lista até o offset 2; no segundo slice, solicitamos tudo que está a partir do offset 2 até o final da lista. Os offsets de lista funcionam exatamente como os offsets de string, portanto procure pensar neles como os espaços entre os objetos da lista, e não como os objetos propriamente ditos. Sendo assim, o offset 0 está antes do primeiro item e o offset 1 está após o primeiro item e antes do segundo. Também podemos somar listas com o operador +. Ao somar listas, criamos uma única lista contendo os itens de ambas as listas. Vamos criar uma nova lista e somá-la à nossa lista de compras: >>> my_list2 = ['ramen', 'shiitake mushrooms'] >>> my_list += my_list2 >>> my_list ['chopsticks', 'dark soy sauce', 'wasabi', 'fugu', 'sake', 'ramen', 'shiitake mushrooms']

A primeira linha cria uma nova lista de strings chamada my_list2. Criamos essa segunda lista de maneira um pouco diferente da primeira; em vez de criar uma lista vazia e adicionar um item de cada vez a ela, criamos uma lista com dois itens já incluídos. A segunda linha utiliza o operador +=, que é um atalho conveniente: my_list+=my_list2 é o mesmo que my_list=my_list+my_list2, que tem o efeito de somar as duas listas e armazenar o resultado de volta em my_list.

Métodos de lista Juntamente com esses operadores, as listas suportam diversos métodos. Vamos usar o método sort para ordenar nossa lista de compras em ordem alfabética: >>> my_list.sort() >>> my_list ['chopsticks', 'dark soy sauce', 'fugu', 'ramen', 'sake', 'shiitake mushrooms', 'wasabi']


Capítulo 1 ■ Introdução ao Python

35

O método sort ordena o conteúdo da lista. A ordem depende do conteúdo da lista, mas, em uma lista de strings, a ordem será alfabética. Você perceberá que o Python não exibe nada após a chamada a sort; isso ocorre porque sort não retorna uma lista ordenada, mas apenas ordena a lista na qual ele foi chamado. A segunda linha é necessária para pedir ao Python que exiba o conteúdo de nossa lista. Vamos supor que faremos compras e queremos retirar um item da lista para procurá-lo em um supermercado. Podemos fazer isso com o método pop, que remove um item da lista e o retorna: >>> my_list.pop(0) 'chopsticks'

Pedimos à my_list para fazer o “pop” do item que está no offset 0, que é chopsticks. Se exibirmos agora o conteúdo da lista de compras, veremos que o primeiro item foi removido: >>> my_list ['fugu', 'ramen', 'sake', 'shiitake mushrooms', 'soy sauce', 'wasabi']

Há mais métodos de lista além daqueles discutidos aqui. Consulte a tabela 1.1 para ver outros métodos. Tabela 1.1 – Métodos de lista do Python Método

Descrição

append

Concatena itens à lista.

count

Contabiliza o número de vezes que um item ocorre em uma lista.

extend

Adiciona itens de outra coleção.

index

Encontra o offset de uma string.

insert

Insere um item na lista.

pop

Remove um item em um offset da lista e o retorna.

remove

Remove um item em particular de uma lista.

reverse

Inverte a lista.

sort

Ordena a lista.


36

Introdução ao Desenvolvimento de Jogos com Python e PyGame

Tuplas Outra coleção que apresentaremos nesta seção é a tupla. As tuplas são semelhantes às listas, exceto pelo fato de serem imutáveis, ou seja, assim como as strings, depois que forem criadas, seu conteúdo não poderá ser alterado. As tuplas geralmente são usadas preferencialmente no lugar das listas quando as informações que elas contêm estiverem, de algum modo, associadas – por exemplo, uma tupla pode representar um número de telefone e um código de área porque ambas as partes são necessárias na discagem. Elas são criadas de modo semelhante às listas, porém utilizam parênteses, isto é, (), no lugar de colchetes. Vamos criar uma tupla que armazene o número de telefone de nosso restaurante preferido de sushi para viagem: >>> my_tuple=('555', 'EATFUGU') >>> my_tuple ('555', 'EATFUGU')

Nesse exemplo, criamos uma tupla com duas strings contendo o código de área e o número de nosso restaurante que prepara fugu para viagem. Para provar que uma tupla é imutável, vamos tentar acrescentar um item a ela: >>> my_tuple.append('ramen') Traceback (most recent call last): File "<interactive input>", line 1, in ? AttributeError: 'tuple' object has no attribute 'append'

O Python lançou uma exceção AttributeError, que nos permite saber que as tuplas não suportam o método append. Você obterá resultados semelhantes se tentar fazer algo que modifique a tupla. As tuplas, porém, suportam todos os operadores de indexação e de slicing, pois esses operadores não modificam a tupla. >>> my_tuple[0] '555' >>> my_tuple[1] 'EATFUGU'

Desempacotamento Como as tuplas geralmente são usadas para passar valores em grupo, o Python disponibiliza uma maneira simples de extrair esses dados; esse método se chama desempacotamento (unpacking). Vamos desempacotar nossa tupla em duas variáveis: uma para o código de área e outra para o número.


Capítulo 1 ■ Introdução ao Python

37

>>> my_tuple=('555', 'EATFUGU') >>> area_code, number = my_tuple >>> area_code '555' >>> number 'EATFUGU'

Nesse exemplo, podemos ver que, em uma única linha, o Python desempacotou as duas partes de nossa tupla em dois valores separados. O desempacotamento, na verdade, funciona para listas e outros objetos Python, porém você o usará com mais frequência em tuplas. Outra maneira de extrair valores de uma tupla consiste em convertê-la em uma lista. Isso pode ser feito por meio da criação de uma lista usando a tupla como parâmetro – por exemplo, list(my_tuple) retorna a lista equivalente, que é ['555', 'EATFUGU']. Também podemos fazer o inverso e criar uma tupla ao chamar tuple em uma lista – por exemplo, tuple(['555', 'EATFUGU']) retorna a nossa tupla original. Veremos quais são os melhores lugares para usar tuplas no lugar de listas nos próximos capítulos; por enquanto, utilize a regra geral segundo a qual você deverá usar uma tupla se o seu conteúdo jamais tiver de ser modificado. ■ Nota  Criar uma tupla com um ou nenhum item é um pouco diferente de criar listas. Isso ocorre porque o Python também utiliza parênteses para definir a prioridade em expressões semelhantes às expressões matemáticas. Para definir uma tupla com apenas um item, acrescente uma vírgula após o item; para definir uma tupla vazia, basta incluir a vírgula sozinha entre parênteses. Por exemplo, ('ramen',) é uma tupla com um item e (,) é uma tupla vazia.

Dicionários O último tipo de coleção que veremos é o dicionário. Todas as coleções anteriores que vimos eram coleções sequenciais, pois os valores estavam em uma sequência, do primeiro até o último, e podíamos acessá-los de acordo com a sua posição na lista. Os dicionários são coleções de mapeamento, pois mapeiam uma informação em outra. Podemos usar um dicionário para armazenar os preços de nossa lista de compras ao mapear o nome do item alimentício ao seu preço. Vamos supor que o fugu custe 100 dólares e o ramen custe 5 dólares; podemos criar um dicionário que armazene essas informações da seguinte maneira: >>> my_dictionary={'ramen': 5.0, 'fugu': 100.0}


38

Introdução ao Desenvolvimento de Jogos com Python e PyGame

As chaves criam um dicionário. Dentro das chaves, temos a string 'ramen' seguida de dois-pontos e o número 5.0 (preço em dólares). Isso diz ao Python que a string está mapeada ao número; em outras palavras, podemos consultar o preço se tivermos o nome do item alimentício. Vários itens de um dicionário são separados com uma vírgula; nesse exemplo, temos um segundo item que mapeia 'fugu' ao valor 100.0. Para obter essa informação, utilizamos novamente o operador de colchetes ([]) passando-lhe a chave (key) que queremos consultar (nesse caso, a chave é fugu ou ramen). O dicionário retorna o valor associado à chave – isto é, o preço do item. Vamos dar uma olhada em nossas duas chaves: >>> my_dictionary['fugu'] 100.0 >>> my_dictionary['ramen'] 5.0

Também podemos adicionar novos itens ao dicionário ao atribuir novos valores a ele: >>> my_dictionary['chopsticks']=7.50 >>> my_dictionary['sake']=19.95 >>> my_dictionary {'sake': 19.0, 'ramen': 5.0, 'chopsticks': 7.5, 'fugu': 100.0}

Nesse caso, adicionamos dois novos itens ao dicionário. Talvez você tenha percebido que, quando o Python exibe a lista para nós, os itens estão em uma ordem diferente daquela usada quando criamos originalmente o dicionário. Isso ocorre porque os dicionários não têm nenhuma noção de ordem para as chaves de um dicionário, e o que você vê sendo exibido não está em nenhuma ordem em particular. O importante é que o Python lembra quais chaves estão mapeadas a quais valores – e faz isso muito bem!

Loops Um loop (laço) é uma maneira de executar uma porção de código mais de uma vez. Os loops são fundamentais nas linguagens de programação, e você verá que quase toda linha de código escrita em um jogo estará dentro de algum tipo de loop. Assim como muitas outras linguagens de programação, o Python tem dois tipos de loop para cuidar de todas as suas necessidades de looping: o loop while e o loop for.


Capítulo 1 ■ Introdução ao Python

39

Loops while Um loop while é usado quando você quer repetir uma porção de código somente quando – ou enquanto – uma condição for verdadeira. Vamos usar um loop while simples para exibir os números de 1 a 5. Começaremos digitando as linhas a seguir no interpretador: >>> count=1 >>> while count<=5: ...

Ao teclar Enter após a segunda linha, você perceberá que, em vez do prompt Python usual, você verá agora três pontos (...). Isso ocorre porque os dois-pontos no final da linha indicam que há mais código por vir. No caso de um loop while, é o código que queremos que seja repetido. Todas as linguagens devem ter alguma maneira de marcar o início e o fim dos blocos de código. Algumas usam símbolos como chaves ({ }), enquanto outras usam palavras como do e end. O Python faz isso de maneira um pouco diferente e utiliza a indentação para definir os blocos de código. Para dizer ao Python que uma linha de código faz parte de um bloco e não do restante do código, insira uma tabulação antes da linha (pressionando a tecla Tab): ... print(count) ... count+=1

■ Nota  Em alguns sistemas, você verá que uma tabulação será inserida automaticamente na primeira linha de um bloco. Isso poderá ser conveniente se houver bastante código em um bloco. Apague a tabulação e tecle Enter normalmente para finalizar o bloco.

Tecle Enter duas vezes após a última linha; a linha em branco diz ao interpretador que você acabou de digitar o bloco de código. O loop while agora será executado e exibirá os números de 1 a 5. Então, como isso funciona? Bem, após a instrução while, há uma condição (count<=5), que pode ser lida como “count é menor ou igual a 5?”. Na primeira vez que o Python encontra o loop while, count é igual a 1, o que satisfaz a nossa condição de ser menor ou igual a 5 – desse modo, o Python executa o bloco de código. As duas linhas no bloco de código inicialmente exibem o valor de count e, em seguida, somam um a ele. Após a segunda linha, count é igual a 2, o que também satisfaz a condição, e passaremos pelo loop novamente. Em algum momento, count será igual a 6, que, definitivamente, não é menor ou igual a 5 e, dessa vez, o Python ignorará o bloco de código.


40

Introdução ao Desenvolvimento de Jogos com Python e PyGame

Menor ou igual a (<=) é apenas um operador de comparação. Consulte a tabela 1.2 para ver outros operadores que podem ser usados. Tabela 1.2 – Operadores de comparação Operador

Descrição

<

Menor que

<=

Menor ou igual a

>

Maior que

>=

Maior ou igual a

==

Igual a

!=

Diferente de

■ Cuidado  Tome cuidado com seus loops! Se você usar uma condição que seja sempre verdadeira, por exemplo, 2>1, o Python permanecerá no loop indefinidamente. Se você se vir nessa enrascada, pressione Ctrl+C para interromper imediatamente o Python. Todo programador já ficou preso em um loop infinito pelo menos uma vez!

Loops for Os loops while têm seus usos e é importante saber utilizá-los, porém, geralmente, o loop for será uma opção mais adequada. Um loop for é executado com um objeto Python iterável, que fornecerá um novo valor até que não haja mais itens restantes. Você já conheceu os iteráveis: listas, tuplas, dicionários e até mesmo strings são objetos iteráveis. Vamos reescrever o loop while do exemplo como um loop for: >>> for count in range(0,6): ... print(count)

Nesse caso, estamos fazendo uma iteração pelo resultado da função range, que cria uma lista de valores a partir do primeiro parâmetro até – mas sem incluir – o segundo parâmetro. Como podemos ver, a chamada a range criou uma lista contendo os números de 0 a 5, que é exatamente o que queremos exibir em nosso loop. Quando passar pelo loop for pela primeira vez, o Python tomará o primeiro valor da lista e o atribuirá à variável count; em seguida, o código do loop será executado. Esse código simplesmente exibe o valor atual de count na tela. O loop termina após cinco passagens, quando o final da lista é alcançado.


Capítulo 1 ■ Introdução ao Python

41

Se quiser começar com qualquer número que não seja 0, será necessário especificar ambos os parâmetros, mas experimente fazer o seguinte: >>> for count in range(6): ... print(count)

■ Nota  Você verá que o mesmo resultado anterior será obtido.

Python na prática Antes de prosseguirmos para o próximo capítulo, vamos colocar o que aprendemos em uso prático. A aritmética mental nunca foi um de meus pontos fortes, portanto gostaria de escrever uma pequena porção de código Python que percorra a nossa lista de compras e calcule o preço total. Começaremos criando uma lista que contenha nossas compras para a semana e um dicionário que mapeie o nome de cada item ao seu preço: >>> shopping=['fugu', 'ramen', 'sake', 'shiitake mushrooms', 'soy sauce', 'wasabi'] >>> prices={'fugu':100.0, 'ramen':5.0, 'sake':45.0, 'shiitake mushrooms':3.5, 'soy sauce':7.50, 'wasabi':10.0} >>> total=0.00

Muito bem, ótimo. Agora temos duas coleções Python que armazenam todas as informações relacionadas às nossas compras e uma variável para armazenar o total. O que devemos fazer agora é percorrer shopping em um loop, consultar cada preço em prices e somá-lo a total: >>> for item in shopping: ... total+= prices[item] >>> total 171.0

Isso é tudo! A variável total agora contém a soma de todos os itens de nossa lista de compras, e podemos ver que o total final é um valor bem razoável: 171 dólares. Não se preocupe; o código de exemplo dos próximos capítulos será muito mais interessante que uma lista de compras!


42

Introdução ao Desenvolvimento de Jogos com Python e PyGame

Resumo Exploramos algumas das construções básicas do Python neste primeiro capítulo; a maioria delas será usada regularmente quando um código novo for criado. Podemos pensar no que aprendemos até agora como as ferramentas básicas do negócio quando se trata de criar jogos e outros programas Python. Os dados (números e strings) e as coleções (tuplas, listas e dicionários) são particularmente fundamentais, pois podemos usá-los para armazenar todas as características de um jogo. No próximo capítulo, aprenderemos a combinar o que vimos para criar programas mais sofisticados. Você aprenderá a usar a lógica, criar funções e tirar proveito da eficácia da programação orientada a objetos.


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.