Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

[Dúvida] Adicionar Dificuldade

Conforme a primeira aula de Python, dada para fazer um jogo de "adivinhação", nele colocamos, para que o usuário escolhesse a dificuldade com qual ele iria enfrentar.

Eu queria saber como que poderíamos colocar esse sistema de "dificuldade" dentro do jogo da forca.

No caso eu criei 3 arquivos.txt com palavras diferente, um para cada dificuldade

Fácil = palavras.txt Médio = palavrasMedio.txt Díficil = palavrasDificil.txt

Como posso fazer com que conforme o usuário escolhe a dificuldade, abre um arquivo diferente para ele enfrentar no jogo?

Segue o código abaixo:

import random


def imprime_mensagem_abertura():
    print("********************************")
    print("***Bem vindo no jogo da Forca***")
    print("********************************")

def escolher_dificuldade():

    print("Qual nível de dificuldade?")
    print("(1) Fácil (2) Médio (3) Difícil")

    nivel = int(input("Define o nível: "))


def carregar_palavra(dificuldade):
    if dificuldade == 1:
        arquivo = open('palavras.txt', "r")
    elif dificuldade == 2:
        arquivo = open('palavrasMedio.txt',"r")
    elif dificuldade == 3:
        arquivo = open('palavrasDificil.txt',"r")

    with open(arquivo, 'r') as file:
        palavras = file.read("palavras.txt","palavrasMedio.tzt", "palavrasDificil.txt").splitlines()

    return palavras

def carrega_palavra_secreta():
    arquivo = open("palavras.txt", "r")
    palavras = []
    arquivo = open("palavrasMedio.txt", "r")
    palavras = []
    arquivo = open("palavrasDificil.txt", "r")
    palavras = []

    for linha in arquivo:
        linha = linha.strip()
        palavras.append(linha)

    arquivo.close()

    numero = random.randrange(0,len(palavras))
    palavra_secreta = palavras[numero].upper()
    return palavra_secreta

def inicializa_letras_acertadas(palavra):
    return ["_" for letra in palavra]

def pede_chute():
    chute = input("Qual letra? ")
    chute = chute.strip().upper()
    return chute

def marca_chute_correto(chute, letras_acertadas, palavra_secreta):
    index = 0
    for letra in palavra_secreta:
        if (chute == letra):
            letras_acertadas[index] = letra
        index += 1

def jogar():

    escolher_dificuldade()
    carregar_palavra()
    imprime_mensagem_abertura()


    palavra_secreta = carrega_palavra_secreta()
    letras_acertadas = inicializa_letras_acertadas(palavra_secreta)

    enforcou = False
    acertou = False
    erros = 0

    print(letras_acertadas)

    //restante do código, o qual não achei importante colocar rsrs....
6 respostas

Grande Douglas. Tudo tranquilo?

Existem várias formas de fazer essa mesma tarefa. Levando em consideração que as palavras estão escritas no arquivo cada uma em uma linha diferente, eu faria da seguinte forma:

from random import choice

dificuldade = input("ESCOLHA O NÍVEL DE DIFICULDADE: \n1 - FÁCIL \n2 - MÉDIO \n3 - DIFÍCIL \n> ")

if dificuldade == "1":
    with open('palavras.txt', "r") as file:
        line = [x.strip( ).split( ) for x in file] # Cria uma lista com todas as palavras presentes no arquivo
        sorteada = choice(line)  # Sorteia uma palavra, de forma aleatória, que está na lista de palavras presentes no arquivo
        palavra_secreta = ''.join(sorteada).upper( ) # Atribui a variável a palavra sorteada já no formato de string
elif dificuldade == "2":
    with open('palavrasMedio.txt', "r") as file:
        line = [x.strip( ).split( ) for x in file]
        sorteada = choice(line)
        palavra_secreta = ''.join(sorteada).upper( )
elif dificuldade == "3":
    with open('palavrasDificil.txt', "r") as file:
        line = [x.strip( ).split( ) for x in file]
        sorteada = choice(line)
        palavra_secreta = ''.join(sorteada).upper( ))

