[PHP]ライフゲームを作る

lifegame

ライフゲームとは数学的なシミュレーションで、次のルールに従ってセルの状態が変化します。

セル(一つのマス)が生きていて周囲に生きているセルが 1 以下(過疎)のときと 4 以上の時(過密)は消滅し、2 か 3 の時は生存します。

また、周囲に生きているセルが 3 つある時、そこに生きているセルが誕生します。

<?php
session_start();

function check_around($cell, $cell_x, $cell_y){
	$count = 0;
	for($y=-1;$y<=1;$y++){
		for($x=-1;$x<=1;$x++){
			if($x == 0 && $y == 0) continue;
			if(
				isset($cell[$cell_x + $x][$cell_y + $y]) &&
				$cell[$cell_x + $x][$cell_y + $y] == 1
			){
				$count++;
			}
		}
	}
	
	$result = 0;
	
	$current = $cell[$cell_x][$cell_y];
	
	if($current == 1 && $count <= 1) $result = 0;
	if($current == 1 && $count >= 4) $result = 0;
	if($current == 1 && ($count == 2 || $count == 3)) $result = 1;
	if($current == 0 && $count == 3) $result = 1;

	return $result;
}

$cell = array();

$size_x = 20;
$size_y = 20;

$reset = (!isset($_SESSION['cell'])) ? true : false;

if($reset === true || empty($_SESSION['cell'])){
	$_SESSION['cell'] = array();
	for($y=0;$y<$size_y;$y++){
		for($x=0;$x<$size_x;$x++){
			$cell[$x][$y] = mt_rand(0,1);
		}
	}
	
	
} else {
	$cell = $_SESSION['cell'];
}

if($reset !== true){
	$next_cell = array();
	for($y=0;$y<$size_y;$y++){
		for($x=0;$x<$size_x;$x++){
			$next_cell[$x][$y] = check_around($cell, $x, $y);
		}
	}
	$cell = $next_cell;
}

$_SESSION['cell'] = $cell;

header("Content-type:text/html;charset=utf-8");

for($y=0;$y<$size_y;$y++){
	for($x=0;$x<$size_x;$x++){
		if($cell[$x][$y] == 0){
			echo "□";
		} else {
			echo "■";
		}
	}
	echo "<br />\n";
}

あまり凝った組み方ではないですが、基本的なルールに従って進行します。
セッションを使っているのでブラウザを閉じるとリセットされ、ページを更新するごとに世代が変わります。
実験はローカルサーバーで行なって下さい。共用サーバーで更新ボタンを連打しないようにお願いします。

本来こういったものはタイマーで画面が書き換わるタイプの言語で組むのが一般的ですが、PHP で組むと、訪問者があるごとに世代を進行させたり、アクセス毎に餌のようなものを加えてみる等の処理ができて面白いのかもしれません。

Javascript と Canvas の組み合わせでリアルタイムで動作するタイプはこちらの記事で解説しています。

密集の度合いに応じて色を付けてみるのもなかなか綺麗です。

life