私のいる学科の演習のひとつに、「シミュレーション&ビジュアライゼーション演習」というものがあります。
シミュレーション&ビジュアライゼーション演習
簡易的ですが実際に動作を見れるシミュレータを題材に各人があれこれいじることで、いわゆる物理シミュレーションに関して比較的楽しく学ぼうという趣旨の授業です。
本来は演習用のソフトですが、せっかくソースコードも公開されているので、気晴らしにひとつ作ってみました。テーマは「物理演算+ぷよぷよ」です。ソースと実行ファイルは一番下に。
今回はぷよぷよといっても対戦要素は無しです。元のルールに物理演算(?)を組み込むことによる大惨事を見届けようというのが今回の趣旨になります。
さて、ぷよぷよいえば謎のゲル状の生物をぽんぽん落として積んでいくゲームです。本家と違ってより物理的に安定になるようアナログに積まれていきます。
初っ端からぷよぷよの概念をぶち壊しにするような見た目ですが…描画はもとのシミュレータのままなので許してください。
さて、ぷよぷよの一番大事な要素は同色の接続です。上の図では黄色があとひといきとなっていますが、4つつながると…
ぼーん。
そして夢の大連鎖へ。ぼーんぼーん。
積み方がアナログなので、妙なところから連鎖が発生したりします。特に大量に積まれると下のほうの隙間が圧縮されて配列が変わったりもするので、下から消えていくことさえあります。
内容について簡単に。このシミュレータの玉はもともと剛体球のような見た目に反してゴムボールみたいな相互作用を行っています。ここで、同色の玉が接触するとひっつく振る舞いを追加してあります。また塊の要素数が4を超えると爆発して消えるようになっています。爆発はぷよぷよにはないですが、まあ吹っ飛んでいくほうが面白いので。必ずしも物理的に正しい振る舞いではありませんがご了承下さい。
ソースコードに付け加えたこともそれほど多くなく、「玉」と「壁」の他に「つなぎ目」と「爆風」を追加したのみです。
今回のプログラムの方針は「従来のコードをできるだけ書き換えないこと」と「C++の機能を使わないこと」です。もともと演習のために拡張性よりシンプルさを重視したコードなので、付け足した部分はかなり見苦しくなっているかと思います。またもともとC++は授業で扱っていないので、この点は踏襲しています。(1箇所C++風の配列を使用していますが。)
もっともこの演習はクラスの概念とかを学ぶのに絶好の例題だとは思います。
(メモリの管理とかあまりよろしくないことをしているので、玉が増えすぎたりすると予定外の挙動をする可能性があります。ざっと動かした感じでは大丈夫でした。)
今は大学の新4年生が研究室配属の志望を出す時期です。研究室の話をしてもよいと思うのですが、たまには全然違う視点から、何かシミュレーションについて新4年生にとって馴染みのあるもので遊べないかなと思った結果このようなものが出来上がってしまいました。
振り返ってみるとこんな研究と関係のない謎いソフトを作っても研究室の勧誘には全然つながらない気がしますが、まあ、こんなものでも演習をしてた方にとってシミュレータをいじったときのワクワク感を少しでも思い出してもらえれば幸いです。
一応ソースコードと実行ファイルを置いておきます。VS2010(sp1)で作成したもので、言語はC++/CLIです。