Skip to content
curi edited this page Sep 12, 2010 · 11 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.

class Player
attr_accessor :warrior, :last_health, :ticks, :heading, :last_heading_change, :fighting, :retreated, :wants_to_retreat

Directions = [:forward, :left, :backward, :right] RetreatDirections = [:backward, :left, :right, :forward] MaxHealth = 20 def initialize @last_health = MaxHealth @ticks = 0 @retreated = false @wants_to_retreat = 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
  1. if warrior.feel(self.heading).wall?
  2. self.change_heading
  3. 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