LoginSignup
0
0

More than 5 years have passed since last update.

#16 【攻略】RubyWarrior Level7 ~中級編~

Posted at

RubyWarrior Level7です。

概要

今回も捕虜が爆弾を持っているのですが、敵3匹が行く手を阻んでいます。真ん中の敵を優先して倒して捕虜に向かうという感じにしましょう。

スクリプト

class Player

  def initialize()
    @approach = 0
    @change = 0
  end

  #近くに捕虜がいるかの判定
  def captive?(warrior)
    if warrior.feel(:right).captive?
      return :right
    elsif warrior.feel(:left).captive?
      return :left
    elsif warrior.feel(:forward).captive?
      return :forward
    elsif warrior.feel(:backward).captive?
      return :backward
    else
      return :none
    end
  end

  #warriorの近くに空間があるか確認 
  def empty?(warrior)
    if warrior.feel(:right).empty?
      return :right
    elsif warrior.feel(:left).empty?
      return :left
    elsif warrior.feel(:forward).empty?
      return :forward
    elsif warrior.feel(:backward).empty?
      return :backward
    else
      return :none
    end
  end

    #近くに敵がいるかの判定
  def enemy?(warrior)
    if warrior.feel(:right).enemy?
      return :right
    elsif warrior.feel(:left).enemy?
      return :left
    elsif warrior.feel(:forward).enemy?
      return :forward
    elsif warrior.feel(:backward).enemy?
      return :backward
    else
      return :none
    end
  end

  def play_turn(warrior)


    if @change <= 1
      if warrior.feel.empty?
        warrior.walk!
        @change += 1
        return []
      end
    end



    @approach += 1
    if @approach <= 5
      e = enemy?(warrior)
      case e
      when :left
        warrior.bind!(:left)

        return []
      when :right
        warrior.bind!(:right)

        return []
      when :forward
        warrior.attack!

        return []
      end

    elsif @approach > 5
      dir = warrior.direction_of_stairs
      if warrior.feel(:left).captive?
        warrior.rescue!(:left)
      elsif warrior.feel.captive?
        warrior.rescue!
      else
        warrior.walk!(dir)
      end
    end

  end
end

解説

ちょっと不細工なコードになりましたが、インスタンス変数に行動回数を保存することでなんとかクリアできました。

まず、@changeですが前方が空白だった場合のみ前進させるという分岐です。@changeに行動回数を保存しているので2回きりしかこちらの行動はしません。こうすることでいい感じに敵を倒しつつ一番奥の捕虜の前まで行くことができます。(@changeが二回以上になると方向転換するので@changeという名前です...)

続いて@approachですが、敵と接触してから経過したターン数を保存しています。
三体敵が固まっていますが、左右を拘束+前方を倒す、という流れは合計5ターンですみます。なので5ターン以内の処理とそれ以降の処理というように分けることで、敵をさばいた後は捕虜を救出することを優先するというロジックを組むことができます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0