2016年8月17日水曜日

Ruby Warrior をやってみる(Level4)

さて今回は、Level4 です。

You can hear bow strings being stretched. No new abilities this time,
but you must be careful not to rest while taking damage. Save a
@health instance variable and compare it on each turn to see if you’re
taking damage.

説明文を読むと、弓持ちの敵がいるので注意と言うことと、ダメージを受けている時に回復したらアカンということ。これを判断するには @health インスタンス変数を使用しろということのようです。

明らかに弓を持ったおっさんと、でかくなった敵がいます。
前回のコードをそのまま実行しましたが、最後の敵でやられてしまいました。普通に考えたら成功するわけないですよね。。。

と、言うことで説明に有ったとおり @health インスタンス変数を使用してダメージを受けているかを判定して処理を分岐するようにします。

@health のインスタンス変数については最初は定義されていないので、どこかで定義をする必要があるのでとりあえず、Player クラスの initialize メソッドで定義するようにします。
その後は、play_turn() メソッドの最後の部分でターン終了時の戦士の体力を代入するようにします。

これで、自分のターン後に敵からダメージを受けていた場合、先程保持した値よりも戦士の体力が減っていればダメージを受けているかどうか判断がつくようになります。

ダメージを受けている場合は、のんきに回復などをしていると、消耗戦でやられてしまうので、さっさ前に進み敵を倒しに行くようにします。

ダメージに変動がなくなり、前方に敵がいない場合に限り回復処理を行うようにします。

ここで、回復のポイント数ですが、緑の敵がでかくなって5ターンの攻撃を行う必要があるので前回の回復目安 6pt ではやられてしまうため、4 ターン分耐え切る体力(3 x 4 = 12 以上)を確保するようにします。

これを踏まえて実装したコードが以下のようになります。

class Player
  def initialize
    @health = 20
  end
  
  def play_turn(warrior)
    # cool code goes here
    return warrior.attack! if warrior.feel.enemy?
    if @health > warrior.health
      warrior.walk!
    else
      if warrior.health <= 12
        warrior.rest!
      else
        warrior.feel.enemy? ? warrior.attack! : warrior.walk!
      end
    end
    @health = warrior.health
  end
end

if 文のネストが増えているのがちょっと嫌な感じですが、ひとまずクリアはできました。

0 件のコメント:

コメントを投稿