プログラミングをゲーム的な演出で学ばなくても、ゲームの中にプログラミングを見出す事はできる

 Final Fantasy Tactics というゲームがある。1997 年に発売されたゲームなんだけど、当時これを僕はプレイしまくっていた。

f:id:kura-replace:20140221002421p:plain

 僕はこのゲームでひたすらキャラクタの育成にのめり込んでいた。キャラクタを育成するためには経験値を溜める必要があるんだけど、経験値は何か行動をしないと獲得できない仕組みになっている。で、キャラクタ育成っていうと単純で退屈そうな作業なんだけども、当時の僕はこれが面白くてしょうがなかった。面白くしている最も大きな理由は、経験値獲得ルールにある。

 経験値は何か行動をすれば獲得できるのだが、行動したからといって何も効果を生まない場合は経験値が獲得できない、という制約が課せられているんである。例えば、攻撃してダメージを与えれば経験値獲得するが、攻撃に失敗すると経験値も無し。HP を回復させれば経験値獲得するが、既に HP が満タンなら経験値は無し。武器防具を盗んで成功したら経験値獲得するが、失敗したら経験値は無し。という具合。

 そして、経験値獲得の効率を高めるためには、何よりまず戦闘をしていなくてはならない。戦闘以外では経験値が入らないからだ。つまり戦闘は長ければ長いほど良い。戦闘は敵を全て倒すと終わってしまうので、敵を倒さないでずっと戦い続ける必要がある。だから、味方同士で殴り合ったり回復し合ったり、というのを延々と繰り返すようになる。ここで例えば、パーティに回復役がいなかったらどうだろう。そういう繰り返しオペレーションはできない。

 そういう事態にならないように、戦闘にどういうキャラクタを参加させ、それぞれにどういうアビリティを持たせるか、という組み合わせが非常に重要になる。キャラクタの育成をしているわけなんで、戦闘に参加させるキャラクタはいずれも未熟である。如何にして未熟なもの同士を組み合わせ、戦闘での経験値獲得オペレーションを成功させるか、という想像力が必要になる。そういう設定をするのが編成画面である。

f:id:kura-replace:20140226033305p:plain

 編成画面でキャラクタの細かいセッティングをした上で、長時間の戦闘をやって経験値を稼ぐ、という感じ。まぁ、このゲームの説明はこの辺で終わりにしておく。

 

 さて、総プレイ時間を配分してみると、戦闘画面が最も長くて編成画面はそれより短くなる。その一方、編成画面でやったセッティングによって、戦闘中の経験値獲得オペレーションの幅は強烈に制限される。 戦闘中はひとつひとつ行動コマンドを僕が入力しているのだけど、まるで選択させられているような気分になるんである。あるとき、この感覚はまるで C++ とか Java を書いているときの感覚に似ている事に気付いた。

 プログラムを書くときは実行するときのことを想像している。ひとたび実行が開始されれば、プログラムに書かれている以外のことはできない。別のレイヤでも似たような関係がある。例えばフレームワークのプログラムを書くとき、利用者に余計な事をさせないよう、ある種の制限を課すような設計をする。利用者側のプログラムを書くときは、その趣旨に則った上で(=課せられた制限の中で)最大の利益を引き出すような実装にする。つまり、プログラムの実装と実行の関係、フレームワークの設計とそれに載せる実装の関係は、それぞれどちらも編成と戦闘の関係と類似している。

 これに気付くと、このゲームをプレイする事自体がまるでプログラミングをする事とイコールであるかのように錯覚する。武器を装備したりアビリティをセットしたりすることはプログラミングであり、編成画面とはプログラミング言語なのだと理解する。もちろんそこにはオブジェクト指向の匂いも無いし、コード片も無いし、文字入力さえも無いんだけど、確かにプログラミング言語としての手触りが感じられる。

 

 最近、「プログラマじゃなくてもプログラミングを学ぼう!」的な機運が高まっている。RubyPython のコードを書いてモンスターを倒し、ステージをクリアする、というようなゲーム性の高い学習サイトが台頭してきたのもここ最近の話だと思う*1。そういう「プログラミングを学ぼう!」という文脈の中では、具体的なコード片の入力を促すようなサービスが量産されがちで、今後も似たようなサービスが出てくると予想している。でもそれって「プログラミングを学ぼう!」というテーマが元々やりたかった事とは少し違ってしまっているんじゃないのか。そもそも、プログラマじゃない人がプログラミングを学ぶメリットは何かというと、物事をより抽象化して捉えるようになり、より抽象化して考えるようになり、最終的に日常生活へ何らかのフィードバックが発生するという、思考プロセスの総体的な変化であると、僕は考えている。だからそのために RubyPython の文法を覚えたり、コード片でモンスターを倒したりっていうのは、実はずいぶん遠回りになっているように感じられる。

 抽象的な思考を手に入れるためにゲームをやれ、という事を言いたいわけでは無い。でも、何故かよく分からないけどプログラミングをやるのが良さそうで、何かよく分からないけどプログラミング学習サービスの中で人気があるから、という理由でコードを書くくらいなら、もっと他の面白いと思える事をした方が良いよね、とは思う。いやまぁ、顔も知らないアカの他人がプログラムを学ぼうがゲームをしようが僕にはどうでも良いんだけど、子供ができて数ヶ月が経ち、少しずつ物事を理解していくさまを見ていると、学びっていうざっくりした領域の中で横たわる「抽象的思考の獲得」っていうのはどうやるのが良いんだろうかと気にするようになった。

*1:そりゃ昔からあったちゃあったんだけど