2016年8月16日火曜日

Ruby Warrior をやってみる(Level3)

大分放置してた。。。
さて、Level3 です。

ここでは、敵の数が増えるので、今まで通りに進むと体力が足りずに詰みます。

説明文を読むと

The air feels thicker than before. There must be a horde of sludge.
Be careful not to die! Use warrior.health to keep an eye on your health, and warrior.rest! to earn 10% of max health back. 

warrior.health メソッドと warrior.rest! メソッドがキーと書いています。

warrior.health メソッドは、自分の体力を確認できるメソッドで、warrior.rest! メソッドが 体力最大の 10% を回復するメソッドになります。

こちらの攻撃が 1 回に付き 5 を与えて、3 ターンで倒せるので、体力は 15 ぐらいで、相手の攻撃で -3 をもらい、倒しきるまでに 2 ターンあるので、体力的には 6 より多くないと厳しいということになります。

ということで、必要条件の体力が 6 より小さくなった場合に、rest! メソッドで体力を回復させるようにします。

class Player
  def play_turn(warrior)
    # cool code goes here
    return warrior.rest! if warrior.health <= 6
    warrior.feel.enemy? ? warrior.attack! : warrior.walk!
  end
end

で、単純に体力確保だけを考えて実装後に実行をすると、途中で敵が 2 連続の部分でやられてしまいました。

具体的には、2 匹目の部分で、体力低下により回復(2pt)するけど、相手の攻撃(3pt)をもらい、消耗戦の結果、体力尽きてゲームーオーバーというパターンです。

これを回避するには、ゲームオーバー時に表示されるヒントをみると、

敵が目の前にいない時に回復するようにしろ!と書いてあります。
敵が目の前かどうかは、SPACES オブジェクトの enemy? メソッドを使えば判断できます。
space 系のオブジェクトは、warrior.feel から取得できるようになっているので、warrior.feel.enemy? と記述すれば判断が付きそうです。
最終的には、以下のようになりました。

class Player
  def play_turn(warrior)
    # cool code goes here
    return warrior.attack! if warrior.feel.enemy?
    return warrior.rest! if warrior.health <= 6
    warrior.feel.enemy? ? warrior.attack! : warrior.walk!
  end
end

うーんいい感じ

0 件のコメント:

コメントを投稿