スクリプト・ウォーズ “Exception”
This is just a game, just this is fun.
“Exception” と呼ばれるユニットが目的を遂行できるよう、適切にコードを並べプログラムを組み立てるというプログラミングをモチーフとしたパズル。
ユニットは複数動かすこともあるが、基本的にプログラムはユニットごとに独立したものを組むことができる。
“Exception” があるということは “Ordinary” もある。プレイヤーがカスタマイズできるユニットとは異常動作を引き起こした例外であり、そうではない普通のユニットは敵対ユニットとしてこちらのユニットの抹殺を狙ってくる。
ユニットの基本性能に差はないが軍勢は概ねプレイヤー側が不利なので、劣勢を覆すにはユニットの配置や性能を生かしての適切なプログラムの構築が求められる。
ユニット同士の殴り合いや警備網のすり抜けなど、その絵面は手続きがプログラミングのタワーディフェンスとも言える。
攻撃を主としたユニットのために構築されたからだろうか、このパズルにおけるユニットのプログラムを組み立てるためのシステム、コードの処理の仕方はかなり特殊である。
このシステムの最大の特徴は処理の完了を待たないことである。全ての行には命令欄だけでなく条件欄も用意されていて、コードは条件の合致を優先して読み進められる。
上から下へと単純な流れに従って書いたところで、その通りに全てが実行されるわけではない。処理の最中でも状況の変化によって条件の合致が変われば途中で別の処理が始まり、書き順を間違えれば条件がtrueでも命令は無視される。
さらにスクリプトは自動でループされる上break相当のコマンドがないため、慣れないうちは挙動の理解に苦しむことになる。
肝心の条件分岐は瞬間的な状況を見て判別することしかできず、ゆえに大勢の変化に応じた段階的な対応を行わせるのが難しくなっているのだが、これがパズルとしての枠組になっている。つまり問題の状況からどう条件を分岐させそれを保たせるか、そして制限されたコマンドだけでいかにして条件分岐を作るかが問われる。
ユニットの動きは乱数による多少の誤差があるため全ての試行が同じ結果になるわけではないというばらつきもあり、起こりうる可能性全てに細かく対応させようとなるとプログラムはいとも簡単に冗長になってしまう。
潰すべき数点だけを重点的に攻めて試行回数にものを言わせるだけでも一応解けるが、汎用性のある賢いユニットとは言えない。
無駄な行を削りかつ成功率を高めたシステムを探っていくと、大きな課題として優先順位の利用の仕方が浮かび上がる。行の順番と条件の並べ方を工夫するだけで、短い行数でも違う状況で例外的にかつての状況向けの行動を取らせるといったことができるようになる。
この優先順位を考えながら組むというのが非常に楽しいものだった。このゲームは問題ごとにコードの行数と目的達成までにかかった時間を測っているが評価制度は存在しない。にもかかわらず自発的にリファクタリングに勤しめたという点で、このパズルはとても面白い作品だったと言える。
しかしながら、心の底から良作と呼ぶには難しい気持ちにさせる欠点があるのも事実である。
全30問とただでさえ少ないが、全てのコマンドが解禁されるのは20問目からである。このパズルを楽しむにはあまりに短い。
また、乱数による誤差は偏ることでおかしな状況を生んでしまうもので、絶対の成功を保証しようとするほど馬鹿馬鹿しい例外処理が入る一方、当然悪用もできてしまうわけで、ごく限られた状況を狙った恐ろしく短いコードで済ませることも可能である。この現実を見せつけられるとエレガントなコードの探求も虚しくなってしまう。
まとめるには難しい限られた条件しかないからこそうまくまとめられると気持ちいいのだが、意図して作った面白さかどうかは微妙なところである。
このパズルがより発展すればストラテジーになるだろう。視界の共有やユニットの役割分離など、ただの一発芸で終わって生かしきれていなかった要素が色々と存在する。
だけどそうしたら、条件を制限していられなくなって、リファクタリングの面白さは失われるんだろうなあ……。