コンソール画面にテキストアニメーションを表示するライフゲームを紹介します。
・誕生 : 以下の ○ に生命体が無い場合、周りAに存在する生命体が3個の場合、次世代に新たに ○ に生命体を誕生させます。
・生存 : 以下の * に生命体がある場合、周りBに存在する生命体が2個または3個の場合、次世代にその生命体は生存します。
・消滅 : 以下の * に生命体がある場合、周りBに存在する生命体が1個以下、または4個以上の場合、次世代にその生命体は消滅します。
AAA BBB
A○A B*B
AAA BBB
プログラムの初期状態は、以下の配置です。
**
**
*
▶ Run ボタンで実行してください。
400ステップで、実行は終了します。
実行結果は、80 x 25 文字サイズのテキストコンソールに出力されます。
var x, y;
var step = 0;
var maxstep = 400;
var bmx = 79;
var bmy = 23;
var b = new Array();
for(x = 0; x < bmx+2; ++ x) {
b[x] = new Array();
for(y = 0; y < bmy+2; ++ y) {
b[x][y] = 0;
}
}
b[40][14] = 3;
b[40][15] = 3;
b[40][16] = 3;
b[41][14] = 3;
b[39][15] = 3;
jscsetintervalid = setInterval(function() {
++ step;
outputboard();
nextstep();
if(step >= maxstep) {
clearInterval(jscsetintervalid);
jscsetintervalid = null;
}
}, 10);
function countalive(x, y) {
var cal = 0;
if(b[x-1][y-1] > 1) cal ++;
if(b[x-1][y] > 1) cal ++;
if(b[x-1][y+1] > 1) cal ++;
if(b[x][y-1] > 1) cal ++;
if(b[x][y+1] > 1) cal ++;
if(b[x+1][y-1] > 1) cal ++;
if(b[x+1][y] > 1) cal ++;
if(b[x+1][y+1] > 1) cal ++;
return cal;
}
function nextstep() {
var x, y;
var cal;
for(y = 1; y <= bmy; y++) {
for(x = 1; x <= bmx; x++) {
cal = countalive(x, y);
if(b[x][y] == 0) {
if(cal == 3) b[x][y] = 1;
} else if(b[x][y] == 3) {
if(cal < 2) b[x][y] = 2;
if(cal > 3) b[x][y] = 2;
}
}
}
for(y = 1; y <= bmy; y++) {
for(x = 1; x <= bmx; x++) {
if(b[x][y] == 1) b[x][y] = 3;
if(b[x][y] == 2) b[x][y] = 0;
}
}
}
function outputboard() {
var x, y;
var str;
jsccursorx = 0;
jsccursory = 0;
for(y = 1; y <= bmy; ++ y) {
str = "";
for(x = 1; x <= bmx; ++ x) {
if(b[x][y] == 0) {
str = str + ' ';
} else {
str = str + '*';
}
}
console.log(str);
}
console.log("Step : " + step);
}