Quanto ao resto é só questão de lógica e criatividade e isso, eu creio que você tem. Espero que tenha ajudado.

Opa Adriano tudo e com voce? Obrigado pelo seu tempo em me ajudar.

Mas então, onde que voce colocaria este código? Dentro da definição def jogar( ) ou voce criaria uma outra definição?

Porque eu coloquei ele dentro da definição jogar, mas mesmo assim não funcionou!!

O problema que ocorre, é que os arquivos se misturam.

Exemplo: Se eu seleciono a dificuldade "1" que deveria ler o arquivo "palavras.txt", só que ele acaba lendo os outros arquivos também, sendo que era para ser conforme o usuário selecione, deveria abrir um documento específico. Tipo a dificuldade "2" abrindo o arquivo de "palavrasMedio.txt" e por ai vai.

Então eu estou meio perdido em onde eu estou errando de fato, pois o problema é bem focado na questão de abrir os documentos.

Olá de novo Adriano kkk

Bom eu consegui, resolver aqui o problema, porém user da seguinte forma o código, o problema aparetava ser realmente nas funções.

def imprime_mensagem_abertura():
    print("********************************")
    print("***Bem vindo no jogo da Forca***")
    print("********************************")

def selecione_dificuldade():

    dificuldade = input("Qual o nível da dificuldade? \n"
                        "(1) Fácil (2) Médio (3) Difícil \n")

    return dificuldade


def carrega_palavra_secreta(dificuldade):

    if dificuldade == "1":
        arquivo = "palavras.txt"
    elif dificuldade == "2":
        arquivo = "palavrasMedio.txt"
    elif dificuldade == "3":
        arquivo = "palavrasDificil.txt"
    else:
        print("Opção inválida. Escolha uma dificuldade de 1 a 3.")

        return None

    with open(arquivo, "r") as file:
        palavras = [linha.strip() for linha in file]

    palavra_secreta = random.choice(palavras).upper()
    return palavra_secreta


def inicializa_letras_acertadas(palavra):
    return ["_" for letra in palavra]

def pede_chute():
    chute = input("Qual letra? ")
    chute = chute.strip().upper()
    return chute

def marca_chute_correto(chute, letras_acertadas, palavra_secreta):
    index = 0
    for letra in palavra_secreta:
        if (chute == letra):
            letras_acertadas[index] = letra
        index += 1

def jogar():

    imprime_mensagem_abertura()
    dificuldade = selecione_dificuldade()

    palavra_secreta = carrega_palavra_secreta(dificuldade)
    if not palavra_secreta:
        return

    letras_acertadas = inicializa_letras_acertadas(palavra_secreta)

Porém ainda fico curioso onde voce colocaria esse código do "IF" e com a abertura dos arquivos??

Pois como voce falou existem vários metódos de se resolver, gostaria de saber mais a fundo como que funcionaria da forma que voce mostrou.

Muito obrigado pela ajuda de qualquer forma

Grande Douglas.

Desculpe pela demora em responder. O desafio era esse: eu lhe dei a peça que precisava e esperava que você descobrisse onde encaixar. Eu faria quase da mesma forma como você fez. Seria algo assim:

def dificuldade( ):
    dificuldade = input("ESCOLHA O NÍVEL DE DIFICULDADE: \n1 - FÁCIL \n2 - MÉDIO \n3 - DIFÍCIL \n> ")

    if dificuldade == "1":
        with open('palavras.txt', "r") as file:
            line = [x.strip( ).split( ) for x in file] # Cria uma lista com todas as palavras presentes no arquivo
            sorteada = choice(line)  # Sorteia uma palavra, de forma aleatória, que está na lista de palavras presentes no arquivo
            palavra_secreta = ''.join(sorteada).upper( ) # Atribui a variável a palavra sorteada já no formato de string
    elif dificuldade == "2":
        with open('palavrasMedio.txt', "r") as file:
            line = [x.strip( ).split( ) for x in file]
            sorteada = choice(line)
            palavra_secreta = ''.join(sorteada).upper( )
    elif dificuldade == "3":
        with open('palavrasDificil.txt', "r") as file:
            line = [x.strip( ).split( ) for x in file]
            sorteada = choice(line)
            palavra_secreta = ''.join(sorteada).upper( ))

    return palavra_secreta

