3
respostas

Problema com a movimentação do personagem

Quando movimento o personagem ele não apaga a posição anterior e não passa da coluna número 3 do meu mapa . Alguem sabe como resolver ?

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

  case direcao

    when "W"

      heroi[0] -= 1

    when "S"

      heroi[0] += 1

    when "A"

      heroi[1] -=1

    when "D"

      heroi[1] += 1

    end

    return heroi

end

def joga(nomeUsuario)

  mapa = leMapa(1)

    while true

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

      if (novaPosicao[0] < 0)

        next

      end

      if (novaPosicao[1] < 0)

        next

      end

      if (novaPosicao[0] >= mapa.size)

        next

      end

      if (novaPosicao[1] >= mapa[0].size)

        next

      end

      if (mapa [novaPosicao[0]] [novaPosicao[1]] == "X")

        next

      end

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


    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_1.txt

XXXXX
X   H   X
X   X    X
X   X    X
X          X
      X
  XXX   
     X      
X F      X
XXXXX
3 respostas

Oi Mateus,

No seu método calculaNovaPosicao, faltou duplicar o valor do heroi para fazer as modificações:

def calculaNovaPosicao(heroi , direcao)
  heroi = heroi.dup #FALTOU ESSA LINHA
  case direcao
    when "W"
      heroi[0] -= 1
    when "S"
      heroi[0] += 1
    when "A"
      heroi[1] -=1
    when "D"
      heroi[1] += 1
    end
    return heroi
end

Você precisa duplicá-lo pois precisa tanto da posição atual quanto da antiga para conseguir apagar o herói e colocá-lo na posição nova.

Um outro detalhe que não tem nada a ver com o problema, no Ruby a convenção é utilizar snake case (separar com o caracter _) ao invés de camel case para separar as palavras.

Abraço!

Mas porque eu tenho que duplicar o heroi ? , será que é porque na na linha :

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

eu faço novamente uma requesição para aquela variavel antiga.

Oi Mateus,

É por isso mesmo.