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