RubyWarriorをPHPに移植したPHPWarriorのコーディング例を題材にした記事の第二回目です。
yandod/php-warrior (スターを頂けると嬉しいです。)
前回の記事はこちら
PHPWarriorで学ぶ役に立たないPHP芸 その1 #phpwarrior - Qiita
今回はBeginnerの塔、3Fを題材にします。
---------
|@ s ss s>|
---------
> = Stairs
@ = tanaka (20 HP)
s = Sludge (12 HP)
s = Sludge (12 HP)
s = Sludge (12 HP)
s = Sludge (12 HP)
3Fはスライムが多数控えており、状況に応じて体力の回復を行う必要があります。具体的には次のようなアビリティが戦士に備わっています。
- $warrior->walk();
- 指定された方向へ移動する。(前方がデフォルト)
- $warrior->feel();
- 指定された方向の空間を取得する。(前方がデフォルト)
- $warrior->attack();
- 指定された方向のユニットを攻撃する。(前方がデフォルト)
- $warrior->health();
- あなたの体力を表す数値を取得する。
- $warrior->rest();
- 体力を最大値の10%回復する。ただし他の行動はできない。
体力の減少を検知すればいいだけなので、少し分岐を加えれば対処できます。
<?php
class Player {
public function play_turn($warrior) {
if ($warrior->feel()->is_enemy()) {
$warrior->attack();
} elseif ($warrior->health() < 20) {
$warrior->rest();
} else {
$warrior->walk();
}
}
}
さて、今回はifに加えて switchも使わずにコーディングしてみます。
<?php
class Player {
public function play_turn($warrior) {
return (
$warrior->feel()->is_enemy() ?
$warrior->attack() :
(
$warrior->health() < 20 ?
$warrior->rest() :
$warrior->walk()
)
);
}
}
PHPerならみんな大好き三項演算子を制御に使ってみました。一つ余分な括弧が付いているのはPHPのマニュアルにあるこの挙動が理由です。
三項演算子は左から右へ順に評価されるからです。
括弧を外すなら次のようになります。
<?php
class Player {
public function play_turn($warrior) {
return (
$warrior->feel()->is_enemy() ?
$warrior->attack() && false:
$warrior->health() < 20 ?
$warrior->rest() && false :
$warrior->feel()->is_empty() ?
$warrior->walk() :
false
);
}
}
強烈な読みにくさです。実際にどのような動きをするかはぜひ試してみてください。この記事をなんとなく見ただけでもコピペをせずに一回で解くのは骨が折れると思います。
ちなみにこのような試行錯誤をする際には
phpwarrior -t 0
のようにしてウエイトを切るとすぐに結果がでます。
PHPWarriorをまだインストールしていない場合は下記のコマンドでどうぞ。
compoer global require "yandod/php-warrior"