Revisão de conteúdo - Correção dos exercícios - Aula 17B - Aprendendo a programar com Ruby: O Básico para iniciantes

:warning: Material da aula 17.B! Veja mais informações sobre o curso e a lista completa das aulas em: http://cursoprogramacao.rafaelbiriba.com/ :warning:

17.B. Revisão de conteúdo - Correção dos exercícios

Essa é a segunda parte da aula de revisão de conteúdo, com a correção comentada dos exercícios.

Não deixe de tentar resolver os exercícios da aula e investir algum tempo estudando mais sobre o assunto.

Vídeo da aula

Exercícios

Correção dos exercícios

1.

class Carro
  attr_reader :km_rodados
  def initialize(modelo, cor, km_rodados)
    @modelo = modelo
    @cor = cor
    @km_rodados = km_rodados
  end

  def detalhes
    "#{@modelo} #{@cor}"
  end

  def precisa_trocar_oleo?
    if km_rodados > 10000
      return true
    else
      return false
    end
  end

  def precisa_trocar_pneu?
    if km_rodados > 50000
      return true
    else
      return false
    end
  end
end

carro_preto = Carro.new("corsa", "preto", 32000)
carro_preto.detalhes # "corsa preto"
carro_preto.precisa_trocar_oleo? # true
carro_preto.precisa_trocar_pneu? # false

carro_azul = Carro.new("fusca", "azul", 9000)
carro_azul.detalhes # "fusca azul"
carro_azul.precisa_trocar_oleo? # false
carro_azul.precisa_trocar_pneu? # false

carro_branco = Carro.new("palio", "branco", 51000)
carro_branco.detalhes # "palio branco"
carro_branco.precisa_trocar_oleo? # true
carro_branco.precisa_trocar_pneu? # true

2.

# Classe Carro do exercício #1
class Carro
  attr_reader :km_rodados
  def initialize(modelo, cor, km_rodados)
    @modelo = modelo
    @cor = cor
    @km_rodados = km_rodados
  end

  def detalhes
    "#{@modelo} #{@cor}"
  end

  def precisa_trocar_oleo?
    if km_rodados > 10000
      true
    else
      false
    end
  end

  def precisa_trocar_pneu?
    if km_rodados > 50000
      true
    else
      false
    end
  end
end

class Oficina
  attr_accessor :carros

  def initialize
    @carros = []
  end

  def adicionar_carro(carro)
    @carros << carro
  end

  def listar_todos_carros
    resultado = []
    @carros.each do |carro|
      resultado << carro.detalhes
    end
    resultado
  end

  def listar_carros_troca_oleo
    resultado = []
    @carros.each do |carro|
      if carro.precisa_trocar_oleo?
        resultado << carro.detalhes
      end
    end
    resultado
  end

  def listar_carros_troca_pneu
    resultado = []
    @carros.each do |carro|
      if carro.precisa_trocar_pneu?
        resultado << carro.detalhes
      end
    end
    resultado
  end
end

oficina = Oficina.new
oficina.adicionar_carro(Carro.new("corsa", "preto", 32000))
oficina.adicionar_carro(Carro.new("fusca", "azul", 9000))
oficina.adicionar_carro(Carro.new("palio", "branco", 51000))

oficina.listar_todos_carros #["corsa preto", "fusca azul", "palio branco"]
oficina.listar_carros_troca_oleo #["corsa preto", "palio branco"]
oficina.listar_carros_troca_pneu #["palio branco"]

3.


# arquivo veiculo.rb
class Veiculo
  attr_reader :peso, :rodas

  def initialize(peso, rodas)
    @peso = peso
    @rodas = rodas
  end
end
veiculo = Veiculo.new(100000, 12)
veiculo.rodas # 12
veiculo.peso # 100000kg
veiculo.carga # NoMethodError, pois não deve estar disponível Veiculo
veiculo.cilindradas # NoMethodError, pois não deve estar disponível Veiculo
veiculo.lugares # NoMethodError, pois não deve estar disponível Veiculo
# arquivo caminhao.rb
require_relative "veiculo"

class Caminhao < Veiculo

  def initialize
    super(12000, 8)
  end

  def carga
    "arroz"
  end
