2016年8月18日木曜日

Ruby Warrior をやってみる(Level5)

はい、今回は Level5 です。
これまで同様に内容を意訳してみます。

You hear cries for help. Captives must need rescuing. Use
warrior.feel.captive? to see if there is a captive and warrior.rescue!
to rescue him. Don’t attack captives.

捕虜が助けを呼んでいる。
warrior.feel.captiove? メソッドで捕虜の存在を確認して、warrior.rescue! メソッドで捕虜を助けてください。
捕虜を攻撃しちゃダメ。

とのこと。
檻に入って不安そうな感じの目をしているのが捕虜のようです。
見た目が悪いのでゲームがゲームならミミック系の敵で倒してしまいそう。。。

そんな話は置いといて、今回も説明文にあるとおり、新しいメソッドを使って捕虜を助けつつ攻略していく形になります。

前回のそのまま起動したけど、捕虜の檻で足踏みして先に進まないので、改良が必要ですね(当たり前だけど)。

手っ取り早く、捕虜救出の部分だけを書いて実行すると、最後の緑の敵であっさり倒されてしまいます。

具体的には敵を倒した後に、次のターンで前進してしまい、そこにまた敵がいるので、殴り合いの末 K.O されるようになっていました。

で、色々模索してコードをすっきりさせる方法を探ってみたのですが、結果ぐちゃぐちゃに。
ひとまず、クリアはできたのでコード載せておきます。


class Player
  def initialize
    @health = 20
    @damage = false
  end
  
  def play_turn(warrior)
    # cool code goes here
    return warrior.rescue! if warrior.feel.captive?

    if @health > warrior.health
      if @damage
        warrior.feel.enemy? ? warrior.attack! : warrior.walk!
      else
        warrior.feel.enemy? ? warrior.attack! : warrior.rest!
      end
      @damage = true
    else
      if warrior.health <= 12
        warrior.rest!
      else
        warrior.feel.enemy? ? warrior.attack! : warrior.walk!
      end
      @damage = false
    end
    @health = warrior.health
  end
end

かっちょ悪いですが、@damage というインスタンス変数を設け、体力低下確認に合わせて 1 回だけは攻撃を踏ん張るようにしてみました。
これで、敵を倒した直ぐに前に進まず回復をするようになりクリアできます。

あんだけ if のネストが気持ち悪いと書いていたのにさらにネストがパワーアップしている。。。

Written with StackEdit.

0 件のコメント:

コメントを投稿