• Nenhum resultado encontrado

Como o código funciona

Iniciando na linha 61, denimos uma nova função chamadagetRandomWord(), que posui um único parâmetro chamado wordlist. Chamamos esta função para escolher uma palavra secreta da lista words.

6.7. COMO O CÓDIGO FUNCIONA 47

 def getRandomWord(wordList):

 # Esta funcao retorna uma string aleatoria da lista de strings

 wordIndex = random.randint(0, len(wordList) - 1)

 return wordList[wordIndex]

A função getRandomWord() recebe uma lista de strings como argumento para o parâmetro wordList. Na linha 63, armazenamos um índice aleatório, para ser utilizado na lista recebida, na variável wordIndex. Fazemos isto através da função randint(), com dois argumentos, que caracterizam a faixa de números que a função poderá escolher. O primeiro argumento é o zero e o segundo élen(wordList) - 1. O segundo argumento é uma expressão que resulta em um inteiro.

len(wordList)retornará o tamanho (um inteiro) da lista passada para a função.

Diminuímos uma unidade do tamanho da lista, pois os itens são identicados a partir do zero.

Logo, o último item da lista possuirá índice com o valor da quantidade de itens menos 1.

6.7.1 Mostrando a ilustração para o jogador

 def displayBoard(HANGMANPICS, missedLetters, correctLetters, secretWord):

 print(HANGMANPICS[len(missedLetters)])

 print()

Aqui, foi criada uma função que imprimirá a ilustração do jogo de forca, com as letras que o jogador acertou (ou não). Este código dene uma função chamada displayBoard(), que recebe quatro parâmetros. Aqui está o que cada parâmetro signica:

• HANGMANPICS: é a lista de strings de várias linhas que será mostrada como arte ASCII. Passa-remos a variável globalHANGMANPICScomo argumento para este parâmetro.

• missedLetters: é uma string de palpites (letras) que o jogador errou.

• correctLetters: é uma string de palpites (letras) que o jogador acertou.

• secretWord: esta string é a palavra secreta que o jogador deve adivinhar.

A primeira chamada da função print() mostrará a ilustração do jogo. HANGMANPICSé a lista de strings que possuem os passos do corpo do enforcado.

O número de letras em missedLetters armazenará quantos palpites incorretos o jogador fez. Para saber esta quantidade, chamamoslen(missedLetters). Este número é utilizado como índice da listaHANGMANPICS, para que seja impressa a ilustração correta, de acordo com os palpites incorretos. do loopfor. A funçãorange() é frequentemente utilizada com loops for. Veremos esta função adiante.

O argumentoend

Nas linhas 70 e 72 há um segundo argumento fornecido à funçãoprint(), oend=’ ’. Este argumento é opcional. Passando uma string em branco para oendé o mesmo que dizer à função para que uma nova linha não seja inserida ao m da string. Ao invés disso, este argumento faz com que um espaço em branco seja adicionado a string impressa. É por isso que a linha seguinte a ser impressa (no caso da linha 70, a linha 72) aparece na mesma linha que a anterior.

6.7.2 As funções range() e list()

A função range() é fácil de entender. Ela pode ser chamada com um ou dois argumentos inteiros. Quando chamada com um argumento,range()retornará uma série de valores inteiros, de

48 6. JOGO DA FORCA zero ao argumento menos uma unidade. Esta série pode ser convertida para uma lista com a função list().

>>> list(range(10))

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Se forem passados dois argumentos à funçãorange, a lista de inteiros retornada compreende desde o primeiro argumento até o segundo argumento menos uma unidade. Observe:

>>> list(range(10, 20))

