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

`<': comparison of String with 0 failed (ArgumentError) RUBY III

O prompt diz que o erro está "estourou_linhas = posicao[0] < 0 || posicao[0] >= linhas" na "def posicao_valida?"

require_relative 'ui_fogefoge'
require_relative 'heroi_fogefoge'

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


    muro = mapa[posicao[0]][posicao[1]] == "X"
    fantasma = mapa[posicao[0]][posicao[1]] == "F"

    if muro || fantasma
        return false
    end
    true
end

def posicao_valida_nul?(posicao, mapa)
    linhas  = mapa.size
    colunas = mapa[0].size
    estourou_linhas  = posicao[0] < 0 || posicao[0] >= linhas  || nil
    estourou_colunas = posicao[1] < 0 || posicao[1] >= colunas || nil

    if estourou_linhas || estourou_colunas
        return false
    end

    muro = mapa[posicao[0]][posicao[1]] == "X"
    if muro
        return false
    end
    true
end

def executa_remocao mapa, posicao, quantidade
    if posicao_valida_nul?(posicao.to_array, mapa)
        posicao.remove_do mapa
        bomba mapa, posicao, quantidade - 1
    else
        return
    end 
end

def remove mapa, posicao, quantidade
    if quantidade == 0
        return
    end
    executa_remocao mapa, posicao.direita, quantidade
    executa_remocao mapa, posicao.esquerda, quantidade
    executa_remocao mapa, posicao.cima, quantidade
    executa_remocao mapa, posicao.baixo, quantidade
end

def joga(nome)
    mapa = le_mapa(3)
    while true
        desenha mapa
        direcao = pede_movimento

        if !valida_tecla?(direcao)
            next
        end

        heroi = encontra_jogador mapa
        nova_posicao = heroi.calcula_nova_posicao direcao

        if !posicao_valida? nova_posicao.to_array, mapa
            next
        end

        heroi.remove_do mapa

        if mapa[nova_posicao.linha][nova_posicao.coluna] == "*"
            remove mapa, nova_posicao, 4
        end
        nova_posicao.coloca_no mapa
        mapa = move_fantasmas mapa

        if jogador_perdeu?(mapa)
            game_over
            break
        end
    end
end

def inicia_fogefoge
    nome = da_boas_vindas
    joga nome
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
            heroi = Heroi.new
            heroi.linha = linha
            heroi.coluna = coluna_do_heroi
            return heroi
        end
    end
    nil
end

def move_fantasma(mapa, novo_mapa, linha, coluna)
    posicoes = posicoes_validas_a_partir_de mapa, novo_mapa, [linha, coluna]
    if posicoes.empty?
        return
    end

    aleatoria = rand posicoes.size
    posicao = posicoes[aleatoria]

    mapa[linha][coluna] = " "
    novo_mapa[posicao[0]][posicao[1]] = "F"
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 |caractere_atual, coluna|
            eh_fantasma = caractere_atual == caracter_do_fantasma
            if eh_fantasma
                move_fantasma mapa, novo_mapa, linha, coluna
            end
        end
    end
    novo_mapa
end

def soma(vetor1, vetor2)
    [vetor1[0] + vetor2[0], vetor1[1] + vetor2[1]]
end

def posicoes_validas_a_partir_de(mapa, novo_mapa, posicao)
    posicoes = []
    movimentos = [[-1, 0], [0, +1], [+1, 0], [0, -1]]
    movimentos.each do |movimento|
        nova_posicao = soma posicao, movimento
        if posicao_valida?(mapa, nova_posicao) && posicao_valida?(novo_mapa, nova_posicao)
            posicoes << nova_posicao
        end
    end
    posicoes
end

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

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

def valida_tecla?(direcao)
    if direcao != ("W") && direcao != ("S") &&
       direcao != ("A") && direcao != ("D") 
        tecla_invalida
        return false
    end
    true
end
2 respostas

A mensagem de erro indica que o tipo de dado que está na posição do array não é um número. E aí o erro é gerado justamente porque está sendo tentado comparar uma string com número.

solução!

Pois é Alberto eu entendi isso, mas não consegui resolver ainda, estou assistindo de novo as aulas para ver se encontro meu erro.