Skip to content

Exam05: Life (Lv2)

Conwayのライフゲーム(Game of Life)をC言語で実装するシミュレーション課題です。

課題概要

この課題のゴールは、標準入力からペンの動き(コマンド)を受け取って初期盤面を作成し、指定された回数だけライフゲームの世代交代をシミュレートする life プログラムを作成することです。

  • 実行形式: ./life [width] [height] [iterations]
  • 入力: 標準入力から w, a, s, d (移動), x (描画切り替え) を受け取る。
  • 出力: 最終的な盤面の状態(0: 生存, (スペース): 死滅)。

主要技術の深掘り

データ構造

盤面を管理するために、以下の構造体を使用すると効率的です。

c
typedef struct {
    int width;    // ボードの幅
    int height;   // ボードの高さ
    char **cells; // セルの2次元配列 ('0' or ' ')
} Board;

初期化時の「ペン」の状態管理には以下のような構造体が役立ちます。

c
typedef struct {
    int x;          // 現在のペンのX座標
    int y;          // 現在のペンのY座標
    int is_drawing; // 描画モード (0: OFF, 1: ON)
} PenState;

ダブルバッファリング

ライフゲームの実装において重要なテクニックが「ダブルバッファリング」です。 全セルの状態は「同時に」更新される必要があります。あるセルの更新が、その隣のセルの次世代判定に(同世代中に)影響してはいけません。

そのため、以下の2つのボードを用意します。

  1. Current Board: 現在の世代の状態(読み取り専用として扱う)
  2. Next Board: 次の世代の状態を書き込むためのバッファ
c
// 擬似コード
for (each generation) {
    calculate_next_state(from: current, to: next);
    swap(current, next); // または内容をコピー
}

ロジックの可視化

プログラム実行フロー

コラム・読み物

Game of Life は、1970年にイギリスの数学者ジョン・ホートン・コンウェイ(John Horton Conway)によって考案されました。「セル・オートマトン」の一種であり、単純なルールから複雑な挙動が生まれる「創発(Emergence)」の例として有名です。

4つの基本ルール

  1. 過疎 (Underpopulation): 生存セルの隣接生存数が2未満 → 死滅
  2. 生存 (Survival): 生存セルの隣接生存数が2または3 → 生存
  3. 過密 (Overpopulation): 生存セルの隣接生存数が3より多い → 死滅
  4. 誕生 (Reproduction): 死滅セルの隣接生存数がちょうど3 → 誕生

関連トピック

ライフゲームの奥深い世界をさらに知りたい方のための記事です。

よくある質問 (FAQ)

Q. ペンが盤面の外に出ようとしたら?

A. その操作は無視され、ペンは境界線上で止まるべきです。盤面の外に描画することはできません。

Q. メモリ確保に失敗したら?

A. これまでに確保したすべてのメモリを適切に解放(free)してから、エラーメッセージを出力して終了する必要があります。

Q. 実行例のスムーズな入力方法は?

A. echo コマンドを使ってパイプラインで渡すのが便利です。

bash
# 5x5の盤面で、's', 'd', 'x' などのコマンドを渡す
echo "sdxddssaaww" | ./life 5 5 10

参考リンク