2
respostas

Problema refatoração da função de posições validas

Olá quando eu executo o meu código ele me responde a seguinte menssagem de erro :

Logica.rb:134:in `[]=': index 10 out of string (IndexError)

segue meu código abaixo :

Main.rb

require_relative 'Logica'


main()

Logica.rb

require_relative 'UI.rb'

def leMapa(numero)

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

  return mapa

end

def posicaoValida?(mapa , posicao)

  quantidadeDeLinhas = mapa.size
  quantidadeDeColunas = mapa[0].size

  estourouLinhas = posicao[0] < 0 || posicao[0] == quantidadeDeLinhas
  estourouColunas = posicao[1] < 0 || posicao[1] == quantidadeDeColunas


    if (estourouLinhas || estourouColunas)

      return false

    end

    valorAtual = mapa [posicao[0]] [posicao[1]]

    if (valorAtual == "X" || valorAtual == "F")

      return false

    end

  return true

end

def encontraJogador(mapa)

  caractereDoHeroi = "H"

  mapa.each_with_index do | linhaAtual , linha |

    linhaAtual = mapa[linha]

    colunaDoHeroi = linhaAtual.index (caractereDoHeroi)

    if (colunaDoHeroi != nil)

      return [linha , colunaDoHeroi]

    end

  end

#NÃO ACHEI

end

def calculaNovaPosicao(heroi , direcao)

  heroi = heroi.dup

  movimentos = {

    "W" => [ -1 , 0],

    "S" => [+1 , 0],

    "A" => [0 , -1],

    "D" => [0 , +1]

  }

  posicao = movimentos[direcao]

  #puts (posicao)

    heroi[0] += posicao[0]
    heroi[1] += posicao[1]
    #puts (heroi[0])
    #puts (heroi[1])
    return heroi

end

def somaVetores(vetor1 , vetor2)

  soma = [vetor1[0] + vetor2[0] , vetor1[0] + vetor2[1] ]

  return soma

end

def posicoesValidasPartindoDe( mapa , novoMapa , posicao )
  puts (posicao)
  posicoes = []

  possibilidades = [ [+1 , 0] , [-1  , 0 ] , [0 , +1] , [0 , -1 ] ]

  possibilidades.each do |movimento|

    novaPosicao = somaVetores( posicao , movimento )

    if posicaoValida?(mapa , novaPosicao) && posicaoValida?(novoMapa , novaPosicao)

      posicoes << novaPosicao

    end

  end


  return posicoes

end

def movimentaFantasma(mapa , novoMapa , coluna , linhaAtual , caractereDoFantasma)

  posicoes = posicoesValidasPartindoDe( mapa , novoMapa , [linhaAtual , coluna] )

  if ( posicoes.empty? )


    return

  end

  posicao = posicoes[0]
  mapa [linhaAtual] [coluna] = " "
  novoMapa [posicao[0]] [posicao[1]] = caractereDoFantasma

end

def copiaMapa(mapa)

  novoMapa = mapa.join("\n").tr("F" , " ").split("\n")

  return novoMapa

end

def moveFantasmas(mapa)

  caractereDoFantasma = "F"

  novoMapa = copiaMapa(mapa)

  mapa.each_with_index do |conteudoLinha , linhaAtual |

    conteudoLinha.chars.each_with_index do | caractereAtual , coluna |

      achouFantasma = caractereAtual == caractereDoFantasma

        if (achouFantasma)


          movimentaFantasma(mapa , novoMapa , coluna , linhaAtual , caractereDoFantasma)

        end

    end

  end

  return novoMapa

end

def joga(nomeUsuario)

  mapa = leMapa(2)

    while true

      desenhaMapa(mapa)
      direcao = pedeMovimento()
      heroi = encontraJogador (mapa)
      novaPosicao = calculaNovaPosicao(heroi , direcao)


      if ( !posicaoValida?(mapa , novaPosicao ) )

        next

      end

      mapa  [heroi[0]]  [heroi[1]] = " "
      mapa[novaPosicao[0]] [novaPosicao[1]] = "H"

      mapa = moveFantasmas(mapa)

    end

end


def main()

nomeUsuario = daBoasVindas()

joga(nomeUsuario)

end

UI.rb


def daBoasVindas()

  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 desenhaMapa(mapa)

  puts (mapa)

end

def pedeMovimento()

  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

Mapa_2.txt

XXXXXXXXX
X H     X
X X XXX X
X X X   X
X   X X X
  X     X
 XXX XX X
  X     X
X   X X X
XXXF  F X
XXX XXX X
XXX XXX X
XXX     X

Como posso resolver esse erro ?

2 respostas

Parece que cada linha só tem 9 posições e no seu código vc está tentando acessar o indice 10, que não existe.. Coloca uns puts no código e vai verificando onde vc está errando.

Olá Alberto eu fiz os testes fazendo uma simulação de fluxo e checando a integridade das varivavéis e acabei descobrindo que o erro está nessa função :

Logica.rb

def somaVetores(vetor1 , vetor2)

   [vetor1[0] + vetor2[0] , vetor1[0] + vetor2[1] ]



end

mas não consegui descobrir qual é o erro , se você conseguir por favor me responda .