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

Problema na Aula 3 com validação das posições

Olá quando eu executo meu códigi ele me exibe essas menssagens de erro :

Logica.rb:95: syntax error, unexpected ',', expecting ')' (SyntaxError) if ( posicaoValida? (mapa , baixo) )

Logica.rb:102: syntax error, unexpected ',', expecting ')' if (posicaoValida? ( mapa , cima ) )

/Logica.rb:106: syntax error, unexpected keyword_end, expecting end-of-input end

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)

  quantidadeLinhas = mapa.size
  quantidadeColuna = mapa[0].size

  estourouLinhas = posicao[0] < 0 || posicao[0] == mapa.size
  estourouColunas = posicao[1] < 0 || posicao[1] == mapa[0].size


    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 posicoesValidasPartindoDe( mapa , posicao )

  posicoes = []

  baixo = [posicao[0] + 1 , posicao[1] ]
  if ( posicaoValida? (mapa , baixo)  )

    posicoes << baixo

  end

  cima = [posicao[0] - 1 , posicao[1] ]
  if (posicaoValida? ( mapa , cima ) )

    posicoes << cima

  end

  esquerda =  [posicao[0] , posicao[1] - 1 ]
  if (posicaoValida? ( mapa , esquerda ) )

    posicoes << esquerda

  end


  direita = [posicao[0] , posicao[1] + 1 ]
  if (posicaoValida? ( mapa , direita ) )

    posicoes << direita

  end

  return posicoes

end

def movimentaFantasma(mapa , coluna , linhaAtual , caractereDoFantasma)

posicoes = posicaoesValidasPartindoDe( mapa , [linhaAtual , coluna] )

  if (posicoes.empty?)

    return

  end

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



end


def moveFantasmas(mapa)

  caractereDoFantasma = "F"

  mapa.each_with_index do |conteudoLinha , linhaAtual |

    conteudoLinha.chars.each_with_index do | caractereAtual , coluna |

      achouFantasma = caractereAtual == caractereDoFantasma

        if (achouFantasma)

          movimentaFantasma(mapa , coluna , linhaAtual , caractereDoFantasma)

        end

    end

  end

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"

      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

Alguem sabe como corrigir estés erros ?

5 respostas

ta dando erro dentro desse teu método aqui

def posicoesValidasPartindoDe

mais especificamente no teu

 if posicao_valida?

Isso ta acontecendo porque tu ta passando o mapa pra esse teu if, mas ele é pra ser usado no arrray das posições.

Pratu resolver isso é só tu fazer isso:

 baixo = mapa[posicao[0] + 1][posicao[1]]
   if posicao_valida? baixo
       posicoes << baixo
   end

 cima = mapa[posicao[0] - 1][posicao[1]]
   if posicao_valida? cima
       posicoes << cima
   end

 esquerda = mapa[posicao[0]][posicao[1] - 1]
   if posicao_valida? esquerda
       posicoes << esquerda
   end


  direita = mapa[posicao[0]][posicao[1] + 1]
    if posicao_valida? direita
        posicoes << direita
    end

Mas porque se o método validaPosicao? necessita do mapa para funcionar?

solução!

Mateus, você esta certo. Eu tinha entendido errado :| Desculpa, mas me corrgindo :D

Tá acontecendo apenas erro de sintaxe SyntaxError. Tu tá colocando uns parenteses a mais aí

usa um desses dois modos no if que vai dar certo

baixo = [posicao[0] + 1 , posicao[1] ]
  if ( posicaoValida? mapa , baixo  )

    posicoes << baixo

  end

  cima = [posicao[0] - 1 , posicao[1] ]
  if (posicaoValida?  mapa , cima  )

    posicoes << cima

  end

  esquerda =  [posicao[0] , posicao[1] - 1 ]
  if  posicaoValida?  mapa , esquerda  

    posicoes << esquerda

  end


  direita = [posicao[0] , posicao[1] + 1 ]
  if posicaoValida?  mapa , direita

E outra coisa,

def movimentaFantasma(mapa , coluna , linhaAtual , caractereDoFantasma)

posicoes = posicaoesValidasPartindoDe( mapa , [linhaAtual , coluna] )

  if (posicoes.empty?)

    return

  end

nesse teu método tu escreveu posicaoesValidasPartindoDe colocou um 'a' a mais. troca pelo nome certo do teu método. posicoesValidasPartindoDe. Agora teu código vai rodar :D

Mateus, deu certo?

Fechando o post, qualwuer dúvida é só perguntar.