11年前のPSソフト『カルネージハート』に教わった私の原点と言えるプログラムの基礎
ソフトウェアをプログラムする事が、いったい何を意味しているのかという基本的な部分がそのゲームには詰まっていたからです。
そして、はてなブックマーカー達には、なぜプログラマや技術屋が多いのかというのも、この結論でなんとなく納得してしまいました。
その前にまず、カルネージハートって何よという人のために説明しておきます。
書いて気がついたのですが、かなりマニアックな話になりますので、ゲームに興味のない方は見るのつらいかもしれませんので先に言っておきます。
無人ロボット作成ゲーム
初代カルネージハートは、3対3のロボット同士を戦わせるゲームでした。
高校のときにはまり4~5年やってましたがこれが面白い。
今ではPSP版が出てますね。
ゲーム内容としては、ハードウェエアの部分が、戦車タイプだったり、2速歩行、ホバー、飛行タイプなど、機体設計し、武器を選びます。

武器はレーザーや拡散、単発の弾、ミサイル等があります。
CPUを選びますが、CPUにも性能があり、処理速度が速かったり、プログラムできる思考量を増やしたりするタイプなどがあります。
最後にこのゲームの肝、ソフトウェアの開発を行います。
ロボット対ロボットの対戦は、一度戦闘が開始された場合、あとは『黙って』見ているだけです。
自らが開発したルーチンに従い、その通り考え、行動していく様を見て楽しむゲームです。

if文が詰まったブロックの配置を繰り返します。
基本的に行動は
・右回り
・左回り
・前進
・後退
・右移動
・左移動
・ジャンプ
・上昇(飛行)
・下降(飛行)
・何メールのどの角度に向けて武器A及び武器Bを打つ
・格闘
こんな感じしかありません。
つまり、右45度前方140m先に敵がいた場合、それなりのif文がない限り、何も出来ない機体となります。

この場合回答は無限にありますが、一番単純なものでは以下のようにプログラムします。
『前方150m先までの、範囲10度くらいのレーダーに、もしも敵が居るならば』
→武器Aを前方150mの10度の敵に砲撃。

[もしもいないなら]
『前方∞(300m)先までの、範囲10度くらいのレーダーに、もしも敵が居るならば』
→前進する

[もしもいないなら]
→右回りする
[最初に戻る]
これで、前方300m、10度の範囲の中に敵が居るまで右回りをし、敵が発見されたら前進し、150mまできたら砲撃するという、単純なソフトウェアが完成します。
たとえば相手が151mの敵に砲撃するようルーチンされていたら、こちらが150mまで前進し続けるプログラムを設計しているので、砲撃する前にボコボコにされる様を見続ける結果となります。
レーダーには様々なif文が存在します。
例えば最初に右180度の中に敵が居るなら右回り、左180度に敵が居るなら左回り等の設定も施せます。
また、敵の弾をレーダーで判別し、当たりそうになったら右ジャンプする、といった設定も施せます。
つまり、機体の動きを決めるのが、すべて最初に決定したソフトウェア次第ということになります。
ソフトウェア開発の喜びはどこに?
このゲームのもっとも面白い部分は、ただ見ているだけの戦闘シーンです。
そして、ソフトウェア開発の一番の喜びは、設計どおり行動し、勝利したときです。
また、様々な戦闘を繰り返し、最終的に出来上がった万能思考ルーチンの機体が完成したときに、ひとつの喜びがやってきます。
万能思考プログラムには、信じられないくらい膨大な時間を浪費します。
味方がどこに居るかも常にレーダーで捕らえ、味方同士の弾があたらないように設計し、敵の動きに合わせて行動を考える事ができるプログラム。
敵の機体に合わせて、味方3機で協力して『ハメ』ていくよう設計したり出来るのもこのゲームの特徴で、味方とのシグナル信号などのやりとりをする機能もあります。
ところが、
こうして膨大な時間をかけて設計した万能の機体でも、その機体のみを破壊するためのプログラムを作ると、あっさり勝てます。
しかも短時間で設計できます。
これが本当に面白い。
どんな思考ルーチンを施しても、無敵と言える機体が絶対に完成しないのです。
これがこのゲームのはまる所でしょうか。
どこまで頑張ろうとも、それに打ち勝つものが必ず存在し続ける。
これが今の私にかなり役立つ知識として残り続けています。
プログラムの基礎的概念
このゲームに教わった最大の肝。
それはプログラムの原点の考え方です。
例えばただ敵に砲撃するだけでは、味方が前方で被弾していようとも一切の感情も無く打ち続け、自らの手で味方を破壊します。
つまり、味方が居るかどうかの思考を優先的に考えたほうがいいなぁとその時思っても、それを最優先する動きばかり続けていては、敵によってはまったく勝てない状況に追い詰められます。

