最近少し疲れ気味だったこともあり、VBA でこんな シミュレーター を作ってみました。リラックスしたいときに、画面をボーっと眺めてみるのも良いんじゃないでしょうか。
プログラムの作りはそれほど複雑ではありません。VBA エディタにコードをコピーすれば動きます。以下に、要所を公開しますので、ご自分で試したいという方はダウンロードしたり、コードを変えてみてりしてください。
プログラムの仕組みについて
このシミュレーターでは、画面の中でホタルたちが思い思いに光ったり、飛んで川を渡ったりします。簡単に仕組みを解説します。
ホタル1匹ずつに「意思」を持たせる(ホタルクラス)
通常のプログラムは「全部まとめて命令」を出しますが、今回は「1匹1匹のホタル」をひとつの独立したプログラム(専門用語で『クラス』といいます)として作っています。
言ってみれば、1匹ずつがそれぞれ小さな脳みそを持っていて、「今は光る番かな?」「あっちの川岸へ飛んでみようかな?」と、自分のタイミングで考えているような仕組みです。
「司令塔」でリズムを制御
ホタルが、バラバラに勝手に動くと騒がしくなってしまいます。そこで、全体を見渡す「司令塔(メインルーチン)」が、全体を制御し、一定のリズムで「あなた、次動く番。」と合図を送っています。
この「司令塔のリズム」と「ホタルたちの自主性」が組み合わさることで、ホタルたちが、それぞれの呼吸で光る自然の光景のような動きを出すようにしてみました。
ホタルの川沿いの配置
画面の中に左下から右上方向に青っぽい「川」を置いています。この両岸に限定してホタルたちを、「川から近すぎず、遠すぎない岸辺」にランダムに配置するロジックを入れています。
ダウンロードと実行
「こ自分のPCで、このホタルたちを動かしてみたい」という方は、以下のファイルをダウンロードして動かしてみてください。
hotaru.zip
ダウンロードしたらZIPファイルを解凍してください。hotaru.xlsm というファイルが現れます。
【動作環境について】
本ツールは、**Microsoft Excel(Windows版)**にて動作確認を行っております。PCにExcelが入っていれば動きますが、マクロ付のファイルなので、ファイルを開いた際に警告メッセージが出ます。その際は「コンテンツの有効化」を行ってからお使いください。また、以下の点にご注意ください。
- 64ビット版のExcel環境を推奨しております。古い32ビット版のExcelや、非常に古いOS環境ではマクロが正しく動作しない場合があります。
- 万が一、マクロが起動しない場合は、お使いの環境(ExcelのバージョンやOS)をご確認いただけますと幸いです。
hotaru.xlsm をダブルクリックすると、下のような画面が開きます。画面サイズはお好みで変えてください。

「開始」ボタンをクリックすると、画面に川が現れ、蛍が配置され、動き出します。

終わらせたい場合は、「終了」ボタンをクリックしてくださいね。
隣の「設定」シートで「ホタルの数」、「川の幅」、「岸辺の距離」を変えることができます。

ご自身で変えてみると、景色が変わるので面白いですよ。やってみてください。
プログラムの解説
ここからは、もっと仕組みの内部的な話なので、興味無い方は飛ばしていただいて構いません。
司令塔の制御のプログラム
標準モジュールにメインルーチンとして書いていて、いわば全体の時間をコントロールするものです。
' === メインループ(時間の流れを作る) ===
Do While IsStopRequested = False
' 15%の確率で、ランダムに選んだホタルに「光れ(または飛べ)」と命じる
If Rnd < 0.15 Then
idx = Int(fireflyCount * Rnd)
If Not hh(idx).is_active Then
' 50%の確率で点滅(1)か飛行(2)の命令を出す
If Rnd < 0.5 Then
hh(idx).activate_firefly 1
Else
hh(idx).activate_firefly 2
End If
End If
End If
' 全部のホタルに「1コマ分、時間を進めて!」と一斉に指示を出す
For i = 0 To fireflyCount - 1
If hh(i).is_active Then
hh(i).update_animation
End If
Next i
DoEvents ' Excelが固まらないように一息つかせる
Sleep 500 ' 0.5秒待つ(ゆったりした時間の流れを作る)
Loop
★ポイント! すべてのホタルが勝手に動くのではなく、司令塔が「0.5秒ごとに全員の時計を1コマ進める」という指示を連打(ループ)しています。また、毎回15%の確率でしか新しいホタルが動き出さないため、一斉に光りだすのではなく、自然界のような「パラパラとした、ゆったりした発生」が再現できるのです。
ホタルクラスの仕事:自分で管理
「クラスモジュール(hotaru)」は、ホタル1匹ずつの個性を決める仕組みです。指令塔から「飛べ!」と命じられたホタルは、自分で自分の残り時間を数えながら動き、時間が来たら静かに停止します。
' === hotaruクラス:1コマ分の動き(update_animation) ===
Public Sub update_animation()
If Not is_active Then Exit Sub ' 動いていないホタルは何もしない
If mode = 1 Then
' --- 点滅モード:1コマごとに点灯と消灯を交互に繰り返す ---
If blink_toggle Then
Cells(cur_row, cur_col).Interior.Color = RGB(255, 255, 0) ' 強く光る
Else
Cells(cur_row, cur_col).Interior.Color = RGB(0, 0, 0) ' 消灯
End If
blink_toggle = Not blink_toggle
Else
' --- 飛ぶモード:今いる場所を消して、ランダムに1マス進む ---
Cells(cur_row, cur_col).Interior.Color = RGB(0, 0, 0) ' 今の場所を消す
cur_row = cur_row + move_dr ' 新しい行へ移動
cur_col = cur_col + move_dc ' 新しい列へ移動
' (画面外にはみ出さないためのガード処理がここに入ります)
Cells(cur_row, cur_col).Interior.Color = RGB(255, 192, 0) ' 移動先を光らせる
End If
' 残りコマ数を1つ減らし、0になったら活動終了(静かな光に戻る)
step_count = step_count - 1
If step_count <= 0 Then
Cells(cur_row, cur_col).Interior.Color = my_color ' 元の薄暗い光に戻る
is_active = False ' おやすみなさい
End If
End Sub
★ポイント! 「移動する」ということは、Excelの世界では**「今いるマスの色を黒(夜空)に戻し、隣のマスを新しく光らせる」**という作業の繰り返しです。 ホタル自身が「自分の残り時間(step_count)」を持っていて、それが尽きると自動的に元の静かな光(my_color)に戻って眠りにつく(is_active = False)ようにしています。
💡 開発裏話:なぜホタルは「すーっ」と連続して飛ぶのか?
「15%の確率でしか動かないなら、動きがバラバラで不自然になるのでは?」と思われた方もいるかもしれません。 ここが、オブジェクト指向(クラスモジュール)の面白いところです。
15%の確率は、あくまで「新しく飛び立つきっかけ」に過ぎません。一度飛び立ったホタルは、自分の体に「4コマ分の動作(step_count = 4)」を記憶します。そして、確率の成否に関係なく、2秒間(4コマ)は自分の意志で同じ方向へ滑らかに飛び続けるのです。
新しいホタルが生まれる「ランダムな時間差」と、それぞれのホタルが持つ「2秒間の飛行時間」が画面上で重なり合うことで、途切れのない、ゆったりと飛び交う光が表現できたかな、と思います。
コードが一部で申し訳ありませんが、後はご自分で推測ください。ご意見お待ちしております。
・・やっぱり、独学だと厳しいなあ、という方は、下記のようなスクールを受けてみる、というのも有効ですよ。どうぞお考えください。

コメント