はい、今回は前回の続きで 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 件のコメント:
コメントを投稿