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

4.Conceito de Classes e métodos.

Temos na explicação tratando que nosso herói será um array de duas posições, mas como ? Nosso herói, é 1x1, certo ? por que referir como duas ?.

No codigo abaixo está destacado em negrito a parte do herói e no fim a saída no console:

require_relative 'ui'
def soma_vetor(vetor1, vetor2)
    [vetor1[0]+vetor2[0], vetor1[1]+vetor2[1]]
end
def posicoes_validas_apartir_de(mapa, novo_mapa, posicao)
    posicoes = []
    movimentos = [[+ 1, 0],[0, + 1],[- 1, 0],[0, - 1]]
    movimentos.each do |movimento|

        puts "Movimentos"
        puts "#{movimentos}"
        puts "Movimento"
        puts "#{movimento}"
        puts "Posicao"
        puts "#{posicao}"
    #   puts
    #   puts "Posicoes validas = #{posicoes}" 



        nova_posicao = soma_vetor(movimento, posicao)
       puts "SOMA VETOR #{nova_posicao}"
        if posicao_valida?(mapa, nova_posicao) && posicao_valida?(novo_mapa, nova_posicao)
                 posicoes << nova_posicao
            puts "Posições validadas ate agora #{posicoes}"
        else
            puts "Posição invalidada"
        end
    end
    posicoes
end
def move_fantasma(mapa,novo_mapa, linha, coluna)
    posicoes = posicoes_validas_apartir_de(mapa, novo_mapa,[linha, coluna])
    puts posicoes.size
    if posicoes.empty?
        return
    end
    aleatoria = rand(posicoes.size)
    posicao = posicoes[aleatoria]
    mapa[linha][coluna] = " "
    novo_mapa[posicao[0]][posicao[1]] = "F"
end

def copia_mapa(mapa)
    novo_mapa = mapa.join("\n").tr("F"," ").split("\n")
end

def move_fantasmas(mapa)
    caracter_do_fantasma = "F"
    novo_mapa = copia_mapa(mapa)
    mapa.each_with_index do |linha_atual, linha| 
        linha_atual.chars.each_with_index do |caracter_atual, coluna| 
            eh_fantasma = caracter_atual == caracter_do_fantasma
            if eh_fantasma
                move_fantasma(mapa, novo_mapa, linha, coluna)
            end
        end
    end
   return novo_mapa
end

def posicao_valida?(mapa, posicao)
        linhas = mapa.size
        colunas = mapa[0].size

        estourou_linha = posicao[0] < 0 || posicao[0] >= linhas 
        estourou_coluna = posicao[1] < 0 || posicao[1] >= colunas 

        if estourou_linha || estourou_coluna
            return false
        end

        valor_local = mapa[posicao[0]][posicao[1]] 
        if valor_local == "X" || valor_local == "F"
            return false
        end

    true
end

def calcula_nova_posicao(heroi, direcao)
    heroi = heroi.dup

    movimentos = {
         "W" => [-1,0],
         "S" => [1,0],
         "A" => [0,-1], 
         "D" => [0,1]
    }

    *** movimento = movimentos[direcao]
    heroi[0] += movimento[0]
    heroi[1] += movimento[1]
    puts "HEROi #{heroi}"
    heroi ***

###
Aqui acima temos 0 como coluna, e um como linha ?

###

end

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

def encontra_jogador(mapa)
    caracter_do_heroi = "H"
    mapa.each_with_index do |linha_atual, linha|
        coluna_do_heroi = linha_atual.index caracter_do_heroi 
         if coluna_do_heroi
           return [linha, coluna_do_heroi]    
         end 
    end
    nil
end

def jogador_perdeu(mapa)
    perdeu = !encontra_jogador(mapa)
end

def joga(nome)
    mapa = le_mapa(2)
 while true  

    desenha(mapa)
    direcao = pede_movimento 
    heroi = encontra_jogador mapa
    nova_posicao = calcula_nova_posicao(heroi, direcao)

    if !posicao_valida?(mapa, nova_posicao)
        next
    end

    mapa[heroi[0]][heroi[1]] = " "
    mapa[nova_posicao[0]][nova_posicao[1]] = "H"
    mapa = move_fantasmas(mapa)
    if jogador_perdeu(mapa)
        game_over
        break
    end
 end 
end

def inicia_pacman
      nome = da_boas_vindas
      joga(nome)
end
Comecaremos o jogo para voce, e
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
Para onde deseja ir?
D
HEROI [1, 3]
3 respostas

Olá Eduardo,

Pelo que dá a entender, o HEROI é na verdade representado pela sua posição dentro da matriz do jogo, conforme o exemplo:

XXXXXXXXX
X H     X
X X XXX X

Perceba que o heró está posicionado na segunda linha, terceira coluna ou seja HEROI [1, 2]

Ao selecionar para o Herói se deslocar para a direita (D), é somado um ao vetor deslocando-o para este lado e colocando-o na segunda linha, quarta coluna, ou seja HEROI [1, 3]

Espero ter ajudado.

Duas dimensões, a da linha e da coluna, por isso a referencia a duas posicoes.... ?

solução!

Eduardo,

Exatamente! Como a coordenada é definida pela linha e pela coluna, precisamos passar as duas posições.

Abraço!