2016年8月22日月曜日

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

はい、今回は前回の続きで Level7 の pivot! メソッドを使ったバージョンです。

説明文は前回と同じなので、省略と。

今回は、しつこいようですが pivot! メソッドを使用する形になります。
pivot! メソッドは、戦士の向いている方向を変更するメソッドになります。
前回の :backward と違って、pivot! は破壊的メソッドのため(!マークが付いているからね)、これだけで 1 ターン使うので、pivot! の後に、warrior 系のメソッドを使うとエラーになってしまいます。
(ここいらのルール無視するとずっと俺のターンができるからしょうがないね)

ここで分かったのは、:backward 付きの攻撃と、敵と正面向いての攻撃とで与えるポイントが違う点。なんと細かいのだ。

なので、前回のような体力低下による戦略的撤退を最初の敵で行う必要がなくなります。
が、結局弓矢持ちの敵の所で、引く処理が必要なので、まあよく考えられているゲームになっています。

で、実装した結果が以下のとおり

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?

    if decrease_health?
      if pinch_health?
        warrior.walk!(:backward)
      else
        check_enemy? ? warrior_attack! : warrior_walk!
      end
    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_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
end

前回の方向をインスタンス変数に持つのをやめて、壁がある場合には、pivot! メソッドを使って向きを変える処理の追加と、ピンチの場合の判断体力と、後ろに下がる処理を :backward 付きの処理に変更したぐらい。
各動作については、メソッドラップの必要性がなくなったけど、あえて残しています(面倒くさかった)。

毎度のことながら、ひとまずクリア出来たので、めでたしめでたしと。

Written with StackEdit.

0 件のコメント:

コメントを投稿