Olá Ana, tudo bem com você?
Peço desculpas pela demora no retorno.
Parabéns por ir além do proposto na aula. Executei seu código e gostaria de deixar algumas recomendações abaixo para que você continue evoluindo seus estudos:
No momento em que o usuário informa uma letra que não está presente na palavra escolhida o erro TypeError: argument of type 'NoneType' is not iterable
é apresentado. Esse erro ocorre na função marca_chute_errado()
, pois ela não está retornando a variável letras_certas
e também a variável tentativas
, assim a função terá um retorno do tipo None
não podendo passar pela validação if
que verifica se há underscore (_) na palavra.
Já na função marca_chute_correto()
, quando temos uma palavra que possui letras repetidas, como por exemplo: “banana”, no momento em que o usuário informa a letra ”a”, a marcação de chute correto está sendo impressa múltiplas vezes, o ideal seria que a mensagem seja impressa apenas uma vez, para isso, basta que o print responsável por imprimir as letras acertadas seja colocado fora do laço de repetição for
presente na função marca_chute_correto()
.
Outro detalhe, é a validação do loop, que está sendo repetido quando o número de tentativas é maior ou igual a zero, porém, dessa forma, o usuário terá uma tentativa a mais. Por isso, recomendo que remova o sinal de igualdade, assim o loop será interrompido no momento em que o número de alternativas chegar a zero (0) e preservar o número real de tentativas programadas: while (tentativas > 0)
.
Abaixo, deixo o código completo com as correções ditas acima:
import random
def jogar():
msg_abertura()
#carrega todas as palavras do arquivo
carrega_palavras()
#seleciona uma palavra dentro do arquivo de palavras
numero = input('Digite um numero de 0 a 7:')
palavra_secreta = carrega_palavra_secreta(numero)
#carrega espaços vazios de acordo com a palavra secreta
letras_certas = inicializa_letras_certas(palavra_secreta)
tentativas = 2 * len(palavra_secreta)
print("\nA palavra secreta é {}:\n".format(letras_certas))
print('Você tem {} tentativas para descobrir a palavra secreta!\n'.format(tentativas))
chutes_realizados = []
while (tentativas > 0):
if('_' not in letras_certas):
msg_vencedor()
break
chute = recebe_chute(chutes_realizados)
if (chute in palavra_secreta):
letras_certas = marca_chute_correto(chute, letras_certas, palavra_secreta)
elif (chute not in palavra_secreta):
tentativas, letras_certas = marca_chute_errado(tentativas, letras_certas)
def msg_abertura():
print("***************************")
print("BEM VINDO AO JOGO DA FORCA!")
print("***************************")
def inicializa_letras_certas(palavra):
return ['_' for letra in palavra]
def carrega_palavra_secreta(numero):
return carrega_palavra(numero).upper()
def carrega_palavras():
return array_de_palavras()
def carrega_palavra(index):
return array_de_palavras()[int(index)]
def array_de_palavras():
arquivo = open('palavras.txt', 'r')
palavras = []
for palavra in arquivo:
#palavra = palavra.strip
palavras.append(palavra.strip())
arquivo.close()
return palavras
def recebe_chute(chutes_realizados):
chute = input('Digite uma letra:\n')
chute = chute.upper().strip()
chutes_realizados.append(chute)
print('letras chutadas: ', chutes_realizados)
return chute
def marca_chute_correto(chute, letras_certas, palavra_secreta):
index = 0
for letra in palavra_secreta:
if (chute == letra):
letras_certas[index] = letra
index += 1
print(letras_certas)
return letras_certas
def marca_chute_errado(tentativas, letras_certas):
print('A letra escolhida não existe na palavra secreta. Você possui {} tentativas.'.format(tentativas - 1))
tentativas -= 1
print(letras_certas)
if (tentativas == 0):
print('\nSuas chances acabaram!! Você não descobriu a palavra secreta.')
print(' ---------------------- FIM DE JOGO -------------------------')
return tentativas, letras_certas
return tentativas, letras_certas
def msg_vencedor():
print('\nParabéns!!! Você descobriu a palavra secreta!!')
print('---------------- FIM DE JOGO -----------------')
if __name__ == "__main__":
jogar()
Após essas modificações o código deverá funcionar corretamente. Fico à disposição em caso de dúvidas.
Abraços e bons estudos!
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!