top
[Index(X)][Back(B)]

宇宙の法則 〜23/3〜

画面写真

※画像をクリックすると、原寸大で表示されます。

タイトル画面

作品情報

作品名:
宇宙の法則 〜23/3〜(うちゅうのほうそく ふみさん)
作者名:
はりまお
製作開始日:
2010年07月02日
制作完了日:
2010年08月30日
制作環境:
Pentium 4(2.60GHz) + 1GB RAM
WindowsXP Home Edition SP3 + Small Basic v0.9
動作環境:
要 Microsoft .NET Framework 3.5 SP1 (Windows7の場合は、3.5.1)
要 Silverlight(Webブラウザ上で実行する場合)

公開情報

ID
NVL100
URL
http://smallbasic.com/program/?NVL100
公開日
2010年09月03日

ファイル

"lifegame.zip" [ダウンロード]
実行ファイル
"lifegame.exe"
ソース コード
"lifegame.sb"
Small Basicライブラリ・ファイル
"SmallBasicLibrary.dll"
説明文
"readme.txt"

インストール・アンインストール

特別なインストール作業はありません。新たにフォルダを作成し、その中にこのソフトの全ファイルを置いてください。

アンインストールする時は、インストールしたフォルダごと全て削除してください。
レジストリの変更や、インストールフォルダ以外へのファイル作成は、一切行っていません。お試しにチョコットだけっていう場合も安心です。

Webブラウザで動かす場合は、ダウンロード・インストール共に不要です。Small Basicを導入済みの人は、『公開情報』欄のIDを使ってインポートできます。

概要

ごく一般的なライフゲームです。
ルールは、23/3(周りに2匹か3匹いれば生き残り、3匹なら誕生し、それ以外なら死)です。

遊び方

起動したら、生物の画像を準備するので、しばらくお待ちください。

画面の左側の格子の部分で、マウスの左ボタンを押せば生物を配置できます。
また、右側のランダムボタンを押せば、適当に生物が配置されます。その下の飽和ボタンを押せば、全てのマスに生物が置かれ、全滅ボタンを押せば、全ての生物を消すことができます。
自動更新中は、生物の配置を変更できません。

右下にある次の世代へボタンを押せば、1世代だけ進めることができます。F4キーでもできます。

自動更新ボタンを押せば、次々と世代を重ねていきます。F5キーでもできます。
更新間隔は、ボタンの下にあるテキストボックスにミリ秒単位で入力します。この値は、自動更新ボタンを押したときに有効になります。
自動更新を止めるときは、停止ボタン(自動更新ボタンと同じ)を押してください。

世代数0ボタンを押せば、世代数を0に戻せます。ランダム, 飽和, 全滅ボタンを押したときも、世代数が0になります。

プログラムについて

生物の表示は、全て固定なので表示/非表示を簡単に切り替えられるShapesを使いました。しかし、これが失敗だったようで、後で簡単なベンチマークを作ってみたところ、Shapesより画像描画命令で地道に書き換えた(FillRectangleで消してFillEllipseで描く)方が圧倒的に速かったです。でも、Small Basicのサンプルとして色々な機能を使ってみたいと言う意味でShapesのままにしています。暇なら改良してください。

書き換え処理がとにかく遅いということが分かったので、思いつく(簡単にできる)工夫はしてみました。(それでも遅いです)

フィールド配列(生物の配置を保存する配列)は、現代と次世代(世代交代の処理結果)の2層構造ですが、生存処理を行うたびに参照先と保存先を交互に切り替えています。これで、計算結果の配列内容を現代の配列にコピーする必要をなくしています。
また、フィールド配列は、実際に画面上に表示されるマス数より一回り大きくなっています。フィールド端の生物の周辺生命数を数えるのに便利だからです。

各マスの生物の表示切り替えは、変化があった所だけ変更しています。

世代交代の処理ループと生物の表示処理ループは分離しています。同時に処理すれば1順するだけで済むのですが、同時に処理すると画面の書き換えが物凄くもたついてイライラしまうので、それを少しでも誤魔化すためにあえて分離しています。

世代数と生命数の表示にテキストボックスを使用していますが、文字描画が面倒だっただけで、特に意味はありません。(画像描画命令よりテキストボックスの方が書き換えが早いという利点はあります。)

開発当初は、自動更新処理の呼び出しにタイマーを使っていたのですが、処理速度が重くて小さいフィールドでないとタイマーの割り込み間隔に間に合わないことが分かりました。
そこで、サブルーチンの中で更新処理をループさせて、停止ボタンが押されたらループを抜ける方法を試しましたが、サブルーチンを抜けないとボタンなどのイベントが発生しないことがわかり断念。
仕方がないので、更新処理部を永久ループで常時回し続けることにしました(コード中の“メイン ループ”部分)。したがって、少々面倒臭いプログラムになっています。

文字を画面に直接描画するには問題があるようです。
開発環境(ローカルのPC上)で実行したときと、Webブラウザ上で実行したときでは、描画される文字が同じフォントにならないようです。Webブラウザ上の方が大きく描画されてしまうため、枠内に収まらなかったり消去処理(背景色で文字の部分を塗り潰す)で消し残りが発生したりしてしまいます。解決方法は、今の所分かりません。

開発こぼれ話

Small Basic第1作目ということで、懐かしくて簡単で基礎的な技術を試せそうなライフゲームを題材にしてみました。

MSX-BASICでプログラムを始めたので、Small Basicのコンセプトにはワクワクします。簡単な文法で、SilverlightでWeb上でも動いて、さらにそれを共有できて、しかも無料なんて言われたらもぅたまりません。
MSX-BASICでやってたことを再現するのは難しそうだし、処理速度もあまり早くないし、まだまだバグが多いのが玉に瑕やけど、方向性には期待大です。
プログラムで遊ぶ人が、(特に子供たちの間で)もっともっと増えてくれたらなぁと夢見てしまいます。

.NET Framework上で動かしているとGraphicsWindow.KeyDownイベントでSpaceキーを捉えてくれない。Silverlight上では大丈夫なんやけど・・・。ボタンコントロールにフォーカスがある場合はSpaceキーかEnterキーでクリックと同じ働きをしてくれるけど、これが影響してるのかも。Spaceキーは、良く使うから早く直って欲しいなぁ。
VBもそうやけど、文字をグラフィックとして描画するとき、文字の色を[PenColor]で背景色を[BrushColor]で指定できるようにするべきだと思う。この方が自然やもん。

参考文献

ウェブ サイト
Microsoft Small Basicのサンプルとリファレンス
Wikipediaの「ライフゲーム」の項
[Top(T)][Index(X)][Back(B)]