[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

A funçãorangeé muito útil, pois frequentemente é usada em loopsfor(que são muito mais poderosos que o loopwhile).

6.7.3 Loops for

O loopforé uma boa ferramenta para percorrer listas de valores. É diferente do loopwhile, que faz repetições enquanto uma condição é verdadeira. Uma sentençafor começa com a palavra-chave for, seguida por uma variável e a palavra-chave in, seguida por uma sequência (como uma lista ou string) ou uma série de valores (retornada pela funçãorange()). Para nalizar a sentença, dois-pontos. A cada iteração, a variável na sentençaforrecebe o valor do próximo item da lista.

Observe o exemplo:

Com loopsfor, não há necessidade de converter o objeto série (range()) para uma lista com o comandolist(). O loop forfaz isto automaticamente. Ele executa o código em seu bloco uma vez para cada item da lista. Cada vez que o código é executado, a variável do loop recebe o valor do próximo item da lista. Logo, não é necessário que a iteração do loop possua números. Observe:

>>> for thing in [’cats’, ’pasta’, ’programming’, ’spam’]:

... print(’I really like ’ + thing) ...

I really like cats I really like pasta I really like programming I really like spam

>>> for i in ’Hello world!’:

... print(i)

6.7. COMO O CÓDIGO FUNCIONA 49

Outro ponto importante sobre loopsfor, é a utilização da palavra-chavein. O uso doinem um loopforé diferente do que foi visto até então. Aqui, oinpossui a utilidade de separar a variável da lista em que será feita a iteração.

O trecho seguinte da função displayBoard() mostra as letras faltantes e cria a string da palavra secreta de todos os palpites errados, com espaços.

 print(’Missed letters:’, end=’ ’)

 for letter in missedLetters:

 print(letter, end=’ ’)

 print()

SemissedLettersfor igual aaush, então este loop imprimiráa u s h. Equivalência de um loopwhilepara um loop for

O loopforé bem semelhante a um loopwhile, mas, quando é necessário realizar uma iteração através de uma lista, um loopfor torna o código mais sucinto. Ainda assim, um loopwhilepode se comportar da mesma forma que um loopforcom linhas extras de código. Observe:

>>> sequence = [’cats’, ’pasta’, ’programming’, ’spam’]

>>> index = 0

>>> while (index < len(sequence)):

... thing = sequence[index]

... print(’I really like ’ + thing) ... index = index + 1

Perceba que é necessário criar mais código para esta alternativa. Visando tornar o código sempre o mais legível e sucinto, o loopforserá amplamente utilizado nos próximos programas.

6.7.4 Mostrando os espaços para as letras da palavra secreta

 blanks = ’_’ * len(secretWord)



 for i in range(len(secretWord)):

 if secretWord[i] in correctLetters:

 blanks = blanks[:i] + secretWord[i] + blanks[i+1:]



 for letter in blanks:

 print(letter, end=’ ’)

 print()

Até então, já sabemos como mostrar ao jogador os palpites errados. Agora, veremos como imprimir linhas em branco para cada letra da palavra secreta. Para tal, utilizaremos o caracter de sublinhado17para as letras não adivinhadas. Inicialmente, uma string com um caractere de sublinhado

17Underscore.

50 6. JOGO DA FORCA para cada letra da palavra secreta é criada na linha 75. Observe que é utilizado o operador∗com o _.

Este operador pode ser utilizado entre uma string e um inteiro. Por exemplo, a expressão’hello’ * 3 resulta em’hellohellohello’. No programa, a variável blanksarmazenará em sublinhados o número de caracteres da palavra secreta.

Em seguida, usamos um loop for para percorrer cada letra da palavra secreta na variável secretWorde substituir o sublinhado com a letra respectiva caso esta exista emcorrectLetters. A linha 79 pode parecer confusa, pois ela utiliza colchetes nas variávels blanks e secretWords, que são strings, não listas. Assim como a funçãolen(), utilizada anteriormente, apenas aceita listas como parâmetros, não strings. Porém, em Python, muitas coisas feitas com listas também podem sem feitas com strings.

Tarefa 6.1

Pesquise sobre string slices em Python.

6.7.5 Substituindo sublinhados por letras adivinhadas corretamente

 for i in range(len(secretWord)):

 if secretWord[i] in correctLetters:

 blanks = blanks[:i] + secretWord[i] + blanks[i+1:]

Vamos ilustrar este bloco através de um exemplo. Suponha que a palavra secreva emsecretWord seja ’otter’e que o jogador adivinhou as letras tr, armazenado em correctLetters. Assim, len(secretWord)retornará 5. Desta forma,range(len(secretWord))retornará[0, 1, 2, 3, 4]. Devido ao valor de i tornar-se cada elemento da série a cada iteração, o loop for, neste exemplo se torna o seguinte:

if secretWord[0] in correctLetters:

blanks = blanks[:0] + secretWord[0] + blanks[1:]

if secretWord[1] in correctLetters:

blanks = blanks[:1] + secretWord[1] + blanks[2:]

if secretWord[2] in correctLetters:

blanks = blanks[:2] + secretWord[2] + blanks[3:]

if secretWord[3] in correctLetters:

blanks = blanks[:3] + secretWord[3] + blanks[4:]

if secretWord[4] in correctLetters:

blanks = blanks[:4] + secretWord[4] + blanks[5:]

Reescrevendo:

if ’o’ in ’tr’: # Condição é falsa, blanks == ’_____’

blanks = ’’ + ’o’ + ’____’ # Esta linha não é executada.

if ’t’ in ’tr’: # Condição é verdadeira, blanks == ’_____’

blanks = ’_’ + ’t’ + ’___’ # Esta linha é executada.

if ’t’ in ’tr’: # Condição é verdadeira, blanks == ’_t___’

blanks = ’_t’ + ’t’ + ’__’ # Esta linha é executada.

if ’e’ in ’tr’: # Condição é falsa, blanks == ’_tt__’

blanks = ’_tt’ + ’e’ + ’_’ # Esta linha não é executada.

if ’r’ in ’tr’: # Condição é verdadeira, blanks == ’_tt__’

blanks = ’_tt_’ + ’r’ + ’’ # Esta linha é executada.

# blanks agora é equivalente a ’_tt_r’

As próximas linhas de código mostram o valor armazenado na variável blanks com espaços entre cada caracter.

 for letter in blanks:

 print(letter, end=’ ’)

 print()

Documentos relacionados