Ruby Warrior Level8 です。
説明部分意訳します。
You hear the mumbling of wizards. Beware of their deadly wands! Good
thing you found a bow. Use warrior.look to determine your
surroundings, and warrior.shoot! to fire an arrow.
魔術師が詠唱をしている声が聞こえます。
彼らは広範囲の致命攻撃をして来るので注意してください。
幸運にも、弓矢を発見しました。
warrior.look メソッドにより環境を確認して warrior.shoot! で矢を放ってください。
ですかね。
と、言うわけで新しいメソッドが 2 つ増えました。
warrior.look メソッドは、前方 3 マス分の SPACE オブジェクトを配列の形で取得できるメソッドです。
このメソッドを使うことではターンを消費しないので、このメソッドの後に、移動や攻撃のメソッドを呼ぶことが出来ます。
もう一つは、warrior.shoot! メソッド。
どうやら弓矢を手に入れたらしいので、これを使う事により遠距離攻撃ができるようになります。
このメソッドは、通常の攻撃同様 1 ターン消費します。
これらを駆使してクリアを目指します。
まず、恒例の前回のソースそのまま実行の結果ですが、捕虜を助けた後に魔法使いの無慈悲な攻撃を受けます。その後1体は倒すのですが、次ターンでオーバキルされてしまいました。
やはり、上記のメソッドを駆使するしかなさそうです。
一番楽なのは、look メソッドを使わずに、shoot! をした次のターンで一歩進むという方式を取れば良いのですが、これでは捕虜ものとも倒して進むといった非常な戦士になってしまいます。
で、これらを考慮したコードが以下のとおり。
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? three_space_captive? if decrease_health? if pinch_health? warrior.walk!(:backward) else check_enemy? ? warrior_attack! : warrior_walk! end else if max_health? if three_space_captive? warrior_walk! elsif three_space_enemy? warrior_arrow_attack! else warrior_walk! end else warrior.rest! end end @health = warrior.health end def three_space_captive? spaces = @warrior.look spaces.each do |space| return true if space.captive? end false end def three_space_enemy? spaces = @warrior.look spaces.each do |space| return true if space.enemy? end false end def decrease_health? @health > @warrior.health end def pinch_pinch_health? @warrior.health <= 5 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 def warrior_arrow_attack! @warrior.shoot! end end
look メソッドを使って、前方 3 マスの SPACE オブジェクトを取得して、その中に捕虜が居るか確認して、居た場合は前方に進み救出に専念し、捕虜がおらず敵が居るのであれば、弓で攻撃するようにしました。
これで、このレベルではなんとかうまくいきました。
ダメージ受けた時の処理はそのままなので、その部分が次のレベルで出てくると、ちょっと面倒だなと。
ということで、今日はこれまで。
Written with StackEdit.
0 件のコメント:
コメントを投稿