RubyWarrior完全攻略~初級編~ Level6

いつの間にか戦士のLevelも6になりました。

では、やっていきます。
f:id:tumiki_jp:20150623015749p:plain まずはGoogle翻訳
The wall behind you feels a bit further away in this room. And you hear more cries for help.
あなたの後ろの壁が遠くにこの部屋にビットを感じています。そして、あなたは助けのためのより多くの叫びを聞きます。
You can walk backward by passing ':backward' as an argument to walk!. Same goes for feel, rescue! and attack!. Archers have a limited attack distance.
':後方'あなたは渡すことで後方に歩くことができる歩行引数として!同じことが感じ、救助のために行きます!と攻撃!射手は、限られた攻撃距離を有します。

要約すると  
walk!メソッドの引数に:backwardを指定したら
後ろに進む事ができるので、
捕虜を救出したり、敵の攻撃を回避したりしましょう。
feel、rescue!、attack!も:backward指定できます。
って感じでしょうか。

今回は、プログラムを綺麗に作り直すことにします。
というのも、
今まではLevelが上がるたびにプログラムをつぎ足しで
作っていたのでif文が多くかなり複雑になっていたためです。
一度整理して、今後のレベルに対応できるプログラムにしたいと思います。

今までと全然違うソースコードになってしまいました。
play_turnメソッドでやっている事は

  • 初期化処理(1度だけ)
  • 戦士の行動を決定
  • 現在の体力を記憶

になります。
初期化処理は、
1度しか呼ばれないようにnil?の判断を入れてます。
次に、戦士の行動を決定するメソッドを呼び出し、
戻り値で処理を分岐してます。
最後に、現在の体力を前回値として保存します。

戦士の行動を決定するメソッドの中身ですが、
以下のようなロジックをもとに書きました。

条件1 条件2 条件3 行動
目の前に何かある 捕虜がいない 攻撃する[attack!]
目の前に何かある 捕虜がいる 救出する[rescue!]
目の前に何もない ダメージを受けていない 体力が多い 前に進む[walk!]
目の前に何もない ダメージを受けていない 体力が少ない 回復する[rest!]
目の前に何もない ダメージを受けている 体力が多い 前に進む[walk!]
目の前に何もない ダメージを受けている 体力が少ない 後ろに下がる[walk!]

さらに、戦士が現在どちらを向いているか(どちらに進むか)によって
歩く方向、攻撃する方向、救出する方向等を決めなければなりません。

さらにさらに、今回の問題では

  • 初回は後ろに進む
  • 捕虜を救出したら方向転換
  • 回復し始めたら全回復するまで回復する

といった事も必要になるので、そういった事も記述しています。

まだまだ汚いですが、前よりは分かりやすくなったと思います。
はたして、次のLevelでこのプログラムがどれだけ使い物になるのか・・。