2016年8月22日月曜日

Ruby Warrior をやってみる(Level7-1)

さて、今回は Level7 です。
だいぶんしんどくなってきた。。。

とはいえ、blog を書く気になっている間にやってしまわないとまた時間経ちそうなのでやってしまわないと。

前置きは良いとして、説明文を意訳します。

You feel a wall right in front of you and an opening behind you. You
are not as effective at attacking backward. Use warrior.feel.wall? and
warrior.pivot! to turn around.

壁を目の前にして開始します。
通常の攻撃は、後ろに対して行えません。
warrior.feel.wall? メソッドと warrior.pivot! メソッドを使って向きを変えてください。

かな?
前回、:backward メソッドを使用して後ろ側への移動などを行って来ましたが、今回からなんと! warrior.pivot! メソッドを使うと戦士の向きを変えることができるようになるそうです。

ってか、最初から教えておいてくれたらよかったのに。
ということで、前回の資産を活かせるか試してみたところ、当然うまく行きませんでした。しかし、pivot! を使わずに :backward 引数だけで対応できるのでは無いかと、ちょっと弄るとクリア出来たので、今回はそのコードを載せておきます。
次の回で、実際に pivot! を使った内容を実装します。

コードは以下のとおり

class Player
  def initialize
    @health = 20
    @direction = :backward
  end
  
  def play_turn(warrior)
    @warrior = warrior
    
    return warrior.rescue!(@direction) if feel_captive?
    @direction = change_direction if feel_wall?
    
    if decrease_health?
      if pinch_pinch_health?
        @direction = change_direction
        warrior_walk!
      else
        check_enemy? ? warrior_attack! : warrior_walk!
      end
      @direction = change_direction if pinch_health?
    else
      if max_health?
        check_enemy? ? warrior_attack! : warrior_walk!
      else
        warrior.rest!
      end
    end
    @health = warrior.health
  end
  
  def decrease_health?
    @health > @warrior.health
  end
  
  def pinch_pinch_health?
    @warrior.health <= 2
  end
  
  def pinch_health?
    @warrior.health <= 3
  end
  
  def max_health?
    @warrior.health == 20
  end
  
  def feel_captive?
    @warrior.feel(@direction).captive?
  end
  
  def feel_wall?
    @warrior.feel(@direction).wall?
  end
  
  def check_enemy?
    @warrior.feel.enemy? || @warrior.feel(:backward).enemy?
  end
  
  def warrior_walk!
    @warrior.walk!(@direction)
  end

  def warrior_attack!
    @warrior.attack!(@direction)
  end
  
  def change_direction
    @direction === :forward ? :backward : :forward
  end
end

今回だけの無理やりコードなので、攻撃にも方向シンボルの指定とメソッド化、ピンチ体力の調整、そして本格的にやばくなった時の動作を無理やり実装しています。

本格的にやばくなった時のコードが何故必要になったかというと、最初の緑の敵ですが、フル体力で殴りあっても勝てないようになっています。。。一旦退いて体力回復後殴らないと勝てない。なんて糞仕様素敵な的なんだ。

一応これで、なんとかクリアできます。
ちょっと無理やりですかね。まあ、本番は次回になるので良いとしましょうか。

Written with StackEdit.

0 件のコメント:

コメントを投稿