Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require_relative 'ui'
- def posicao_valida? (mapa, nova_posicao)
- linhas = mapa.size
- colunas = mapa[0].size
- return false if estoura_linhas = (nova_posicao[0]< 0 )||(nova_posicao[0]>= linhas)
- return false if estoura_colunas = (nova_posicao[1]<0 )|| (nova_posicao[1]>= colunas)
- colide_parede = mapa[nova_posicao[0]][nova_posicao[1]]=="X"
- colide_fantasma = mapa[nova_posicao[0]][nova_posicao[1]]=="F"
- if colide_parede||colide_fantasma
- return false
- end
- true
- end
- def calcula_nova_posicao heroi, direcao
- heroi=heroi.dup
- #dicionario via array associativo, substituindo case when para as posições
- movimentos = {"W"=>[-1,0],
- "S"=>[+1,0],
- "A"=>[0,-1],
- "D"=>[0,+1]
- }
- movimento = movimentos[direcao]
- if movimento!=nil&&movimento!=[]
- heroi[0]+=movimento[0]
- heroi[1]+=movimento[1]
- end
- heroi
- end
- def soma_vetor (movimento, posicao)
- [posicao[0]+movimento[0],posicao[1]+movimento[1]]
- end
- def posicoes_validas_a_partir_de (mapa,novo_mapa, posicao)
- posicoes=[]
- if !posicao.empty?
- #versão 2
- movimentos = [[+1,0],[0,+1],[-1,0],[0,-1]]
- movimentos.each do |movimento|
- nova_posicao = soma_vetor(movimento,posicao)
- if posicao_valida?(mapa, nova_posicao) && posicao_valida?(novo_mapa, nova_posicao)
- posicoes<<nova_posicao
- end
- end
- #versão 1
- #baixo = [ posicao[0] + 1, posicao[1]]
- #cima = [ posicao[0] - 1, posicao[1]]
- #direita = [posicao[0], posicao[1] + 1]
- #esquerda = [posicao[0], posicao[1] -1 ]
- #if posicao_valida?(mapa, baixo) && posicao_valida?(novo_mapa, baixo)
- # posicoes<<baixo
- #end
- #if posicao_valida?(mapa, cima) && posicao_valida?(novo_mapa, cima)
- # posicoes<<cima
- #end
- #if posicao_valida?(mapa, direita) && posicao_valida?(novo_mapa, direita)
- # posicoes<<direita
- #end
- #if posicao_valida?(mapa, esquerda) && posicao_valida?(novo_mapa, esquerda)
- # posicoes<<esquerda
- #end
- end
- posicoes
- end
- def copia_mapa (mapa)
- #novo_mapa = []
- #versão 1
- # mapa.each do |linha|
- # nova_linha = ""
- # linha.each do |caractere|
- # if caractere =="F"
- # nova_linha << ""
- # else
- # nova_linha << "F"
- # end
- # end
- # novo_mapa<<nova_linha
- #end
- #return novo_mapa
- #versão 2
- #novo_mapa = []
- # mapa.each do |linha|
- # nova_linha = linha.dup.tr "F", " "
- # novo_mapa<<nova_linha
- #end
- #return novo_mapa
- #versão 3
- novo_mapa = mapa.join("\n").tr("F"," ").split "\n"
- 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
- posicao = posicoes[rand(posicoes.size)]
- 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 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 le_mapa numero
- arquivo = "mapa#{numero}.txt"
- texto = File.read arquivo
- mapa = texto.split "\n"
- end
- def jogador_perdeu? mapa
- perdeu = !encontra_jogador(mapa)
- end
- def joga nome
- mapa = le_mapa 2
- while true
- desenha_mapa 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_fogefoge
- nome = da_boas_vindas
- joga nome
- end
Advertisement
Add Comment
Please, Sign In to add comment