Olá estou na aula 4 de ruby , quando o guilherme cria e implementa as funcionalidades da bomba , no momento que eu estou já foi criado o mapa_4.txt e as funcionalidades da bomba funcionaram perfeitamente nele , mas quando resolvi testar nome mapa_3.txt novemente recebi essa menssagem de erro :
Logica.rb:158:in `executa_remocao': undefined method `[]' for nil:NilClass (NoMethodError)
segue meu código a seguir :
Main.rb
require_relative 'Logica'
main()
Logica.rb
require_relative 'UI.rb'
require_relative 'Heroi.rb'
def le_mapa(numero)
arquivo = ("Mapa_#{numero}.txt")
texto = File.read (arquivo)
mapa = texto.split ("\n")
return mapa
end
def posicao_valida?(mapa , posicao)
quantidade_de_linhas = mapa.size
quantidade_de_colunas = mapa[0].size
estourou_linhas = posicao[0] < 0 || posicao[0] == quantidade_de_linhas
estourou_colunas = posicao[1] < 0 || posicao[1] == quantidade_de_colunas
if (estourou_linhas || estourou_colunas)
return false
end
valor_atual = mapa [posicao[0]] [posicao[1]]
if (valor_atual == "X" )
return false
end
return true
end
def encontra_jogador(mapa)
caractere_do_heroi = "H"
mapa.each_with_index do | linha_atual , linha |
linha_atual = mapa[linha]
coluna_do_heroi = linha_atual.index (caractere_do_heroi)
if (coluna_do_heroi != nil)
jogador = Heroi.new
jogador.linha = linha
jogador.coluna = coluna_do_heroi
return jogador
end
end
return nil
end
def soma_vetores(vetor_1 , vetor_2)
[ vetor_1[0] + vetor_2[0] , vetor_1[1] + vetor_2[1] ]
end
def posicoes_validas_partindo_de( mapa , novo_mapa , posicao )
posicoes = []
possibilidades = [ [+1 , +1] , [-1 , +0 ] , [+0 , +1] , [+0 , -1 ] ]
possibilidades.each do |movimento|
nova_posicao = soma_vetores( posicao , movimento )
if posicao_valida?(mapa , nova_posicao) && posicao_valida?(novo_mapa , nova_posicao)
posicoes << nova_posicao
end
end
return posicoes
end
def movimenta_fantasma(mapa , novo_mapa , coluna , linha_atual , caractere_do_fantasma)
posicoes = posicoes_validas_partindo_de( mapa , novo_mapa , [linha_atual , coluna] )
if ( posicoes.empty? )
return
end
aleatorio = rand(posicoes.size)
posicao = posicoes[aleatorio]
mapa [linha_atual] [coluna] = " "
novo_mapa [posicao[0]] [posicao[1]] = caractere_do_fantasma
end
def copia_mapa(mapa)
novo_mapa = mapa.join("\n").tr("F" , " ").split("\n")
return novo_mapa
end
def move_fantasmas(mapa)
caractere_do_fantasma = "F"
novo_mapa = copia_mapa(mapa)
mapa.each_with_index do |conteudo_linha , linha_atual |
conteudo_linha.chars.each_with_index do | caractere_atual , coluna |
achou_fantasma = caractere_atual == caractere_do_fantasma
if (achou_fantasma)
movimenta_fantasma(mapa , novo_mapa , coluna , linha_atual , caractere_do_fantasma)
end
end
end
return novo_mapa
end
def jogador_perdeu?(mapa)
!encontra_jogador(mapa)
end
def executa_remocao(mapa , posicao , quantidade)
if mapa [posicao.linha] [posicao.coluna] == "X"
return
end
posicao.remove_do(mapa)
remove_desse(mapa , posicao , quantidade - 1)
end
def remove_desse(mapa , posicao , quantidade )
#puts "posicao linha :#{posicao.linha}\n\nposicao.coluna : #{posicao.coluna}\n\nquantidade : #{quantidade}"
if (quantidade == 0)
return
end
executa_remocao(mapa , posicao.direita , quantidade)
executa_remocao(mapa , posicao.esquerda , quantidade)
executa_remocao(mapa , posicao.cima , quantidade)
executa_remocao(mapa , posicao.baixo , quantidade)
end
def joga(nome_usuario)
mapa = le_mapa(3)
while true
desenha_mapa(mapa)
direcao = pede_movimento()
heroi = encontra_jogador (mapa)
nova_posicao = heroi.calcula_nova_posicao(direcao)
if ( !posicao_valida?(mapa , nova_posicao.to_array ) )
next
end
heroi.remove_do(mapa)
if mapa [nova_posicao.linha] [nova_posicao.coluna] = "*"
remove_desse(mapa , nova_posicao , 4 )
end
nova_posicao.coloca_no(mapa)
if ( jogador_perdeu?(mapa) )
game_over()
break
end
end
end
def main()
nome_usuario = da_boas_vindas()
joga(nome_usuario)
end
UI.rb
def da_boas_vindas()
puts ("\n\n")
puts ("=====================================================================")
puts ("BEM VINDO AO FOGE-FOGE ")
puts ("=====================================================================")
puts ("\n\n\n")
puts ("=====================================================================")
puts ("QUAL É O SEU NOME : ")
puts ("=====================================================================")
nome = gets.strip
puts ("\n\n")
puts ("=====================================================================")
puts ("COMEÇAREMOS O JOGO PARA VOCÊ , #{nome.upcase}")
puts ("=====================================================================")
return nome
end
def desenha_mapa(mapa)
puts (mapa)
end
def pede_movimento()
puts ("\n\n")
puts ("=====================================================================")
puts ("PARA ONDE VOCÊ DESEJA IR : ")
puts ("=====================================================================")
puts ("W = PARA CIMA ")
puts ("S = PARA BAIXO ")
puts ("D = PARA DIREITA ")
puts ("A = PARA ESQUERDA")
puts ("=====================================================================")
direcao = gets.strip.upcase
return direcao
end
def game_over()
puts ("\n\n")
puts ("=====================================================================")
puts (" GAME OVER ")
puts ("=====================================================================")
end
Heroi.rb
class Heroi
# atributos
attr_accessor :linha , :coluna
# métodos
def calcula_nova_posicao(direcao)
heroi_duplicado = self.dup
movimentos = {
"W" => [-1 , 0],
"S" => [+1 , 0],
"A" => [0 , -1],
"D" => [0 , +1]
}
movimento = movimentos[direcao]
heroi_duplicado.linha += movimento[0]
heroi_duplicado.coluna += movimento[1]
return heroi_duplicado
end
def to_array()
return [linha , coluna]
end
def remove_do(mapa)
mapa [linha] [coluna] = " "
end
def coloca_no(mapa)
mapa [linha] [coluna] = "H"
end
def direita
return calcula_nova_posicao("D")
end
def esquerda
return calcula_nova_posicao("A")
end
def cima
return calcula_nova_posicao("W")
end
def baixo
return calcula_nova_posicao("S")
end
end
Mapa_3.txt
XXXXXXXXXXXXXXXXX
X FFF X X
X X XX X X X XX X
X X X* X X X
X X XXXX XXX XX
X XX X X
XXX XX XXX X X X
X X X X
X X X XXX FFF X
X X XXX XXX X
X X XXX X XXX X
X HXXX X X X X
XXX FXXFX X X
Mapa_4.txt
XXXXXX
XHXXXX
X*FX X
XXFX X
XFFFFX
XXXXXX
como faço para resolver esse bug ..... obrigado :)