Como o algoritmo saberá que a palavra esta completa se o 'not enforcou' e o 'not acabou' não virar True e sair do laço?
Como o algoritmo saberá que a palavra esta completa se o 'not enforcou' e o 'not acabou' não virar True e sair do laço?
Por isso ele fica no laço while, o laço faz a contagem dos acertos e erros e deduz o resultado. Abaixo o exemplo de código:
def jogar():
print("*********************************")
print("***Bem vindo ao jogo da Forca!***")
print("*********************************")
palavra_secreta = "banana"
letras_acertadas = ["_", "_", "_", "_", "_", "_"]
enforcou = False
acertou = False
print(letras_acertadas)
while(not enforcou and not acertou):
chute = input("Qual letra? ")
chute = chute.strip()
index = 0
for letra in palavra_secreta:
if(chute.upper() == letra.upper()):
letras_acertadas[index] = letra
index = index + 1
print(letras_acertadas)
print("Fim do jogo")
if(__name__ == "__main__"):
jogar()
Olha o laço, a estrutura dele? Vê se vc consegue entender cada parte!
Da forma que o amigos escreveu aí em cims fica em um loop infinito. Você tem que reatribuir valores para acertou e enforcou ou então um condicional de break.
# coding=UTF-8
import random
import unicodedata
def enforcado(erro):
print ("Você já teve {} erros!".format(erro))
print (" +--------+")
print (" | |")
if (erro > 0):
print(" O |")
else:
print(" |")
if (erro == 2):
print(" | |")
elif (erro == 3):
print(" /| |")
elif (erro > 3):
print(" /|\ |")
else:
print(" |")
if (erro > 5):
print (" | |")
else:
print(" |")
if (erro == 6):
print (" / |")
elif (erro == 7):
print(" / \ |")
else:
print(" |")
print (" |")
print (" ________________")
print (" ________________", end="\n\n")
def pega_chute():
while(True):
print("Digite seu chute:")
chute_dado = ((input("-> ").split())[0]).upper()
try:
chute_dado = int(chute_dado)
print("Digite apenas LETRAS!", end="\n\n")
continue
except:
if (len(chute_dado) > 1):
print("Digite apenas UMA letra!", end="\n\n")
continue
else:
break
return chute_dado
def checar_palavra(chute, palavra_secreta):
posicao = 0
lista_de_posicao = []
for letra in palavra_secreta:
if (chute == ''.join((c for c in unicodedata.normalize('NFD', letra) if unicodedata.category(c) != 'Mn'))):
lista_de_posicao.append(posicao)
posicao += 1
if (len(lista_de_posicao) != 0):
return [True, lista_de_posicao]
else:
return [False, lista_de_posicao]
def imprimir_palavra(n_letras, letras_encontradas):
index = 0
for caracter in n_letras:
if index in list(letras_encontradas.keys()):
print(" {} " .format(letras_encontradas[index]), end="")
else:
print(" _ ", end="")
index += 1
print("", end='\n\n')
def julgamento(acertos, total, jogadas, jogadas_max):
if (acertos - total == 0):
acertou = True
else:
acertou = False
if (jogadas == jogadas_max):
enforcou = True
else:
enforcou = False
return [acertou, enforcou]
def encerramento(acertou, enforcou, palavra_secreta, jogadas_max, erro):
if (acertou):
print("Parabéns, você ganhou!")
if (enforcou):
enforcado(erro)
print ("Você perdeu! Usou todas as suas {} chances." .format(jogadas_max))
print("A palavra secreta era {}!". format(palavra_secreta))
def decide_jogadas(nivel, tamanho_da_palavra):
if (nivel == 1):
return 20
elif (nivel == 2):
return 15
elif (nivel == 3):
return 10
else:
return 7
def pegar_palavra(dificuldade):
lista_de_palavras = []
with open("palavras.txt", encoding="utf-8") as my_file:
for linha in my_file:
lista_de_palavras.append(linha.strip())
palavra_escolhida = random.randrange(0, len(lista_de_palavras))
palavra_secreta = (lista_de_palavras[palavra_escolhida]).upper()
return [palavra_secreta.upper(), len(palavra_secreta)]
def forca(nivel):
letras_encontradas = {}
palavra_secreta = pegar_palavra(nivel)
enforcou = False
acertou = False
jogadas = 0
erro = 0
jogadas_max = decide_jogadas(nivel, palavra_secreta[1])
while(not enforcou and not acertou):
jogadas += 1
imprimir_palavra(palavra_secreta[0], letras_encontradas)
chute = pega_chute()
posicoes = checar_palavra(chute, palavra_secreta[0])
if(posicoes[0]):
for posicao_a_ser_impressa in posicoes[1]:
letras_encontradas.update({posicao_a_ser_impressa:palavra_secreta[0][posicao_a_ser_impressa]})
else:
erro += 1
controle = julgamento(len(letras_encontradas), palavra_secreta[1], jogadas, jogadas_max)
enforcado(erro)
acertou = controle[0]
enforcou = controle[1]
imprimir_palavra(palavra_secreta[0], letras_encontradas)
encerramento(acertou, enforcou, palavra_secreta[0], jogadas_max, erro)
Eu fiz com uma função chamada julgamento().
Voce cria uma condição adicionando +1 nos erros, que quando chegar no erros ==5 o jogo acaba E tambem cria uma condição em que quando nao houverem mais espaços em branco ("_" == 0 ) o jogo acaba. Portanto vc cria essas condições que quando atingidas, as variaveis se tornam verdadeiras