end
caminhao = Caminhao.new
caminhao.rodas # 8
caminhao.peso # 12000kg
caminhao.carga # arroz
caminhao.cilindradas # NoMethodError, pois não deve estar disponível para Caminhao
caminhao.lugares # NoMethodError, pois não deve estar disponível para Caminhao
# arquivo moto.rb
require_relative "veiculo"

class Moto < Veiculo

  def initialize
    super(250, 2)
  end

  def cilindradas
    "200cc"
  end
end
moto = Moto.new
moto.rodas # 2
moto.peso # 250kg
moto.cilindradas # 200cc
moto.carga # NoMethodError, pois não deve estar disponível para Moto
moto.lugares # NoMethodError, pois não deve estar disponível para Moto
# arquivo carro.rb
require_relative "veiculo"

class Carro < Veiculo

  def initialize
    super(1100, 4)
  end

  def lugares
    5
  end
end
carro = Carro.new
carro.rodas # 4
carro.peso # 1100kg
carro.lugares # 5
carro.carga # NoMethodError, pois não deve estar disponível para Carro
carro.cilindradas # NoMethodError, pois não deve estar disponível para Carro

4. DESAFIO

Implementar um jogo da forca. Forca é um jogo onde uma palavra é escolhida em segredo, e o jogador tem 6 chances de acertar a palavra, tentando adivinhar letra por letra.

Nesse exercício, você deve criar uma classe Forca que inicialize com a palavra escolhida para o jogo.

Você deve implementar um método jogar para iniciar o jogo e receber (perguntar ao jogador) as letras a cada jogada.

Quando o número de erros forem igual a 6, o jogo acaba com a mensagem Você perdeu!

Se a palavra for descoberta, o jogo acaba com a mensagem Você ganhou!

OPCIONAL: Não precisa guardar a lista de letras digitadas. Se o jogador digitar a mesma letra, e ela estiver errada, contar como um novo erro.

DICA: Usar gets para receber as letras do jogador.

DICA 2: Utilizar while para manter o jogo rodando, até a palavra for acertada ou o jogador errar 6 vezes.

DICA 3: "cavalo".size retorna o tamanho da palavra, ou seja 6

DICA 4: Array.new(6) cria um array vazio com 6 posições [nil, nil, nil, nil, nil, nil]

  class Forca
    def initialize(palavra_correta)
      @palavra_correta = palavra_correta.split("")
      @erros = 0
      @palavra_adivinhada = Array.new(@palavra_correta.size)
    end

    def jogar
      while true
        puts "Digite uma letra:"
        letra_digitada = gets.chomp

        if acertou_letra?(letra_digitada)
          puts "#{@palavra_adivinhada}"
        else
          @erros += 1
          puts "Você cometeu um erro. (#{@erros} de 6)"
        end

        if fim_de_jogo?
          break
        end
      end
    end

    def acertou_letra?(letra_digitada)
      acertos = false
      @palavra_correta.each_with_index do |letra_correta, index|
        if letra_correta == letra_digitada
          acertos = true
          @palavra_adivinhada[index] = letra_digitada
        end
      end
      acertos
    end

    def fim_de_jogo?
      if ganhou?
        puts "Você ganhou!"
        return true
      elsif perdeu?
        puts "Você perdeu!"
        return true
      end
    end

    def ganhou?
      @palavra_correta == @palavra_adivinhada
    end

    def perdeu?
      @erros == 6
    end
  end

  jogo = Forca.new("cavalo")
  jogo.jogar
  # Digite uma letra: z
  # Você cometeu um erro. (1 de 6)
  # Digite uma letra: c
  # ["c", nil, nil, nil, nil, nil]
  # Digite uma letra: u
  # Você cometeu um erro. (2 de 6)
  # Digite uma letra: a
  # ["c", "a", nil, "a", nil, nil]
  # Digite uma letra: u
  # Você cometeu um erro. (3 de 6)
  # Digite uma letra: v
  # ["c", "a", "v", "a", nil, nil]
  # Digite uma letra: l
  # ["c", "a", "v", "a", "l", nil]
  # Digite uma letra: o
  # ["c", "a", "v", "a", "l", "o"]
  # Você ganhou!


Comments & Social
comments powered by Disqus