Anda di halaman 1dari 25
Introdugao ao Desenvolvimento de Jogos em Python com PyGame Harrison Kinsley Will McGugan Novatec Original English language edition published by Apress, Copyright © 2015 by Apress, Inc. Portuguese- language edition for Brazil copyright © 2015 by Novatee Editora, All rights reserved. Edicio original em Inglés publicada pela Apress, Copyright © 2015 by Apress, Inc. Edigdo 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 9610 de 19/02/1998. E proibida a reprodugio desta cobra, mesmo parcial, por qualquer processo, sem prévia autorizagio, por escrito, do autor eda Editora, Editor: Rubens Prates Assistente editorial: Priscila A. Yoshimatsu ‘Tradugio: Lucia A. Kinoshita Revisio gramatical: Marta Almeida de S4 Editoragio eletrOnica: Carolina Kuwabata ISBN; 978-85-7522-452-6 Histérico de impressdes: Setembro/2015.__Primeira edigio Novatec Editora Ltda Rua Luis Ant6nio dos Santos 110 (02460-000 — Sio Paulo, SP — Brasil Tel.: +55 11 2959-6529 Email: novatec@novatec.com.br Site: wwwnovatec.com.br Twitter: ewitter,com/novateceditora Facebook: facebook com/novatee Linkedin: linkedin.comy/in/novatec CAPITULO 1 Introducao ao Python A linguagem de programagio que usaremos para criar jogos é o Python, que recebeu esse nome porque o autor original da linguagem era fa da série de TV britanica Monty Python. Embora o Python va ser usado para criar os jogos, essa € uma linguagem de programagio de propésito geral, usada para tarefas como anilise de dados, robotica, criago de sites ¢ muito mais. Empresas ¢ agéncias. como 0 Google, a NASA ¢ o Instagram dependem intensamente do Python, Ha muitas linguagens alternativas que podem ser usadas para criar jogos, porém escolhi o Python porque ele tema tendéncia de cuidar dos detalhes ¢ deixar vocé — 0 programador ~ se concentrar na resolugao dos problemas. Em nosso caso, resolucio de problemas quer dizer exibir 0s personagens dos jogos na tela, fazendo- -os ter uma 6tima aparéncia ¢ interagir com um ambiente virtual. Este capitulo contém uma introdugio agradavel ao Python; cle deixara vocé pronto para usar a linguagem de modo a poder ler os codigos de exemplo ¢ comegar a escrever 0 seu proprio cédigo. Se voce jé tem familiaridade com o Python, sinta-se a vontade para pular os dois primeiros capitulos, Continue lendo se o Python for uma completa novidade para voce ou se quiser fazer um curso para refrescar a meméria, Para comegar a trabalhar com o Python, inicialmente ser necessério instalar um interpretador Python em seu computador. Ha verses para PC, Linux e Mac. Neste livro, usaremos a versiio 34 do Python. Para obté-la, acesse http://python.orgidownloads. = Nota Na época em que este livro for publicado, talvez haja uma versio mais recente de Python disponivel. As diferengas entre o Python 2 ¢ o Python 3 sio futuras sejam menores. io mais recente do Python. 20 Capitulo 1 = Introdugao ao Python 2 Seu primeiro contato com o Python ‘A maneira usual de executar um cédigo Python é salvé-lo em um arquivo e, em seguida, executd-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 ¢ receber um feedback imediato, Vocé percebera que esse ¢ um dos pontos fortes do Python. E um metodo que representa uma excelente ajuda no aprendizado da linguagem ¢, com frequéncia, ¢ usado por programadores experientes para atividades como andilise de dados, pois podemos facilmente alterar uma linha ¢ ver a saida instantaneamente. Depois de ter instalado o Python em seu sistema, vocé podera executé-lo como qualquer outro programa. Se estiver no Windows, sera simplesmente uma questo de dar um clique duplo no icone ou selecioné-lo no menu Start (Iniciar). Em ou- tros sistemas com linha de comando, basta digitar "python" para iniciar o Python cm modo interativo. Se vocé tiver tanto o Python 2 quanto o Python 3 instalados, serd necessdrio digitar python3 no lugar de simplesmente digitar "python". ‘Ao executar o interpretador Python pela primeira vez, voce vera algo como: Python 3.4.2 (v3.4,2:ab2c02389432, Oct 6 2014, 22:16:31) [NSC v.1600 64 bit (AHDE4)] on win32 Type "copyright", "credits" or "License()" for more information. O texto podera variar de acordo com a versio de Python executada e a plataforma (Windows, Mac, Linux etc) em que ela estiver sendo executada. A parte importante siio os trés sinais de “maior que” (>>>), que constituem o prompt do Python ~ é 0 convite para vocé digitar um cédigo que o Python tentara executar, Uma tradigio 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 tradigio? Sendo assim, respire fundo € digite print('Hello, Norld!") apds o prompt. A janela do Python agora exibiré 0 seguinte na linha de prompt: >>> print("Hello, World!") Se vocé teclar Enter, o Python executaré a linha de codigo que acabou de ser digitada e, se tudo correr bem, voce vera 0 seguinte na tela: >>> print("Hello, Norld!") Hello, World! 2 Introducao ao Desenvolvimento de Jogos com Python e PyGame O Python executou sua linha de cédigo, exibiu o resultado forneceu um novo prompt para que mais codigo possa ser fornecido. Mas como nossa linha de codigo funciona exatamente? A palavra print é uma fungdo que diz ao Python para exibir o que est a seguir na tela. Apos a funcio print, ha uma string, que é simplesmente uma colegio de letras e/ou digitos. O Python trata tudo que estiver entre aspas (") como uma string. Experimente fornecer 0 seu proprio texto entre aspas, ¢ vocé vera que o Python o exibird na tela, como fez anteriormente. Numeros Retornaremos as strings posteriormente, mas, por enquanto, vamos comegar com a informagao mais simples com a qual o Python é capaz de trabalhar: 0s ntimeros. © Python é tio bom para trabalhar com mimeros que vocé poder usé-lo quase como se fosse uma calculadora. Para vé-lo em agio, digite o seguinte no Python (nio € necessario digitar o prompt, pois o Python o exibira para voce): pop 242 Dé um palpite sobre o que o Python faré com essa linha e tecle Enter. Se voce disse que ele exibira 4, tera direito a um biscoito ~ é exatamente isso que ele fara. © Python avaliou 2+2, que, na nomenclatura do Python, é conhecido como uma expressdo, ¢ exibiu o resultado, Podemos também usar - para subtragio, * para multiplicago e / para divistio, Esses simbolos so conhecidos como operadores. E . Aqui esto alguns exemplos provavel que vocé use +, -,* e / com mais frequénc poe 10-5 5 pe> 2*4 poo 6/241 pop -247 5 con- No mundo real, hd apenas um tipo de ntimero, porém os computadores — sequentemente, o Python — tém diversas maneiras de representar os ntimeros. Os dois tipos de mimeros mais comumente usados sio o inteiro (integer) € 0 mimero de ponto flutuante (float). Os inteiros so numeros sem pontos decimais, enquanto os mimeros de ponto flutuante tém pontos decimais e podem armazenar valores fracionarios. Geralmente, ser Gbvio qual desses tipos vocé deveré usar — por exemplo, se 0 seu jogo tiver 0 conceito de vidas, vocé utilizaré um inteiro para Capitulo 1 = Introdugao ao Python 2B armazenar esse valor, pois ¢ improvavel que vocé tenha meia vida ou 3673 vidas. Os valores de ponto flutuante sao usados com mais frequéncia em valores do mundo real que exijam precisiio ~ por exemplo, em um jogo de corrida, seu carro poderd ter uma velocidade de 924302 milhas por hora (aproximadamente 1487520 km/h), que sero armazenadas em um ntimero de ponto flutuante. Até agora, os mimeros que vocé digitou eram inteiros. Para dizer ao Python que um valor é um ntimero de ponto flutuante, basta incluir um ponto decimal. Por exemplo, 5 ¢ 10 sao inteiros, porém 5.¢ 10.0 sao valores de ponto flutuante. poe 3/2 1s poe 3.0/2. 1S po 3./2. LS Além da matematica basica, hé diversas operagdes diferentes que podem ser feitas com mtimeros, Os parénteses stio usados para garantir que algo seja calculado antes; aqui esta um exemplo: poe 3/241 25 poe 3/ (241) 1.0 A primeira linha calcula 3 dividido por 2 antes e, em seguida, soma 1, resultando em 25. A segunda linha calcula 2 mais 1 antes ¢ 0 resultado ¢ 3 dividido por 3, que € igual al. Outro operador a sua disposigio € 0 operador de poténcia, que calcula um valor elevado a uma poténcia. Por exemplo, 2 elevado a 3 € 0 mesmo que 2°2°2. O ope- rador de poténcia € ** ¢ funciona com inteiros e com mtimeros de ponto flatuante. Aqui esto dois exemplos do operador de poténcia em agao poe 283 8 pop 3.084 81.0 © Python 3 lida com célculos e com informagées numéricas de maneira bastante previsivel, de modo diferente de seu antecessor de diversas linguagens diferentes. Muitas linguagens tém um intervalo que varia de -2,147 bilhdes a 2,147 bilhdes, ” Introducao ao Desenvolvimento de Jogos com Python e PyGame © que resulta em um intervalo um pouco maior do que 4 bilhdes. O Python 3, porém, nao tem essa limitagao. Vamos criar um mimero grande ao calcular 2 clevado a 100, que corresponde a 2x2x2x2...x2, com o 2 repetido 100 vezes. >>> 2##100 1267650600228229401496703205376 Esse é um mimero bem grande! Se vocé estiver se sentindo corajoso, experimen- te calcular 2**1000 ou até mesmo 2**10000 e observe sua tela ser preenchida com mimeros enormes. Vamos apresentar mais um operador antes da proxima segio. O operador de médulo (X) calcula 0 resto de uma divisao. Por exemplo, 15 médulo 6 é igual a 3, pois 6 cabe duas vezes em 15 e sobram 3. Vamos pedir ao Python que faca esse célculo para nés: pos 15K6 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 orc! atingindo uma armadura com um machado +1. Nao sei muito sobre orcs, mas vamos calcular essa gorjeta sobre dois pratos de fugu-sashi (baiacu servido cru — uma iguaria do Japao que espero poder provar algum dia). O fugu é muito caro, mais de 200 délares, pois, se no for preparado por chefs especialmente treinados, comé-lo poder ser fatal! Vamos supor que encontramos um restaurante em Toquio que sirva um prato tentador de fugu por 100 délares. Podemos usar 0 Python para calcular a gorjeta para nés >>> (100*2)*15/100 30.0 Essa linha calcula 15% sobre o prego de dois pratos de 100 délares — uma gorjeta de 30 dolares. E adequado para esse restaurante, porém os nimeros mudario de acordo com 0 local em que comprarmos 0 nosso fugu € a qualidade do servigo. Podemos deixar isso mais claro e mais flexivel ao usar varidveis. Uma varidvel é um nome para um valor; quando criamos uma varidvel, ela poderd ser usada no NT: Ore ou Ork (termo vindo do latim Orcus, um dos titulos de Plutao, o senhor do mundo dos mortos), aparece nas linguas germanicas e nos contos de fantasia medieval como uma criatura delormada e forte, que combate contra as forgas “do bem’ Este conceito foi popularizado nos romances de Tolkien © Hobbit ¢ O Senhor dos Aneis ¢ Virou recorrente em jogos de RPG de mesa ou RPG eletronico |... Fonte: hutps:pt.wikipedia orgtwiki/Ore) Capitulo 1 = Introdugao ao Python 25 lugar do préprio mimero. Em nosso calculo de gorjeta, podemos ter trés variaveis: Para criar 0 preco do fugu, a quantidade de pratos e a porcentagem da gorjet uma variavel, digite seu nome seguido de um sinal de igualdade (=) ¢ o valor que vo quer atribuir a variavel: >o> price = 100 po> plates = 2 poo tip = 15 O sinal de igualdade (=) é conhecido como operador de atribuigio. ™ Cuidado As varidveis Python diferenciam letras maitisculas de mimisculas (sao case sensitive), o que significa que, se os nomes das varidveis usarem tipos diferentes de letras, © Python tratard essas varidveis como totalmente diferentes — ou se} Apples, APPLES ¢ ApPlEs sao tratadas como trés variaveis diferentes. Agora podemos usar essas trés varidveis no lugar dos nimeros. Vamos calcular nossa gorjeta novamente: >>> (pricetplates)*(tip/100) 30.0 Essa linha calcula 0 mesmo valor, mas agora esti um pouco mais clara, pois podemos dizer de imediato o que os mimeros representam. O célculo € também muito mais flexivel porque podemo: mos supor que comemos fugu no café da manha do dia seguinte, porém em um alterar as varidveis e refazer 0 cdlculo. Va- restaurante mais barato (75 délares por prato), em que o servigo nao era tio bom € mereceu apenas 5% de gorjeta: >>> price = 75 o> tip= 5 >>> (price*plates)*(tip/100. ) 7.5 A gorjeta éde 7,50 délares, pois 0 gargom demorou para trazer 0 saqué c cu detesto esperar pelo meu saqu Strings Outro tipo de informagao que o Python pode armazenar é a string. Uma string é uma colegao de caracteres (um caractere € uma letra, um ntimero, um simbolo etc) e pode ser usada para armazenar literalmente qualquer tipo de informagio. 6 Introducao ao Desenvolvimento de Jogos com Python e PyGame Uma string pode conter uma imagem, um arquivo de audio ou até mesmo um video, porém 0 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 estao duas strings; ambas contém exatamente a mesma informagio: "Hello" "Hello! Entio por que ha mais de uma maneira de criar uma string? Boa pergunta; va- mos 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 nao tera nenhuma maneira de saber que vocé quer que a string termine apés a palavra wizard e supora que a string termina no espago apés a palavra said. Vamos testar isso e ver o que acontece: >>> print("I said "hocus pocus" to the wizard.") Traceback ( File "", line 1 print("I said "hocus pocus" to the wizard.") SyntaxError: invalid syntax © Python langou uma excegao. Falaremos mais sobre excecdes posteriormente neste livro, mas, por enquanto, se vocé vir uma exceg%o como ssa, é sinal de que 0 Python est informando que algo esta errado com 0 c6digo que voce forneceu. Podemos contornar 0 problema de incluir aspas em strings ao usar 0 simbolo alternativo de aspas, Vamos testar a mesma frase, porém com aspas simples (') desta vez: >>> print('I said "hocus pocus" to the wizard. ') T said "hocus pocus" to the wizard. © Python ficou bastante satisfeito com isso e nao langou uma excegio dessa vez. Provavelmente, essa € a maneira mais facil de contornar o problema da aspas, porém ha outras opgées. Se voce digitar um caractere de barra invertida (\) antes de um caractere de aspas, isso dird ao Python que vocé no quer que a string, termine nesse ponto — vocé s6 quer incluir o simbolo de aspas na string, O ca- ractere de barra invertida é conhecido como “caractere de escape” em Python. Aqui esta um exemplo: >>> print("E said \"hocus pocus\" to the wizard.") I said "hocus pocus" to the wizard. Capitulo 1 = Introdugao ao Python a Isso resolve o problema de um modo diferente, porém o resultado é 0 mesmo. Apesar do risco de sobrecarregar vocé com informagées demais, ha outra maneira ‘plas (''') ow com aspas duplas triplas ("""), o Python saber que a string nao terminara até de definir strings: se vocé iniciar uma string com aspas simples 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 esta nossa string novamente com aspas triplas: >> print("""T said "hocus pocus" to the wizard.""") T said "hocus pocus" to the wizard. Concatenando strings Agora temos diversas maneiras de criar strings, mas 0 que podemos fazer com clas? Assim como os ntimeros, as strings tém operadores que podem ser usados para criar novas strings. Se duas strings forem somadas, vocé obtera uma nova string contendo a primeira string ¢ a segunda string concatenada no final. As strings podem ser somadas com 0 operador +, assim como fazemos com os mi- meros; vamos testar isso: >>> "I love "+"Python!" "I Love Python!" © Python somou duas strings ¢ exibiu o resultado. A soma de strings dessa maneira é chamada de concatenagio de strings. Duas strings quaisquer podem ser concatenadas, porém nao é possivel concatenar uma string com um ntimero. Vamos testar isso, de qualquer modo, para ver © que acontece: po “high "+5 Traceback (most recent call last): File "", line 1, in ? TypeError: cannot concatenate ‘str’ and ‘int’ objects Nesse caso, tentamos gerar a string ‘high 5' ao somar o ntimero 5 a uma string, Essa instrugdo no faz sentido para o Python, ¢ ele informa isso langando outra excegio. Se quiser concatenar um ntimero a uma string, inicialmente sera neces- sdrio converter esse ntimero em uma string. Podemos criar strings facilmente a partir de ntimeros ao compor uma nova string a partir desse mimero. Aqui esta 0 modo de criar nossa string high 5. pop “high “sstr(5) ‘high 5! B Introducao ao Desenvolvimento de Jogos com Python e PyGame Essa instrugio funciona porque str(S) cria uma string a partir do mtimero 5, e 0 Python ficard satisfeito em concatena-la com outra string. ‘Também podemos usar 0 operador de multiplicagéo (*) com strings, porém as strings podem ser multiplicadas somente com inteiros. Adivinhe o que a linha de codigo Python a seguir fara pop ‘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 nao suportam todos 0s ope- radores matematicos como / e - porque 0 que eles fariam nao ¢ intuitive. O que oranges" poderia possivelmente significar? "apples" Fazendo parse de strings Como uma string pode ser imaginada como uma colegio de caracteres, geralmente sera util poder referir-se as partes dela em vez de referencié-la como um todo. O Python faz isso com o operador de indice, que consiste de colchetes [] contendo 0 offset do caractere, O primeiro caractere € [0], 0 segundo € [4], 0 terceiro é [2] e assim por diante. Comecar em 0 e nao em 1 pode parecer um pouco estranho, porém é uma tradigo entre as linguagens de computador, e voce percebera que isso, na verdade, simplificaré 0 scu trabalho quando vocé escrever mais codigos Python. Vamos ver a indexagio de strings em ago. Inicialmente, criaremos uma varidvel contendo uma string, 0 que ¢ feito exatamente como no caso dos ntimeros: >o> my_string = ‘Fugu-sasht! >>> print(ny_string) "Fugu-sashi Normalmente, vocé daria um nome melhor as strings, porém, nesse pequeno exemplo, chamaremos a varidvel simplesmente de ny_string (0 caractere de unders- core entre my ¢ string € usado no lugar de um espago, pois o Python nao permite usar espagos nos nomes de varidveis). Podemos selecionar letras individuais da string usando 0 operador de indice: >>> my_string[0] ft >>> ny_string[3] ny_string[0] resulta em uma string com o primeiro caractere de fugu-sashi, que € fA segunda linha resulta no quarto caractere, pois o primeiro caractere tem offset Capitulo 1 = Introdugao ao Python 29 igual a 0, ndo 1. Procure pensar no offset ndo como o ntimero do caractere, mas como 05 espagos entre os caracteres (veja a figura 11); isso deixard a indexagao um pouco mais intuitiva. Figura 1.1 — Indexacdo de string. Vamos supor que queremos descobrir qual € 0 tiltimo caractere de uma string, A i” no offset 9; porém o mos a string previamente? Poderfamos ter extra partir da figura Ll, podemos ver que o tiltimo caractere que aconteceria se nao conhe ido a string de um arquivo, ou 0 jogador poderia té-la digitado em uma tabela das melhores pontuagdes. Para descobrir qual é o tiltimo offset, inicialmente devemos descobrir o tamanho da string, o que pode ser feito com a fungdo len. Pense em uma fungio como um cédigo Python armazenado; passamos algumas informa- gSes a fungéo, que as usaré para realizar alguma acio e retornar, possivelmente com novas informagées. E exatamente isso que Len faz; nds lhe fornecemos uma string ¢ ela retorna o tamanho dessa string. Vamos testar a fungao Len em my_string >>> Len(ny_string) 10 Hé 10 caracteres em my_string, porém nao podemos usar 10 como offset, pois ele estar no final da string, Para obter o tiltimo caractere, devemos usar o offset an- tes de 10, que é simplesmente 9, portanto subtraia 1. Eis modo de usar Len para encontrar o tiltimo caractere de uma string: >> ny_string[len(ny_string)-1] v Espero que vocé concorde que é bem simples! Porém o Python pode facilitar mais ainda essa operago para nés por meio da indexagdo negativa. Se vocé indexar com um ntimero negativo, o Python © trataré como um offset a partir do final da string; desse modo, [-4] € 0 ultimo caractere, [-2] € 0 pemtiltimo caractere, € assim sucessivamente (veja a figura 1.2). 30 Introducao ao Desenvolvimento de Jogos com Python e PyGame Agora podemos descobrir qual € 0 tltimo caractere com um pouco menos de cédigo: >>> my_string[-1] ? Slicing de strings Além de extrair caracteres individuais de uma string, podemos selecionar gru- pos de caracteres ao fazer o slicing (fatiamento) de strings. O slicing funciona de modo muito semelhante a indexag&o, porém usamos dois offsets separados por dois-pontos (;). O primeiro offset € 0 local em que o Python deve iniciar o slicing; 0 segundo offset é 0 local em que o slicing deve terminar. Novamente, pense nos offsets como os espacos entre 0s caracteres, ¢ nao como os caracteres. propriamente ditos. >o> my_string[2:4] ‘gu >>> my_string[5:10] ‘sashi' A primeira linha diz ao Python para criar um slice entre os offsets 2 ¢ 4, Pode- mos ver, a partir do diagrama, que ha dois caracteres entre esses offsets: g ¢ u. O Python os retorna como uma tinica string, isto é como ‘gu’. A segunda linha fatia a string entre os offsets 5 ¢ 10 ¢ retorna a string 'sashi'. Se vocé deixar o primeiro offset indefinido, o Python usara o inicio da string; se o segundo offset estiver indefinido, o final da string sera usado. po> ny_string[ 4] "Fugu' >o> ny_string[S: ] "sashi! O slicing pode receber outro valor, que sera usado como o valor de incremento (step). Se o valor de incremento for 1 ou se ele nao for especificado, o Python sim- plesmente retornaré o slice entre os dois primeiros offsets. Se vocé criar o slice com um valor de incremento igual a2, uma string formada pelos caracteres obtidos a cada dois caracteres da string original ser retornada. Um incremento igual a 3 retornara uma string formada pelos caracteres obtidos a cada trés caracteres da string original e assim por diante. Eis alguns exemplos desse tipo de slicin; Capitulo 1 = Introducao ao Python 31 po» my_string[::2] "Fg-ah' >>> ny_string[ 3] ws A primeira linha cria um slice a partir do inicio até o final da string (porque os. dois primeiros offsets foram omitidos), porém, como o valor de incremento é 2,a string sera formada pelos caracteres obtidos a cada dois caracteres da string ori- ginal. A segunda linha comega 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 sera feito do segundo offset para o primeiro, Esse recurso pode ser usado para inverter facilmente uma string: >o> ny_string[::-1] "ihsas-uguf" >>> my_string[::-2] "issu! ‘A primeira linha simplesmente retorna uma string com os caractere na ordem inversa. Como 0 valor do incremento € negativo, o slice sera criado do final para o inicio da string, Métodos de string Juntamente com esses operadores, as strings tém diversos métodos; os métodos sto fungées contidas em objetos Python e podem realizar alguma aco sobre eles. As strings Python contém diversos métodos titeis para ajudar vocé a trabalhar com strings. Aqui estao somente alguns deles, aplicados a nossa string fugu-sashi >e> ny_string. upper() "FUGU- SASHI' >>> ny_string.capitalize() ‘Fugu-sashi' po» ny_string. title() "Fugu-Sashi' Nesse exemplo, aplicamos varios 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 maitisculas, capitalize retorna uma nova string com o primeiro caractere convertido em letra maitiscula e title 32 Introducao ao Desenvolvimento de Jogos com Python e PyGame retomna uma nova string com o primeiro caractere de cada palavra convertido em letra maitscula, Esses métodos nao exigem nenhuma outra informagao, porém 0s parénteses continuam sendo necessarios para dizer ao Python que a funcao deverd ser chamada. = Nota As strings Python sio imutdveis, o que significa que a string nao podera ser modificada depois que for criada, porém é possivel criar novas strings a partir dela, Na pratica, raramente voce perceberd isso, pois criar novas strings ¢ muito facil (€ 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 alienigena, uma bala ou uma arma seria muito magante! Os objetos Python que armazenam outros objetos so conhecidos como colegdes, ¢ uma das colegdes mais simples ¢ usada com mais frequéncia é a lista. Vamos comegar criando uma lista vazia po> my_list=[] Qs colchetes criam uma lista vazia, que entao € atribuida a variavel ny_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 armazenard nossas compras da semana e vamos adicionar dois itens a ela >>> ny_List. append( ‘chopsticks') >> my_List.append(' soy sauce") Nesse exemplo, adicionamos duas strings a ry_list, mas poderiamos teradicionado qualquer outro objeto Python com a mesma facilidade, inclusive outras listas. Se vocé digitar my_list no prompt do Python agora, o contetido da lista sera exibido p> ny List ['chopsticks', 'soy sauce'] Nesse caso, podemos ver que as duas strings esto agora armazenadas na lista. Nao podemos sobreviver somente com hashis (chopsticks) ¢ molho de soja (soy sauce), entao vamos acrescentar mais alguns itens a nossa lista de compras: >>> ny_List. append wasabi!) >>> my_List.append( 'Fugu') >o> ny_List. append( 'sake') Capitulo 1 = Introdugao ao Python 33 >> my_List.append( ‘apple pie’) >>> ny list ['chopsticks’, ‘soy sauce’, ‘wasabi’, ‘fugu ‘sake’, ‘apple pte’) Modificando itens da lista As listas em Python so mutdveis, o que significa que elas podem seralteradas apos terem sido criadas, Assim como ¢ possivel obter o contetido de uma lista usando 0 operador de indice, podemos alterar o item em qualquer indice 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 atribuigao (2): >>> ny_list[1]='dark soy sauce’ >o> ny_list ['chopsticks', ‘dark soy sauce’, 'wasabi', ‘fugu’, ‘sake’, ‘apple pie'] Removendo itens da lista Alem de alterar itens de uma lista, podemos remover itens. Vamos supor que que- remos remover apple pie porque esse item parece nao estar adequado ao restante de nossa lista de compras. Podemos fazer isso com 0 operador del, que remover qualquer item de nossa lista — nesse caso, € 0 ultimo item, portanto usaremos a indexacio negativa: >> del my_list[-1] >>> ny_list ['chopsticks', ‘dark soy sauce’, 'wasabi', ‘fugu', ‘sake"] As listas suportam diversos operadores que funcionam de modo semelhante as strings. Vamos dar uma olhada no slicing ¢ na indexag&o, que vocé achara bastante familiar: o> my_List[2] "wasabi" poo my list[-1] "sake! A primeira linha retorna a string no offset 2, que corresponde terceira posigio 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 no caso das strings, [-1] retorna o ultimo item. 9 negativa e, assim como 34 Introducao ao Desenvolvimento de Jogos com Python e PyGame Osicing de listas funciona de modo semelhante ao slicing de strings, exceto pelo fato de uma nova lista, e nao uma string, ser retornada. Vamos fatiar nossa lista de compras em duas partes: >>> ny Listl:2] ['chopsticks', ‘dark soy sauce'] p> my_List[2:] ['wasabi', ‘fugu', 'sake'] No primeiro slice, pedimos ao Python que nos desse todos os itens, do inicio da lista até 0 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 espagos entre os objetos da lista, € ndo como os objetos propriamente ditos. Sendo assim, o offset 0 esta antes do primeizo item ¢ 0 offset 1 esta apés o primeiro item ¢ antes do segundo. Também podemos somar listas com 0 operador +. Ao somar listas, criamos uma inica lista contendo os itens de ambas as listas. Vamos criar uma nova lista somé-la 4 nossa lista de compras: poe my_list2 = ['ranen', ‘shiitake mushroons'] pop my_list += my_list2 pe ny list ['chopsticks', ‘dark soy sauce’, 'wasabi', ‘fugu’, ‘sake’, ‘ramen’, ‘shiitake mushrooms '] A primeira linha cria uma nova lista de strings chamada ry_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 jd incluidos. A segunda linha utiliza o operador 4=, que é um atalho conveniente: ny_Liste=ny_list2 é0 mesmo que ny_lis as duas listas ¢ armazenar o resultado de volta em ny_list. y_listeny_List2, que tem o efeito de somar Métodos de lista Juntamente com esses operadores, as listas suportam diversos métodos. Vamos usar 0 método sort para ordenar nossa lista de compras em ordem alfabética: p> ny list. sort() p> my. list ['chopsticks', ‘dark soy sauce’, 'fugu', 'ramen', 'sake', ‘shiitake mushroons' ‘wasabi'] Capitulo 1 = Introdugao ao Python 35 O método sort ordena o contetido da lista. A ordem depende do contetido da lista, mas, em uma lista de strings, a ordem sera alfabética. Vocé percebera que 0 Python nao exibe nada apés a chamada a sort; isso ocorre porque sort nao retorna uma lista ordenada, mas apenas ordena a lista na qual cle foi chamado. A segunda linha é necessaria para pedir ao Python que exiba o contetido de nossa lista. Vamos supor que faremos compras ¢ queremos retirar um item da lista para procuré-lo em um supermercado, Podemos fazer isso com 0 método pop, que remove um item da lista e o retorna: >>> ny_List.pop(@) " chopsticks’ Pedimos a ny_list para fazer o “pop” do item que esta no offset 0, que € chops ticks Se exibirmos agora o contetido da lista de compras, veremos que o primeiro item foi removido o> ny_list ['fugu', ‘ramen’, 'sake', ‘shiitake mushroons', ‘soy sauce’, ‘wasabi'] Ha mais métodos de lista além daqueles discutides aqui. Consulte a tabela L1 para ver outros métodos. Tabela 11 — Métodos de lista do Python Método Descrigéo append —_| Concatena itens a lista. count | Contabiliza o nimero de vezes que um item ocorre em uma lista, extend | Adiciona itens de outra colecdo. ‘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. erove | Remove um item em particular de uma lista. reverse | Inverteallista sort Ordena a lista. 36 Introducao ao Desenvolvimento de Jogos com Python e PyGame Tuplas Outra colegio que apresentaremos nesta seco ¢ a tupla. As tuplas so semelhantes as listas, exceto pelo fato de serem imutaveis, ou seja, assim como as strings, depois que forem criadas, seu contetido nao podera ser alterado. As tuplas geralmente s40 usadas preferencialmente no lugar das listas quando as informagoes que elas contém estiverem, de algum modo, associadas — por exemplo, uma tupla pode representar um mimero de telefone ¢ um cédigo de area porque ambas as partes so necess- rias na discagem. Elas séo criadas de modo semelhante as listas, porém utilizam parénteses, isto é, (), no lugar de colchetes. Vamos criar uma tupla que armazene 0 ntimero de telefone de nosso restaurante preferido de sushi para viagem: >>> my_tuple=('555', "EATFUGU') >>> ny_tuple ('S5', "EATFUGU') Nesse exemplo, criamos uma tupla com duas strings contendo 0 cédigo de area eo ntimero de nosso restaurante que prepara fugu para viagem. Para provar que uma tupla é imutavel, vamos tentar acrescentar um item a ela: >o> my_tuple.append( ramen") Traceback (most recent call last): File ">> ny_tuple[o] ‘ss5° >>> my_tuple[t] " EATFUGU' Desempacotamento Como as tuplas geralmente so usadas para passar valores em grupo, o Python disponibiliza uma mancira simples de extrair esses dados; esse método se chama desempacotamento (unpacking). Vamos desempacotar nossa tupla em duas variveis: uma para o cédigo de 4rea ¢ outra para o mimero. Capitulo 1 = Introdugao ao Python 37 >a> my_tuple=('555', 'EATFUGU') >>> area_code, number = my tuple >>> area_code ‘gg >>> nunber "EATFUGU' Nesse exemplo, podemos ver que, em uma tinica 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 criagéo de uma lista usando a tupla como parametro — por exemplo, List(my_tuple) retorna a lista equivalente, que é ['555', ‘EATFUGU' ]. Também podemos fazer 0 inverso criar uma tupla ao chamar tuple em uma lista— por exemplo, tuple({'555', "EATFUGU' ]) retorna a nossa tupla original. Veremos quais sio os melhores lugares para usar tuplas no lugar de listas nos proximos capitulos; por enquanto, utilize a regra geral segundo a qual vocé dever usar uma tupla se 0 seu contetido 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 expresses semelhantes as expresses mateméticas. Para definir ‘uma tupla com apenas um item, acrescente uma virgula apés o item; para definir uma tupla vazia, basta incluir a virgula sozinha entre parénteses. Por exemplo, Cranen’,) é uma tupla com um item e (,) € uma tupla vazia Dicionarios O ultimo tipo de colegao que veremos ¢ 0 diciondrio. Todas as colegées anteriores que vimos eram colegSes sequenciais, pois os valores estavam em uma sequéncia, do primeiro até o tltimo, e podiamos acessé-los de acordo com a sua posicio na lista. Os diciondrios so colegGes de mapeamento, pois mapeiam uma informacao em outra, Podemos usar um diciondrio para armazenar os pregos de nossa lista de compras ao mapear © nome do item alimenticio ao seu prego. Vamos supor que o fugu custe 100 délares eo ramen custe 5 délares; podemos criar um dicionario que armazene essas informagdes da seguinte maneira: >>> ny_dictionar "ranen': 5.0, 'fugu': 100.0} 38 Introducao ao Desenvolvimento de Jogos com Python e PyGame ‘As chaves criam um dicionario. Dentro das chaves, temos a string 'ranen' seguida de dois-pontos ¢ o ntimero 5.0 (preco em délares). Isso diz ao Python que a string esta mapeada ao ntimero; em outras palavras, podemos consultar o prego se ti vermos o nome do item alimenticio. Varios itens de um dicionario so separados com uma virgula; nesse exemplo, temos um segundo item que mapeia 'fugu' ao valor 100.6. Para obter essa informagio, utilizamos novamente 0 operador de colchetes ({]) passando-lhe a chave (key) que queremos consultar (nesse caso, a chave € Fugu ou rane). © diciondrio retorna o valor associado a chave — isto é, 0 prego do item. Vamos dar uma olhada em nossas duas chaves: >>> ny_dictionarytFugu'] 100.0 po» my_dictionaryl'ranen'] 5.0 Também podemos adicionar novos itens ao dicionario ao atribuir novos valores ale: >>> ny_dictionaryl ‘chopsticks’ >>> ny_dictionaryf'sake! J=19.95 ooo ny_dictionary {'sake': 19.0, ‘ranen': 5.0, ‘chopsticks': 7.5, ‘fugu’: 100.0} Nesse caso, adicionamos dois novos itens ao dicionario, Talvez voce tenha perce- bido que, quando o Python exibe a lista para nds, os itens esto em uma ordem diferente daquela usada quando criamos originalmente o dicionario. Isso ocorre porque os dicionarios nao tém nenhuma nogao de ordem para as chaves de um. dicionario, e 0 que voce vé sendo exibido nao esté em nenhuma ordem em parti- cular. O importante é que o Python lembra quais chaves estio mapeadas a quais valores —¢ faz. isso muito bem! Loops Um loop (lago) € uma mancira de executar uma porgio de cédigo mais de uma vez. Os loops so fundamentais nas linguagens de programagao, e vocé vera que quase toda linha de cédigo escrita em um jogo estaré dentro de algum tipo de loop. Assim como muitas outras linguagens de programagao, 0 Python tem dois tipos de loop para cuidar de todas as suas necessidades de looping: o loop while © 0 loop for. Capitulo 1 = Introdugao ao Python 39 Loops while Um loop while é usado quando vocé quer repetir uma porgdo de codigo somente quando ~ ou enquanto — uma condigao for verdadeira. Vamos usar um loop while simples para exibir os mimeros de 1 a 5. Comegaremos digitando as linhas a seguir no interpretador: >>> count=! pep while counte=5: Ao teclar Enter apés a segunda linha, vocé percebera que, em vez do prompt Python usual, vocé vera agora trés pontos (....) Isso ocorre porque os dois-pontos no final da linha indicam que ha mais codigo por vir. No caso de um loop while, € 0 cédigo que queremos que seja repetido. ‘Todas as linguagens devem ter alguma maneira de marcar 0 inicio ¢ o fim dos blocos de cédigo. Algumas usam simbolos como chaves ({ }), enquanto outras usam palavras como do ¢ end. O Python faz isso de maneira um pouco diferente ¢ utiliza a indentagdo para definir os blocos de c6digo. Para dizer ao Python que uma linha de cédigo faz. parte de um bloco ¢ nao do restante do cédigo, insira uma tabulagio antes da linha (pressionando a tecla Tab): print(count) = counts: "Nota Em alguns sistemas, vocé veré que uma tabulagdo serd inserida automaticamente na primeira linha de um bloco. Isso poder ser conveniente se houver bastante cédigo em um bloco. Apague a tabulagio e tecle Enter normalmente para finalizar bloco. Tecle Enter duas vezes apés a tiltima linha; a linha em branco diz ao interpretador que vocé acabou de digitar o bloco de cédigo. O loop while agora sera executado ¢ exibird os mimeros de 1a 5, Entao, como isso funciona? Bem, apés a instrucio while, hd uma condicdo (count<=5), que pode ser lida como “count é menor ow igual a 5?” Na primeira vez que o Python encontra o loop while, count é igual a 1, 0 que satisfaz a nossa condigao de ser menor ou igual a 5 — desse modo, o Python exe- cuta o bloco de cédigo. As duas linhas no bloce de c6digo inicialmente exibem 0 valor de count ¢, em seguida, somam um a ele, Apés a segunda linha, count ¢ igual a 2, 0 que também satisfaz a condicao, ¢ passaremos pelo loop novamente. Em algum momento, count sera igual a 6, que, definitivamente, ndo ¢ menor ou igual a5 ¢, dessa vez, o Python ignorara o bloco de codigo. 40 Introducao ao Desenvolvimento de Jogos com Python e PyGame Menor ow igual a (<=) € apenas um operador de comparagio. Consulte a tabela 1.2 para ver outros operadores que podem ser usados. Tabela 1.2 — Operadores de comparacao Operador Descrigao < [Menor que Menor ou igual a «< > |Maiorque > Maior ou iguala Igual a Diferente de © Guidado ‘Tome cuidado com seus loops! Se voc® usar uma condigo que seja sempre verdadeira, por exemplo, 21, o Python permanecera no loop indefinidamente. Se vocé se vir nessa enrascada, pressione Ctrl+C para interromper imediatamente 0 Python, Todo programador ja ficou preso em um loop infinito pelo menos uma vez! Loops for Os loopswhile tém seus usos ¢ é importante saber utiliza-los, porém, geralmente, 0 loop for sera uma opgio mais adequada. Um loop for é executado com um objeto Python iterdvel, que forneceré um novo valor até que nao haja mais itens restantes. Vocé ja conheceu os iteraveis: Listas, tuplas, diciondrios e até mesmo strings sio objetos iteraveis. Vamos reescrever 0 loop while do exemplo como um loop for: pe» for count in range(0,6): print(count) Nesse caso, estamos fazendo uma iteragio pelo resultado da fungio range, que cria uma lista de valores a partir do primeiro parametro até— mas sem incluir—o segundo parametro. Como podemos ver, a chamada a range criou uma lista contendo os mimeros de 0a 5, que € exatamente o que queremos exibir em nosso loop. Quando passar pelo loop fer pela primeira vez, o Python tomara o primeiro valor da lista e 0 atribuird varidvel count; em seguida, o cédigo do loop sera executado, Esse c6- digo simplesmente exibe o valor atual de count na tela. O loop termina apés cinco passagens, quando o final da lista é alcangado. Capitulo 1 = Introdugao ao Python a Se quiser comegar com qualquer niimero que nao seja 0, sera necessario especificar ambos os parametros, mas experimente fazer o seguinte: >>> for count in range(6) print(count) ® Nota Vocé vera que 0 mesmo resultado anterior ser obtido. Python na pratica Antes de prosseguirmos para 0 préximo capitulo, vamos colocar 0 que apren- demos em uso pratico. A aritmética mental nunca foi um de meus pontos fortes portanto gostaria de escrever uma pequena porcio de cédigo Python que percorra a nossa lista de compras ¢ calcule o prego total. Comegaremos criando uma lista que contenha nossas compras para a semana ¢ um dicionario que mapeie o nome de cada item ao seu prego: >>> shoppin ‘Fugu’, ‘ramen’, ‘sake’, ‘shiitake mushroons', ‘soy sauce’, ‘wasabi'] >o> prices={'Fugu’:100.0, 'ranen':5.0, 'sake':45.0, ‘shiitake mushroons':3.5, ‘soy sauce':7.50, 'wasabi': 10.0) >>> total=0.00 Muito bem, timo. Agora temos duas colegdes Python que armazenam todas as informagées relacionadas as nossas compras ¢ uma varidvel para armazenar 0 total. O que devemos fazer agora ¢ percorrer shopping em um loop, consultar cada prego em prices e somé-lo a total: >o> for ite in shopping totalé= pricesfiten] >>> total 171.0 Isso € tudo! A varidvel 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 razoavel: 171 délares. Nao se preocupe; o cédigo de exemplo dos proximos capitulos sera muito mais interessante que uma lista de compras! 2 Introducao ao Desenvolvimento de Jogos com Python e PyGame Resumo Exploramos algumas das construgdes bisicas do Python neste primeiro capitulo; a maioria delas sera usada regularmente quando um cédigo novo for criado, Pode- mos pensar no que aprendemos até agora como as ferramentas basicas do negécio quando se trata de criar jogos ¢ outros programas Python. Os dados (ntimeros ¢ strings) e as colegies (tuplas,listas ¢ diciondrios) sto particularmente fundamenta pois podemos usé-los para armazenar todas as caracteristicas de um jogo. No proximo capitulo, aprenderemos a combinar o que vimos para criar programas mais sofisticados. Vocé aprendera a usar a logica, criar fungées e tirar proveito da cficacia da programagio orientada a objetos,

Anda mungkin juga menyukai