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

DÚVIDA NA FUNÇAÕ DE LER O RANK

Acho que não entendi uma parte da explicação, e meu código está dando erro.

O Guilherme criou a função para ler o rank da seguinte forma:

def le_rank dados dados
  puts "Pontuação mais alta até agora #{dados[0]} com #{dados[1]} pontos."
end

Na minha versão, eu fiz assim:

def avisa_quem_ta_ganhando nome, pontos_totais
  puts "Pontuação mais alta até agora #{nome} com #{pontos_totais} pontos."
end

Mesmo quando eu faço exatamente igual ao exemplo dado, recebo o mesmo erro: wrong number of arguments (given 0, expected 1) (ArgumentError)

Não sei onde estou errando...

4 respostas

Rose, o erro wrong number of arguments (given 0, expected 1) indica que na chamada da função você deveria passar um argumento, mas não passou nenhum. Pode mostrar o código onde você está chamando as funções?

Outra coisa, na função le_rank você não precisa declarar duas vezes o argumento dados. Basta uma única vez:

def le_rank dados
  puts "Pontuação mais alta até agora #{dados[0]} com #{dados[1]} pontos."
end

Oi Rose, tudo bem? É complicado dizer o por que do erro vendo só esta parte do código. Pode ser que o erro seja em outra parte da aplicação. Você poderia postar o código completo aqui pra gente ver melhor?

Olá! EU separei o códeigo em dois arq. Vou mandar aqui embaixo.

require_relative 'ui'

def escolhe_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(chutes, palavra_secreta)
  mascara = ""
  for letra in palavra_secreta.chars
    if chutes.include? letra
      mascara << letra
    else
      mascara << "_"
    end
  end
  mascara
end

=begin
FALTA IMPLEMENTAR UMA FUNÇÃO QUE FINALIZE O JOGO QUANDO A PESSOA TIVER CHUTADO TODAS AS LETRAS CORRETAS
=end

def pede_chute_valido(chutes, erros, mascara)
  cabecalho_de_tentativa 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 = escolhe_palavra_secreta

    erros = 0
    chutes = []
    pontos_ate_agora = 0

    while erros < 5
      mascara = palavra_mascarada chutes, palavra_secreta
      chute = pede_chute_valido chutes, erros, mascara
      chutes << chute

        chutou_uma_letra = chute.size == 1
        if chutou_uma_letra

          letra_procurada = chute[0]
            total_encontrado = palavra_secreta.count letra_procurada
            if total_encontrado == 0
                avisa_letra_nao_encontrada
                erros += 1
            else
                avisa_letra_encontrada 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
            end
        end

    end

    avisa_pontos pontos_ate_agora
    pontos_ate_agora
end

def salva_ponto nome, pontos_totais
  conteudo = "#{nome} \n #{pontos_totais}"
  File.write "pontos.txt", conteudo
end

def le_ponto
    conteudo = File.read "pontos.txt"
    conteudo.split "\n"
end

def nao_quer_jogar?
  jogar_novamente
    quero_jogar = gets.strip
    nao_quero_jogar = quero_jogar.upcase == "N"
end


def jogo_da_forca
  nome = da_boas_vindas
  pontos_totais = 0

  loop do
      pontos_totais += joga nome
    avisa_pontos_totais pontos_totais

    if avisa_quem_ta_ganhando[1] < pontos_totais
      salva_ponto nome, pontos_totais
    end


          if nao_quer_jogar?
        break
      end
  end
end

SEGUNDO ARQ

def da_boas_vindas
    puts "Olá, bem-vindo ao jogo da forca"
    puts "Qual é o seu nome?"
    nome = gets.strip
    puts
    puts "O jogo já vai começar #{nome} !"
    nome
end

def avisa_escolhendo_palavra
  puts "Estamos sorteando a palavra secreta..."
end

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

def cabecalho_de_tentativa(chutes, erros, mascara)
  puts "A palavra secreta é #{mascara}"
  puts "Erros até agora #{erros}."
  puts "Chutes até agora #{chutes}"
end

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

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

def avisa_letra_nao_encontrada
  puts "Letra não encontrada."
end

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

def avisa_acertou_palavra
  puts "Parabéns! 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 avisa_pontos_totais pontos_totais
  puts "Você tem até agora #{pontos_totais} pontos."
end

def avisa_quem_ta_ganhando dados
  puts "Pontuação mais alta até agora #{dados[0]} com #{dados[1]} pontos."
end

def jogar_novamente
  puts "Deseja jogar novamente? (S/N) "
end
solução!

Rose, reparei que você salva a pontuação de um jogador (no método salva_ponto, suponho) e, apesar desse método não ter sido incluso na mensagem anterior, imagino que esteja fazendo isso em uma variável chamada dados.

Talvez tenha identificado o erro aqui:

if avisa_quem_ta_ganhando[1] < pontos_totais
  salva_ponto nome, pontos_totais
end

Seu método avisa_quem_ta_ganhando recebe um argumento dados mas na sua chamada nesse trecho você não passou nenhum parâmetro para ele, lançando a exceção seguinte.

'avisa_quem_ta_ganhando': wrong number of arguments (given 0, expected 1) (ArgumentError)

Você precisa fazer duas coisas aqui, pelo menos: 1. criar o método salva_ponto que guarda o nome e pontuação do usuário na variável dados caso a pontuação do usuário atual seja maior do que a pontuação já gravada 2. passar a variável dados como argumento ao conferir os pontos totais

Lembrando que você precisa primeiro atualizar, se necessário, a variável dados e depois chamar o avisa_quem_ta_ganhando. Outra coisa a prestar atenção é que para utilizar uma variável global é necessário declará-la e chamá-la com um @ antes. Então dados seria @dados.

Se quiser ler minha sugestão, leia abaixo, se não, pule o restante da minha resposta!

.

.

.

.

.

.

@dados = ["ninguém", 0]
def salva_ponto nome, pontos_totais
    if @dados[1] < pontos_totais
        @dados[0] = nome
        @dados[1] = pontos_totais
    end
end

# no método joga()
if @dados[1] < pontos_totais
    salva_ponto nome, pontos_totais
    avisa_quem_ta_ganhando @dados
end