ライフゲーム
有名なセルオートマトンの例であるライフゲームです。P/ECE上では既にたくさんのライフゲームが発表されていますが、気にせずいきましょう。
ライフゲームのルールは、あるセルの周囲8個のセルの中にライフが2個ならば生き死には変わらず、3個ならば誕生、それ以外なら死亡というようにして世代交代していくものです。
プログラムはグラフィック画面の1ピクセルをそのまま1セルに対応させています。次世代の計算用に、グラフィック画面の見えない領域を使っています。セルの活動する領域は上下左右をループするように処理しています。
プログラム
/********************************************************/
/* 初代生成 */
/********************************************************/
for( i = 0; i < 2000; i++ ) {
x = rnd( 128 );
y = rnd( 88 );
pset( x, y, 3 );
}
/********************************************************/
/* メインループ */
/********************************************************/
while( 1 ) {
/* 次世代生成 */
for( y = 0; y < 88; y++ ) {
for( x = 0; x < 128; x++ ) {
/* 周囲の数を数える */
c = 0;
if( point( ( x + 128 - 1 ) % 128, ( y + 88 - 1 ) % 88 ) == 3 ) c++;
if( point( x, ( y + 88 - 1 ) % 88 ) == 3 ) c++;
if( point( ( x + 128 + 1 ) % 128, ( y + 88 - 1 ) % 88 ) == 3 ) c++;
if( point( ( x + 128 - 1 ) % 128, y ) == 3 ) c++;
if( point( ( x + 128 + 1 ) % 128, y ) == 3 ) c++;
if( point( ( x + 128 - 1 ) % 128, ( y + 88 + 1 ) % 88 ) == 3 ) c++;
if( point( x, ( y + 88 + 1 ) % 88 ) == 3 ) c++;
if( point( ( x + 128 + 1 ) % 128, ( y + 88 + 1 ) % 88 ) == 3 ) c++;
if( c == 3 )
pset( x + 128, y, 3 );
else if( c == 2 )
pset( x + 128, y, point( x, y ) );
else
pset( x + 128, y, 0 );
}
}
/* 世代交代 */
for( y = 0; y < 88; y++ ) {
for( x = 0; x < 128; x++ ) {
pset( x, y, point( x + 128, y ) );
}
}
}
ダウンロード
改良案
ライフゲームの楽しみはいろいろな初期配置からパターンが生まれる所にあります。このプログラムでは初期配置を乱数で行っていますが、初期配置を変更してみましょう。
P/ECEのCPUは割と高速なのですが、これだけのセルを計算させるとさすがにもたつきます。しかし、遅くなる原因の一つはグラフィック画面を読み出している所にあります。配列を使用すれば随分と高速化する事が出来ます。