首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C語言實現康威生命遊戲:基於EasyX圖形庫的可視化演示

     編輯:關於C

前言

康威生命遊戲 是細胞自動機的經典案例:二維網格上,每個細胞依據鄰居存活數(8鄰域)在下一代生死演化。本文提供基於 Windows EasyX 圖形庫的完整可視化實現,支援速度調節、暫停/單步、預設圖樣/隨機初始化、邊界環狀處理。

一、核心規則

  • 存活細胞:鄰居 2 或 3 → 存活;<2 孤獨死;>3 擁擠死。
  • 死亡細胞:鄰居恰好 3 → 誕生。
  • 邊界策略:本實現採用固定邊界(邊緣細胞鄰居較少),也可改為環狀邊界(模運算)。

二、資料結構與全域狀態


#include 
#include 
#include 

#define WORLD_W 100
#define WORLD_H 100
#define CELL_SIZE 4

// 世界狀態:0=死,1=活。邊界各加1圈作哨兵,避免越界判斷
__int8 world[WORLD_H + 2][WORLD_W + 2] = {0};

IMAGE imgLive, imgDead; // 活/死細胞圖塊

三、核心演化邏輯 Evolution()


void Evolution() {
    __int8 next[WORLD_H + 2][WORLD_W + 2] = {0};
    for (int y = 1; y <= WORLD_H; y++) {
        for (int x = 1; x <= WORLD_W; x++) {
            // 計算 8 鄰域存活數
            int sum = world[y-1][x-1] + world[y-1][x] + world[y-1][x+1]
                    + world[y][x-1]                 + world[y][x+1]
                    + world[y+1][x-1] + world[y+1][x] + world[y+1][x+1];

            // 生命規則
            if (sum == 3) next[y][x] = 1;           // 誕生
            else if (sum == 2) next[y][x] = world[y][x]; // 保持
            else next[y][x] = 0;                    // 死亡
        }
    }
    memcpy(world, next, sizeof(world)); // 更新世代
}

四、圖形渲染 PaintWorld()


void PaintWorld() {
    for (int y = 1; y <= WORLD_H; y++)
        for (int x = 1; x <= WORLD_W; x++)
            putimage(16 + x * CELL_SIZE, 56 + y * CELL_SIZE,
                     world[y][x] ? &imgLive : &imgDead);
}

五、初始化與互動主迴圈


void Init() {
    initgraph(640, 480);
    srand((unsigned)time(NULL));
    // 建立 4x4 像素圖塊
    Resize(&imgLive, CELL_SIZE, CELL_SIZE);
    SetWorkingImage(&imgLive);
    setcolor(GREEN); setfillstyle(GREEN); fillellipse(0,0,3,3); // 綠圓=活
    SetWorkingImage(&imgDead);
    setcolor(DARKGRAY); rectangle(1,1,2,2); // 灰框=死
    SetWorkingImage(NULL);
    // 文字說明、預設圖樣...
    SquareWorld(); // 預設方形邊框圖樣
}

int main() {
    Init();
    int speed = 500; // ms/幀
    while (1) {
        if (kbhit() || speed == 900) { // 900=單步模式
            char c = getch();
            if (c == ' ') c = getch(); // 空格暫停/繼續
            if (c >= '0' && c <= '9') speed = ('9' - c) * 100; // 0-9調速
            switch (c) {
                case 's': case 'S': SquareWorld(); break; // 方形邊框
                case 'r': case 'R': RandWorld(); break;   // 隨機
                case 27: goto END; // ESC退出
            }
        }
        Evolution();
        PaintWorld();
        if (speed != 900) Sleep(speed);
    }
END:
    closegraph();
    return 0;
}

六、預設圖樣生成


void SquareWorld() { // 邊框存活
    memset(world, 0, sizeof(world));
    for (int x = 1; x <= WORLD_W; x++) world[x][1] = world[x][WORLD_H] = 1;
    for (int y = 1; y <= WORLD_H; y++) world[1][y] = world[WORLD_W][y] = 1;
}
void RandWorld() { // 50% 隨機
    for (int x = 1; x <= WORLD_W; x++)
        for (int y = 1; y <= WORLD_H; y++)
            world[x][y] = rand() % 2;
}

七、效果展示

生命遊戲運行截圖

綠色圓點為存活細胞,灰色方框為空白。隨機初始化下可觀察到滑翔機、震盪子、發射器等經典結構自發演化。

八、優化與擴展方向

  • 環狀邊界:索引用 (x+WORLD_W)%WORLD_W 實現環面拓撲。
  • 哈希生命:用 QuadTree + 快取實現 O(log n) 大尺度高速演化。
  • 跨平台:移植至 SDL2、SFML、raylib、WebAssembly (Emscripten)。
  • 交互編輯:滑鼠點擊切換細胞狀態,支援圖樣庫載入(RLE格式)。

九、總結

生命遊戲以極簡規則產生無窮複雜行為,是細胞自動機、複雜系統、涌現現象的完美切入點。本 EasyX 版本代碼精簡、視覺直觀,適合教學演示、算法實驗、課程設計。歡迎 Fork 擴展!

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved