kevinnio
5/7/2014 - 11:56 PM

Código del nivel 5, modo Intermediate de Ruby Warrior

Código del nivel 5, modo Intermediate de Ruby Warrior

class Player
  def play_turn(warrior)
    @units, @enemies, @captives = warrior.listen, warrior.listen.select {|s| s.enemy?}, warrior.listen.select {|s| s.captive?}
    [@enemies, @captives].each do |units|
      next if units.empty? 
      act warrior, warrior.direction_of(units.first)
      break
    end
    act warrior, warrior.direction_of_stairs if @units.empty?
  end
  
  def enemies_around(warrior, dir)
    enemies = []
    [:forward, :backward, :left, :right].each do |d|
      enemies.push warrior.feel(d) if warrior.feel(d).enemy?
    end
    return enemies
  end
  
  def act(warrior, direction)
    enemies = enemies_around warrior, direction
    if enemies.size > 1
      enemies.each do |enemy|
        if warrior.direction_of(enemy) != direction
          warrior.bind! warrior.direction_of(enemy) 
          break
        end
      end
    elsif warrior.feel(direction).stairs? and not @units.empty?
      warrior.walk!(:left)
    else
      if enemies.empty? and warrior.health < 20 and not @units.empty?
        warrior.rest!
      elsif warrior.feel(direction).empty?
        warrior.walk! direction
      else
        warrior.feel(direction).captive? ? warrior.rescue!(direction) : warrior.attack!(direction)
      end
    end
  end
end