Skip to content
djuretic edited this page Feb 18, 2012 · 7 revisions

Hi, I beat it (what’s out so far is 7 levels of beginner and 6 of intermediate). Here is my code at the end of intermediate if anyone wants it. I like my short play_turn method. i made no attempt to get max points.

class Player
  attr_accessor :warrior, :last_health, :ticks, :retreated

  Directions = [:forward, :left, :backward, :right]
  RetreatDirections = [:backward, :left, :right, :forward]
  MaxHealth = 20

  def initialize
    @last_health = MaxHealth
    @ticks = 0
    @retreated = false
  end

  def play_turn(warrior)
    puts "my health is: #{warrior.health}"
    self.warrior = warrior
    self.ticks += 1
    action = feel_around || handle_retreat || handle_attacks || handle_resting || handle_captives || handle_post_retreat_walking
    walk_towards_stairs if !action
    self.last_health = warrior.health
  end
  
  def handle_post_retreat_walking
    return false if !self.retreated
    puts "i retreated, i'll go somewhere else!"
    not_again = Directions.dup
    not_again.delete(self.retreated)
    self.retreated = false
    not_again.sort_by {rand}.each do |dir|
      puts "considering: #{dir}"
      if warrior.feel(dir).empty?
        warrior.walk!(dir)
        return true
      end
    end
  end
  
  def enemy_count
    count = 0
    Directions.each do |dir|
      count += 1 if warrior.feel(dir).enemy?
    end
    count
  end
  
  def handle_retreat
    if enemy_count > 1
      RetreatDirections.each do |dir|
        if warrior.feel(dir).empty?
          warrior.walk!(dir)
          self.retreated = dir
          return true
        end
      end
      return handle_captives
    end
    false
  end

  def handle_attacks
    Directions.each do |dir|
      if warrior.feel(dir).enemy?
        warrior.attack!(dir)
        self.fighting = true
        return true
      end
    end
    false
  end

  def feel_around
    Directions.each do |dir|
      if warrior.feel(dir).stairs? && warrior.feel(dir).empty?
        warrior.walk!(dir)
        return true
      end      
    end
    false
  end

  def walk_towards_stairs
    warrior.walk!(warrior.direction_of_stairs)
    true
  end

  def change_heading
    self.heading = opposite_direction(self.heading)
  end

  def handle_resting
    if warrior.health < MaxHealth && !taking_damage?
      warrior.rest!
      return true
    end
  end

  def handle_captives
    Directions.each do |dir|
      if warrior.feel(dir).captive?
        warrior.rescue!(dir)
        return true
      end
    end
    false
  end

  def taking_damage?
    warrior.health < last_health
  end
end