上図のように敵が、こちらの味方機体2機が必ず直線状に入るよう移動し続けるならば、こちらは一切攻撃できない状態に簡単になってしまうからです。
何よりも、弾を受け続ければ破壊されてしまうので、被弾から逃れる回避思考を優先的にしたほうがいいなと、必ず考え付きます。
ところが、敵によっては一機が遠くから闇雲に弾を発射し、逃げてばかりいるこちらの機体に横から違う敵がさりげなくやってきて殴られるという欠陥が発生します。一切攻撃できず、最終的に追い詰められて破壊されるわけです。
カルネージハートの大会優勝者の万能プログラムと言えど、一度対戦相手の動きと思考ルーチンを見れば、それに打ち勝つ為だけのプログラムは簡単に出来上がってしまうのです。
先ほども書いたとおり、いくら時間をかけて作った思考ルーチンでさえ、短時間で作った思考に破壊される。
これは、相手によって自らの行動の優先順位を変化させる必要があるという、最も現実的で、人間的な回答にたどり着く結果を意味しています。
そしてこれが一体どんな意味を持っているのかを考えると、恐ろしく単純なところにプログラムの基礎があると言う事がわかります。
一人で開発するwebアプリ
最終的に一人のプログラマが、一つのプログラムを作ろうと考えた時に、一体どんなスキルが必要なのかという点です。
掲示板を作れたり、Ajaxによってパワフルな動きをするものを作ったり、マッシュアップによって情報の整理をしたりという様々なプログラムが世に有ります。
技術と言うものは人それぞれの経験や知識に左右されますが、原点はたった一つ。
それは、プログラムの動きと言うものが、自分の頭の中に現在ある知識と知恵の範囲のものしか作れないと言う事です。
簡単にCSSテンプレートを作れるジェネレータを作ろう。
そう思ったところで、CSSの知識が無ければ作れません。
こんなスパム排除機能を持った検索エンジンを作ろう。
そのプログラムが、どのような基準でスパムと判断するのかは、開発者の頭の中にあるスパムに対する基準以外のものは導入されません。
こんな便利なマッシュアップサイトを作ろう。
その場合、開発者が便利であると感じるサイト以外のものは出来ません。
つまり、技術に関しては、作ろうと思ってから勉強しても遅くは無いのですが、『作ろう』と思った瞬間のアイデアは、その時の知識と自分の考え方が反映されるということです。
基本と言うか、当たり前の事ですが、このことに気が付かなければ、今の私はきっと有りません。
なぜなら、私は開発しているだけでも楽しいので、ドンドン色々試したくなってきて、それ以外の情報に目が行かなくなる傾向の強い人間です。
なので、最初にこのゲームに出会わなければ、新しい情報をインプットし続ける事も、プログラマにとって一つのステータスだと言う結論にならなかったと思います。
どんなプログラムであっても、生み出せるのは自分の知識と思考以下のものしか作れないと言う事がわからない限りは、学ぼうとする事はないでしょう。
自らの情報に対するアンテナを延ばし、それを知識にし、考え方を受け取り、吸収し、知恵を絞って作り上げる。
これこそがプログラマにとって必要なスキルだと思っております。
多くの人とのコミュニケーションも、結局面白いプログラムを作る為には必要な事なんですよね。
そうやって拾い上げた情報を、せっかくだからログとして残そうと考えたのが私のブログの始まりでも有ります。
はてなブックマーカー達は、少なからずこうした思考にたどり着いているからこそ、プログラマや技術屋が多いのではないかと私は思っております。
dannkogai氏とか、その多種多様な好奇心と思考能力が人より優れていると感じます。
それはプログラムにも現れていると思います。
皆さんの情報に対する飢えは、常に乾いていますか?