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

Jogo Forca = Acertando Palavra

Boa tarde, estou a concluir o jogo da forca, porém percebi que uma coisa não foi tratada durante o mini curso. Se eu for chutando letra por letra até que a palavra seja preenchida, o jogo não é concluído. Ele só é concluído se eu digitar a palavra inteira. Poderiam por essa correção por favor? No aguardo, obrigado.

9 respostas

Oi Davi, acho que isso é corrigido no curso sim, não? Caso não, me disponibiliza seu projeto pra mim te mostrar a solução e a gente já deixar essa solução disponível para os outros alunos que chegarem a ter esse problema?

Boa tarde,

Claro! Meu projeto está no gitHub. Usuário gitHub: davi7rg

Fico no aguardo. Obrigado.

Oi Davi, vi seu código e pensei em uma solução. Só queria pedir que na próxima vez que disponibilizar o código, joga o link aqui pra gente ser mais direto e também deixar mais fácil pra outras pessoas encontrarem, tá bem?

Bom, a ideia é que a cada letra você verifique se ainda faz sentido pedir mais um chute. Neste caso, se a última letra for chutada e for a certa, não precisamos pedir mais nenhum chute certo? Mas lembrando que precisamos verificar isso em todos os chutes em que a letra for encontrada. Pensando nisso faremos o seguinte...

Dentro do else que avisa que a letra foi encontrada, podemos escrever o seguinte código:

if total_encontrado == 0
    avisa_letra_nao_encontrada
    erros += 1
else
    avisa_letra_encontrada(total_encontrado)

    if !mascara.chars.include? "_"
        avisa_acertou_palavra
    end
end

Mas ai você pode ter um problema, quando a última letra for chutada, ainda teremos caracteres de mascara na palavra mascarada, isso por que a próxima mascara só será feita na próxima rodada.

Então eu consigo pensar agora em duas possiveis soluções. A primeira delas é fazer esse if logo depois de mascarar a palavra ou então fazer o seguinte:

if total_encontrado == 0
    avisa_letra_nao_encontrada
    erros += 1
else
    avisa_letra_encontrada(total_encontrado)

    if mascara.chars.count "_" == total_encontrado
        avisa_acertou_palavra
    end
end

neste caso, quando o chute for feito, eu comparo a quantidade encontrada com o total que falta, se esse número bater, quer dizer que a palavra foi totalmente descoberta.

Testa pra mim? Não cheguei a testar.

Boa tarde Wanderson!

Claro cara, da próxima eu ponho o link aqui sim. Bom, testei as formas que me informou, porém nenhuma das 2 funcionou rsrs Entendi perfeitamente o que foi feito no código que você escreveu acima, em ambos, mas não funcionou mesmo nenhum dos 2 :)

Nossa Davi, pensei que funcionaria de primeira olha! hahahaha! Acontece.

Vou baixar o seu projeto e procurar outra forma. Vou testar aqui pra ter certeza que funciona, acho que vai demorar um pouquinho, tá bem?

Opa Wanderson,

Nada cara, tranquilo, estou a racionar por aqui também :) Se eu encontrar uma solução, eu posto, se encontrar antes de mim pode soltar aqui o/ Valeu!

solução!

Fala Davi, tudo bem? Testei o mesmo código que te passei e funcionou, quando chuto letra a letra até o final da palavra, ele encerra o jogo.

if mascara.count('_') == total_encontrado
    avisa_acertou_palavra
    break
end

Acho que o problema do código anterior era a ausência do break que faria o loop continuar depois de verificar a condição. Com a presença do break, agora o jogo é encerrado certinho. Testa pra mim?

Eu adicionei o código acima logo depois dessa linha:

total_encontrado = palavra_secreta.count(letra_procurada)

Opa Wanderson tranquilo? Cara funcionou sim, eu que lesei aqui kkkk E deixa te falar, além disso ainda fiz uma pequena modificação para mostrar a palavra secreta no final da partida em caso de ganho ou de perca. Fiz o seguinte: Na classe ui.rb, criei a seguinte função:

def palavra_secreta_era(palavra_secreta)
    puts "A palavra secreta era: #{palavra_secreta}"
end

Após feito isso, na classe forca.rb, fiz o chamado nas 2 verificações de ter acertado a palavra toda:

if mascara.count('_') == total_encontrado
        avisa_acertou_palavra
        palavra_secreta_era (palavra_secreta) 
        break
end
if acertou
    avisa_acertou_palavra
    palavra_secreta_era (palavra_secreta)
    pontos_ate_agora += 100
    break
else

e também no final do while em caso de perca :) Abraço grande!

Muito boa a ideia Davi! Parabéns! Precisando de ajuda, conta sempre com a gente aqui, tá bem? Bons estudos.