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