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ターン以内の処理とそれ以降の処理というように分けることで、敵をさばいた後は捕虜を救出することを優先するというロジックを組むことができます。