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つのボードを用意します。
- Current Board: 現在の世代の状態(読み取り専用として扱う)
- 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つの基本ルール
- 過疎 (Underpopulation): 生存セルの隣接生存数が2未満 → 死滅
- 生存 (Survival): 生存セルの隣接生存数が2または3 → 生存
- 過密 (Overpopulation): 生存セルの隣接生存数が3より多い → 死滅
- 誕生 (Reproduction): 死滅セルの隣接生存数がちょうど3 → 誕生
関連トピック
ライフゲームの奥深い世界をさらに知りたい方のための記事です。
よくある質問 (FAQ)
Q. ペンが盤面の外に出ようとしたら?
A. その操作は無視され、ペンは境界線上で止まるべきです。盤面の外に描画することはできません。
Q. メモリ確保に失敗したら?
A. これまでに確保したすべてのメモリを適切に解放(free)してから、エラーメッセージを出力して終了する必要があります。
Q. 実行例のスムーズな入力方法は?
A. echo コマンドを使ってパイプラインで渡すのが便利です。
bash
# 5x5の盤面で、's', 'd', 'x' などのコマンドを渡す
echo "sdxddssaaww" | ./life 5 5 10参考リンク
- Play Game of Life - ブラウザで動くライフゲーム
- Wikipedia - ライフゲーム