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

Duvida sobre atomatização da bomba

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 :)

4 respostas
solução!
def remove_desse(mapa , posicao , quantidade )
    if (quantidade == 0)
      return
    end
    executa_remocao(mapa , posicao, quantidade)
end

Desculpe mas não consegui entender a qual parte do código você está se referindo :(

a unica diferença do meu código para o seu são essas linhas :

Logica.rb

executa_remocao(mapa , posicao.direita , quantidade)
    executa_remocao(mapa , posicao.esquerda , quantidade)
    executa_remocao(mapa , posicao.cima , quantidade)
    executa_remocao(mapa , posicao.baixo , quantidade)

que foram uma maneira do instrutor do curso validar para quais cassas a bomba explodirá , em um alcance de 4 casas .

Só gostaria de corrigir uma informação estou na verdade na aula número 5

Ola Mateus,

Mesmo erro aqui, estou tentando achar a causa. Se alguém souber, nos ajude.

Att,

Caramba, faltou adicionar isso que a Vânia postou no vídeo e na transcrição da aula.