def jogar( ):
    palavra_secreta = dificuldade( )
    letras_ocultas = ["_" for letras in palavra_secreta
    chute = input("Qual letra?  ").strip( ).upper( )
    # e segue o baile...

Quanto a misturar na hora de escolher a palavra baseada no nível de dificuldade, posso garantir que isso não vai acontecer. Eu fiz uns testes e todos funcionaram usando arquivos diferentes como você descreveu que usaria. Gostaria de dar umas dicas em relação ao código:

1 - Imagino que você esteja aprendendo agora o conceito sobre funções e está colocando isso em prática. Mas, assim que você já tiver uma certa segurança no uso de funções, limite-se a criá-las somente em casos bem pontuais ou em situações em que determinado trecho de código se repete muitas vezes ao longo do programa. Nem sempre a ideia de dividir para conquistar funciona bem. rsrsrsrsrsrsrs

2 - Cuidado no momento de estabelecer parâmetros e retornos nas funções. Eles são muito úteis, mas precisam ser colocados de forma bem pratica e lógica. Nessa situação, por exemplo:

def selecione_dificuldade():

    dificuldade = input("Qual o nível da dificuldade? \n"
                        "(1) Fácil (2) Médio (3) Difícil \n")

    return dificuldade


def carrega_palavra_secreta(dificuldade):

    if dificuldade == "1":
        arquivo = "palavras.txt"
    elif dificuldade == "2":
        arquivo = "palavrasMedio.txt"
    elif dificuldade == "3":
        arquivo = "palavrasDificil.txt"
    else:
        print("Opção inválida. Escolha uma dificuldade de 1 a 3.")

Ou eu faria assim:

def selecione_dificuldade():

    dificuldade = input("Qual o nível da dificuldade? \n"
                        "(1) Fácil (2) Médio (3) Difícil \n")

    carrega_palavra_secreta(dificuldade)


def carrega_palavra_secreta(dificuldade):

    if dificuldade == "1":
        arquivo = "palavras.txt"
    elif dificuldade == "2":
        arquivo = "palavrasMedio.txt"
    elif dificuldade == "3":
        arquivo = "palavrasDificil.txt"
    else:
        print("Opção inválida. Escolha uma dificuldade de 1 a 3.")

Ou assim:

def selecione_dificuldade( ):

    dificuldade = input("Qual o nível da dificuldade? \n"
                        "(1) Fácil (2) Médio (3) Difícil \n")

    return dificuldade


def carrega_palavra_secreta( ):
    dificuldade = selecione_dificuldade( )
    if dificuldade == "1":
        arquivo = "palavras.txt"
    elif dificuldade == "2":
        arquivo = "palavrasMedio.txt"
    elif dificuldade == "3":
        arquivo = "palavrasDificil.txt"
    else:
        print("Opção inválida. Escolha uma dificuldade de 1 a 3.")

Na primeira situação, eu chamaria o método carrega_palavra_secreta( ) recebendo como parâmetro a variável dificuldade dentro da função selecione_dificuldade( ), pois foi determinado assim quando a função carrega_palavra_secreta( ) foi criada. Na segunda situação, eu retornaria a variável dificuldade na função selecione_dificuldade( ) e no método carrega_palavra_secreta( ) seria criada uma outra variável dificuldade que receberia o retorno da função selecione_dificuldade( )

Eu creio que esses dois pontos precisam de atenção. Quanto ao resto, a pratica vai lhe dar segurança. Douglas, vai em frente e arrebenta. Qualquer coisa, estamos por aí...

Tem um tópico mais antigo que eu fiz onde tem um exemplo de jogo da forca . N

solução!

Poxa muito bacana, realmente existem várias formas de adicionar a "dificuldade" do jogo...

Muito obrigado pela atenção, consegui resolver e sua resposta me ajudou a conseguir.

:D