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

Erro na hora de movimentar o personagem

Eae pessoal!

Estou tentando fazer a parte de movimentação do meu personagem, mas quando escolho o lado para onde ir o programa mostra o erro "/home/runner/fogefoge.rb:20:in `[]=': no implicit conversion from nil to integer (TypeError)"

Agradeço muito se alguém puder me ajudar. Segue meu código logo abaixo:

1        require_relative 'ui'
2        
3        def encontra_jogador(mapa)
4            caracter_do_heroi = "H"
5            mapa.each_with_index do |linha_atual, linha|
6                coluna_do_heroi = linha_atual.index caracter_do_heroi
7                if coluna_do_heroi != -1
8                    return [linha, coluna_do_heroi]
9                end
10            end
11        end
12        
13        def joga(nome)
14            mapa = le_mapa(1)
15        
16            while true
17                desenha mapa
18                direcao = pede_movimento
19                heroi = encontra_jogador mapa
20                mapa[heroi[0]][heroi[1]] = " "
21                case direcao
22                    when "W"
23                        heroi[0] -= 1
24                    when "A"
25                        heroi[0] -= 1
26                    when "S"
27                        heroi[0] += 1
28                    when "D"
29                        heroi[0] += 1
30                end
31                mapa[heroi[0]][heroi[1]] = "H"        
32            end
33        end
34        
35        def inicia_fogefoge(da_boas_vindas)
36            nome = da_boas_vindas
37            joga nome
38        end
4 respostas

Aí só tem parte do código não é? Pode disponibilizar o código inteiro para que a gente possa testar?

Ainda não contém a parte da movimentação em si, somente até a escolha de direção, mas está aí:

main.rb

require_relative 'logic'
require_relative 'fogefoge'

inicia_fogefoge da_boas_vindas

fogefoge.rb

require_relative 'ui'

def encontra_jogador(mapa)
    caracter_do_heroi = "H"
    mapa.each_with_index do |linha_atual, linha|
        coluna_do_heroi = linha_atual.index caracter_do_heroi
        if coluna_do_heroi != -1
            return [linha, coluna_do_heroi]
        end
    end
end

def joga(nome)
    mapa = le_mapa(1)

    while true
        desenha mapa
        direcao = pede_movimento
        heroi = encontra_jogador mapa
        mapa[heroi[0]][heroi[1]] = " "
        case direcao
            when "W"
                heroi[0] -= 1
            when "A"
                heroi[0] -= 1
            when "S"
                heroi[0] += 1
            when "D"
                heroi[0] += 1
        end
        mapa[heroi[0]][heroi[1]] = "H"        
    end

end

def inicia_fogefoge(da_boas_vindas)
    nome = da_boas_vindas
    joga nome
end

ui.rb

def da_boas_vindas
    puts "Bem vindo ao Foge-foge"
    puts "Qual é o seu nome?"
    nome = gets.strip
    puts "\n\n\n\n\n\n"
    puts "Começaremos o jogo para você, #{nome}"
    nome
end

def desenha(mapa)
    puts mapa
end

def pede_movimento
    puts "Para onde deseja ir?"
    movimento = gets.strip.upcase
    movimento
end

logic.rb

def le_mapa(numero)
    arquivo = "mapa#{numero}.txt"
    texto = File.read(arquivo)
    mapa = texto.split("\n")
end

mapa1.txt

XXXXX
X H X
X X X
X X X
X   X
  X  
 XXX 
  X  
X F X
XXXXX

Faltou algum tratamento seu no metodo encontra_jogador... vc tenta buscar pelo caracter do heroi, mas se a linha não tiver, retorna nulo... e aí vc está retornando um vetor com a primeira posição preenchida e a segunda nula, resultando no erro.

solução!

Opa! Valeu pela ajuda Alberto. Consegui arrumar aqui.

Meu problema realmente estava no encontra_jogador:

def encontra_jogador(mapa)
    caracter_do_heroi = "H"
    mapa.each_with_index do |linha_atual,linha|
        coluna_do_heroi = linha_atual.index caracter_do_heroi
        if coluna_do_heroi != -1
            return[linha,coluna_do_heroi]
        end
    end
end

No "if coluna_do_heroi != -1" tive que remover a parte "!= -1". Segui com o código assim e até o momento não tive nenhum problema (com relação a esta parte que removi).