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.