Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Problema De Movimentação

Olá estou com um problema na hora de refatorar o código que faz os fantasmas se moverem de forma aleatoria.

segue meu código :

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)

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



end

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

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

  possibilidades.each do |movimento|
    puts (posicao)
    novaPosicao = somaVetores( posicao , movimento )

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

      posicoes << novaPosicao

    end

  end

  puts (posicoes[0])
  return posicoes

end

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

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

  if ( posicoes.empty? )


    return

  end
  #puts ("#{posicoes[0]}")
  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)

          #puts ("coluna #{coluna} \n linha #{linhaAtual}")
          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

quando fiz uma simulação para testar as minhas variavéis percebi que o erro foi na função somaVetores que é chamada pela função posicoesValidasPartindoDe :

Logica.rb

def somaVetores(vetor1 , vetor2)

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



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

se alguem souber como eu posso resolver isso porfavor me ajude.

1 resposta
solução!

o erro está na função somaVetores

código corrigido:

def somaVetores(vetor1 , vetor2)

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

end