라이프 게임

Conway's Game of Life

살아있음/죽어있음 두 상태와 이웃 수 규칙만으로 스스로 움직이고 번식하는 패턴이 나타나는 셀룰러 오토마타. 수학자 John Conway가 1970년 고안했습니다.

다른 이름: Conway’s Game of LifeCellular automaton
···
js
const c = document.createElement('canvas');
document.body.appendChild(c);
c.style.width = '100%'; c.style.height = '100%';
const ctx = c.getContext('2d');
const cs = getComputedStyle(document.documentElement);
const ACCENT = cs.getPropertyValue('--accent').trim() || '#5b5bf7';
let w, h, cols, rows, cell = 9, grid;
function seed() {
  grid = new Uint8Array(cols * rows);
  for (let i = 0; i < grid.length; i++) grid[i] = Math.random() < 0.28 ? 1 : 0;
}
function resize() {
  const dpr = Math.min(devicePixelRatio || 1, 2);
  w = innerWidth; h = innerHeight;
  c.width = w * dpr; c.height = h * dpr;
  ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
  cols = Math.floor(w / cell); rows = Math.floor(h / cell);
  seed();
}
addEventListener('resize', resize);
resize();

function at(x, y) { return grid[((y + rows) % rows) * cols + ((x + cols) % cols)]; }
function step() {
  const next = new Uint8Array(cols * rows);
  for (let y = 0; y < rows; y++) for (let x = 0; x < cols; x++) {
    let n = 0;
    for (let dy = -1; dy <= 1; dy++) for (let dx = -1; dx <= 1; dx++) { if (dx || dy) n += at(x + dx, y + dy); }
    const alive = at(x, y);
    next[y * cols + x] = alive ? (n === 2 || n === 3 ? 1 : 0) : (n === 3 ? 1 : 0);
  }
  grid = next;
}
function draw() {
  ctx.fillStyle = '#0d0d12'; ctx.fillRect(0, 0, w, h);
  ctx.fillStyle = ACCENT;
  for (let y = 0; y < rows; y++) for (let x = 0; x < cols; x++) if (grid[y * cols + x]) ctx.fillRect(x * cell, y * cell, cell - 1.5, cell - 1.5);
}
draw();
let last = 0, gens = 0;
(function loop(t) {
  if (t - last > 110) {
    step(); draw(); last = t; gens++;
    if (gens > 90) { seed(); gens = 0; } // 패턴이 안정되면 다시 무작위로
  }
  requestAnimationFrame(loop);
})(0);

격자의 모든 칸은 "살아있다" 또는 "죽어있다" 둘 중 하나이고, 다음 세대의 상태는 오직 주변 8칸 중 살아있는 이웃 수로만 정해집니다. 이웃이 2~3개면 살아있던 칸은 계속 살고, 정확히 3개면 죽어있던 칸도 새로 태어나며, 그 외에는 모두 죽습니다(과밀 또는 고립). 규칙은 이게 전부지만, 이 네 줄짜리 규칙만으로 정지한 패턴, 일정 주기로 깜빡이는 패턴, 심지어 글라이더처럼 격자 위를 영원히 이동하는 패턴까지 나타납니다.

1970년 사이언티픽 아메리칸에 소개되자마자 "생명이란 무엇인가"를 아주 단순한 규칙으로 흉내 낼 수 있다는 점에서 큰 화제가 됐고, 이후 셀룰러 오토마타 연구와 창발(emergence) 개념을 대중에게 알린 계기가 됐습니다. 라이프 게임은 규칙만 있으면 어떤 계산도 수행할 수 있는 튜링 완전(Turing complete)한 시스템이라는 것도 훗날 증명됐습니다.

디자인에서는 규칙 기반으로 계속 변하는 배경 텍스처, 로딩 화면의 장식적 애니메이션, "살아 움직이는 격자" 컨셉의 인터랙션에 씁니다.

언제 쓰나

규칙 기반으로 계속 변하는 배경, 로딩 화면 장식에. 초기 배치를 무작위 대신 알려진 패턴(글라이더 건 등)으로 심으면 특정 움직임을 보장할 수 있습니다.