2016年8月28日日曜日

Ruby Warrior をやってみる(Level8)

Ruby Warrior Level8 です。

説明部分意訳します。

You hear the mumbling of wizards. Beware of their deadly wands! Good
thing you found a bow. Use warrior.look to determine your
surroundings, and warrior.shoot! to fire an arrow.

魔術師が詠唱をしている声が聞こえます。
彼らは広範囲の致命攻撃をして来るので注意してください。
幸運にも、弓矢を発見しました。
warrior.look メソッドにより環境を確認して warrior.shoot! で矢を放ってください。

ですかね。

と、言うわけで新しいメソッドが 2 つ増えました。
warrior.look メソッドは、前方 3 マス分の SPACE オブジェクトを配列の形で取得できるメソッドです。
このメソッドを使うことではターンを消費しないので、このメソッドの後に、移動や攻撃のメソッドを呼ぶことが出来ます。

もう一つは、warrior.shoot! メソッド。
どうやら弓矢を手に入れたらしいので、これを使う事により遠距離攻撃ができるようになります。
このメソッドは、通常の攻撃同様 1 ターン消費します。

これらを駆使してクリアを目指します。

まず、恒例の前回のソースそのまま実行の結果ですが、捕虜を助けた後に魔法使いの無慈悲な攻撃を受けます。その後1体は倒すのですが、次ターンでオーバキルされてしまいました。
やはり、上記のメソッドを駆使するしかなさそうです。

一番楽なのは、look メソッドを使わずに、shoot! をした次のターンで一歩進むという方式を取れば良いのですが、これでは捕虜ものとも倒して進むといった非常な戦士になってしまいます。

で、これらを考慮したコードが以下のとおり。

class Player
  def initialize
    @health = 20
  end
  
  def play_turn(warrior)
    @warrior = warrior
    
    return warrior.pivot! if feel_wall?
    return warrior.rescue! if feel_captive?

    three_space_captive?

    if decrease_health?
      if pinch_health?
        warrior.walk!(:backward)
      else
        check_enemy? ? warrior_attack! : warrior_walk!
      end
    else
      if max_health?
        if three_space_captive?
          warrior_walk!
        elsif three_space_enemy?
          warrior_arrow_attack!
        else
          warrior_walk!
        end
      else
        warrior.rest!
      end
    end
    @health = warrior.health
  end
  
  def three_space_captive?
    spaces = @warrior.look
    spaces.each do |space|
      return true if space.captive?
    end
    false
  end

  def three_space_enemy?
    spaces = @warrior.look
    spaces.each do |space|
      return true if space.enemy?
    end
    false
  end

  def decrease_health?
    @health > @warrior.health
  end
  
  def pinch_pinch_health?
    @warrior.health <= 5
  end
  
  def pinch_health?
    @warrior.health <= 5
  end
  
  def max_health?
    @warrior.health == 20
  end
  
  def feel_captive?
    @warrior.feel.captive?
  end
  
  def feel_wall?
    @warrior.feel.wall?
  end
  
  def check_enemy?
    @warrior.feel.enemy? || @warrior.feel(:backward).enemy?
  end
  
  def warrior_walk!
    @warrior.walk!
  end

  def warrior_attack!
    @warrior.attack!
  end
  
  def warrior_arrow_attack!
    @warrior.shoot!
  end
end

look メソッドを使って、前方 3 マスの SPACE オブジェクトを取得して、その中に捕虜が居るか確認して、居た場合は前方に進み救出に専念し、捕虜がおらず敵が居るのであれば、弓で攻撃するようにしました。

これで、このレベルではなんとかうまくいきました。
ダメージ受けた時の処理はそのままなので、その部分が次のレベルで出てくると、ちょっと面倒だなと。

ということで、今日はこれまで。

Written with StackEdit.

0 件のコメント:

コメントを投稿