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

Código da erro ao ler acento

O meu código não está tratando acentuação (utf-8). O do professor está lendo normalmente. O que pode ser feito nesse caso?

Erros até agora 2 Chutes até agora ["casa do codigo", "desenvolvedor", "a", "o"] Entre com uma letra ou palavra ó Traceback (most recent call last): 8: from main.rb:4:in <main>' 7: from C:/Users/thamara.cavalcanti/Documents/computacao/jogo_F/jogo_forca.rb:97:injogo_da_forca' 6: from C:/Users/thamara.cavalcanti/Documents/computacao/jogo_F/jogo_forca.rb:97:in loop' 5: from C:/Users/thamara.cavalcanti/Documents/computacao/jogo_F/jogo_forca.rb:98:inblock in jogo_da_forca' 4: from C:/Users/thamara.cavalcanti/Documents/computacao/jogo_F/jogo_forca.rb:57:in joga' 3: from C:/Users/thamara.cavalcanti/Documents/computacao/jogo_F/jogo_forca.rb:37:inpede_um_chute_valido' 2: from C:/Users/thamara.cavalcanti/Documents/computacao/jogo_F/jogo_forca.rb:37:in loop' 1: from C:/Users/thamara.cavalcanti/Documents/computacao/jogo_F/jogo_forca.rb:38:inblock in pede_um_chute_valido' C:/Users/thamara.cavalcanti/Documents/computacao/jogo_F/ui.rb:66:in `pede_um_chute': incompatible character encodings: UTF-8 and CP850 (Encoding::CompatibilityError)

7 respostas

Olá Thamara,

Verifica qual a codificação dos arquivos no seu projeto, você encontra isso normalmente na parte de baixo a direita no seu editor.

Caso a codificação não esteja em utf-8, muda para utf-8. É importante verificar isso em todos os arquivos do seu projeto.

Lucas, obrigada por responder. Todos os arquivos estão como UTF-8 mesmo, eu já havia validado isso.

Certo, manda aqui o seu código completo por favor pra mim testar.

jogo_forca.rb ->>>

require_relative 'ui'
require_relative 'rank'

def sorteia_palavra_secreta
    avisa_escolhendo_palavra
    texto = File.read("dicionario.txt")
    todas_as_palavras = texto.split "\n"
    numero_escolhido = rand(todas_as_palavras.size)
    palavra_secreta = todas_as_palavras[numero_escolhido].downcase
    avisa_palavra_escolhida palavra_secreta
end

def palavra_mascarada(palavra_secreta,chutes)
    mascara = ""
    for letra in palavra_secreta.chars
        if chutes.include? letra
            mascara << letra
        else
            mascara << "_"
        end
    end
    mascara
end

def pede_um_chute_valido(chutes,erros,mascara)
    cabecalho_de_tentativas chutes,erros, mascara
    loop do
        chute = pede_um_chute

        if chutes.include? chute
            avisa_chute_efetuado(chute)
        else
            return chute       
        end   
    end    
end

def joga(nome)
    palavra_secreta = sorteia_palavra_secreta
    erros = 0
    chutes = []
    pontos_ate_agora = 0

    while erros < 5

        mascara = palavra_mascarada palavra_secreta,chutes
        chute = pede_um_chute_valido chutes,erros, mascara

        chutes << chute

        chutou_uma_letra = chute.size == 1
        if chutou_uma_letra
            total_encontrado = palavra_secreta.count (chute[0])

            if total_encontrado == 0
                avisa_letra_nao_encontrada
                erros += 1
            else
                avisa_letra_econtrada total_encontrado
            end
        else
            acertou = chute == palavra_secreta
            if acertou
                avisa_acertou_palavra

                pontos_ate_agora += 100
                break
            else
                avisa_errou_palavra
                pontos_ate_agora -= 30
                erros += 1
                if pontos_ate_agora < 0
                    pontos_ate_agora = 0
                end
            end
        end
    end
    avisa_pontos(pontos_ate_agora)
    pontos_ate_agora
end

def jogo_da_forca
    nome = da_boas_vindas
    pontos_totais = 0
    avisa_campeao_atual le_rank

    loop do 
        pontos_totais += joga nome
        avisa_pontos_totais(pontos_totais)

        if le_rank[1].to_i < pontos_totais
            salva_rank nome,pontos_totais
        end
        break if nao_quer_jogar?
    end
end

dicionario.txt --->

8
alura
casa do código
caelum
programador
code smell
desenvolvedor
refatorar
software

ui.rb ---->

def avisa_campeao_atual(dados)
    puts "Nosso campeão atual é: #{dados[0]} com #{dados[1]} pontos. \n\n\n"
end

def avisa_pontos_totais(pontos_totais)
    puts "Você possui #{pontos_totais} até agora"
end

def avisa_chute_efetuado (chute)
    puts"Você ja chutou #{chute}"
end

def avisa_letra_nao_encontrada
    puts "A palavra não contém essa letra! "    
end

def avisa_letra_econtrada(total_encontrado)
    puts"Letra encontrada #{total_encontrado} vezes."
end

def avisa_acertou_palavra
    puts "Você Acertou!!!!"
end

def avisa_errou_palavra
    puts "Que pena Errou!"    
end

def avisa_pontos(pontos_ate_agora)
    puts "Você ganhou #{pontos_ate_agora} pontos "
end

def da_boas_vindas
    puts "/***************/"
    puts " Jogo da Forca *"
    puts "/***************/"
    puts "Qual é o seu nome?"
    nome = gets.strip
    puts "\n\n\n\n\n"
    puts "Começaremos o jogo para você, #{nome}."
    nome
end

def desenha_forca(erros)
    cabeca = "   "
    corpo = " "
    pernas = "   "
    bracos = "   "
    if erros >= 1
        cabeca = "(_)"
    end
    if erros >= 2
        bracos = " | "
        corpo = "|"
    end
    if erros >= 3
        bracos = "\\|/"
    end
    if erros >= 4
        pernas = "/ \\"
    end

    puts "  _______       "
    puts " |/      |      "
    puts " |      #{cabeca}  "
    puts " |      #{bracos}  "
    puts " |       #{corpo}  "
    puts " |      #{pernas}  "
    puts " |              "
    puts "_|___           "
    puts
end

def avisa_acertou_palavra
    puts "\nParabéns, você ganhou!"
    puts

    puts "       ___________      "
    puts "      '._==_==_=_.'     "
    puts "      .-\\:      /-.    "
    puts "     | (|:.     |) |    "
    puts "      '-|:.     |-'     "
    puts "        \\::.    /      "
    puts "         '::. .'        "
    puts "           ) (          "
    puts "         _.' '._        "
    puts "        '-------'       "
    puts
end

def avisa_escolhendo_palavra
    puts "Escolhendo a palavra secreta..."
end

def avisa_palavra_escolhida(palavra_secreta)
    puts "Palavra secreta com #{palavra_secreta.size} letras. Boa sorte!"
    palavra_secreta
end

def nao_quer_jogar?
    puts "Deseja jogar novamente? (S/N)"
    quero_jogar = gets.strip
    nao_quero_jogar = quero_jogar.upcase == "N"
end

def cabecalho_de_tentativas (chutes,erros, mascara)
    desenha_forca erros
    puts "\n\n\n\n Palavra Secreta #{mascara}"
    puts "\n\n\n\n Erros até agora #{erros}"
    puts "Chutes até agora #{chutes}"
end

def pede_um_chute
    puts "Entre com uma letra ou palavra"
    chute = gets.strip.downcase
    puts "Será que você acertou? Você chutou '#{chute}'"
    chute
end

rank.rb--->

def salva_rank(nome,pontos_totais)
    conteudo = "#{nome}\n#{pontos_totais}"
    File.write "rank.txt", conteudo
end

def le_rank
    conteudo = File.read "rank.txt"
    conteudo.split "n"
end

main.rb--->

require_relative 'jogo_forca'

jogo_da_forca
solução!

Eu fiz os testes usando o linux e funcionou tudo normal, esse problema é uma incompatibilidade do windows (o que é bem comum). No caso do professor, como ele utiliza um Macbook, esses problemas não acontecem.

Testando no windows só consegui resolver forçando a conversão para utf-8 onde é recebido informação do usuário:

# ui.rb: da_boas_vindas
nome = gets.encode('utf-8').strip

# ui.rb: pede_um_chute
chute = gets.encode('utf-8').strip.downcase

Com isso funcionou, mas no puts "Chutes até agora #{chutes}", como é um array é mostrado o caractere unicode:

# Saída para o usuário
Chutes até agora ["a", "\u00E1"]

Isso acontece só no caso do array.

Muito obrigada pela ajuda Lucas.

Assim realmente funcionou. Windows é windows ne rs