1
resposta

Segue meu código pronto!!

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):
        chute = recebe_chute(chutes_realizados)

        if (chute in palavra_secreta):
            letras_certas = marca_chute_correto(chute, letras_certas, palavra_secreta)

        if (chute not in palavra_secreta):
            letras_certas = marca_chute_errado(tentativas, letras_certas)

        if('_' not in letras_certas):
            msg_vencedor()
            break

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
            print(letras_certas)
        index += 1
    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 letras_certas

def msg_vencedor():
    print('\nParabéns!!! Você descobriu a palavra secreta!!')
    print('---------------- FIM DE JOGO -----------------')

if __name__ == "__main__":
    jogar()
1 resposta

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!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software